diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.21.0-scylla/.buildinfo b/3.21.0-scylla/.buildinfo new file mode 100644 index 0000000000..6f43ae8505 --- /dev/null +++ b/3.21.0-scylla/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 49c919c90251356cf2a26263f5226198 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/3.21.0-scylla/.doctrees/CHANGELOG.doctree b/3.21.0-scylla/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..1a83cfdd09 Binary files /dev/null and b/3.21.0-scylla/.doctrees/CHANGELOG.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra.doctree b/3.21.0-scylla/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..ab21e1bd68 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/auth.doctree b/3.21.0-scylla/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..3fee5a33b7 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/auth.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cluster.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..321385f844 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cluster.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/concurrent.doctree b/3.21.0-scylla/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..f7fe8e9627 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/connection.doctree b/3.21.0-scylla/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..b6d5085175 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/connection.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..54fb75fa1d Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..a14f6afc7d Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/management.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..fce63687d3 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/models.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..7460ccf0ff Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/query.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..6ee5a72d73 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..9b0ed2b5a5 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..51bd41cd79 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..94c2893c7b Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..56f48be3f9 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..b96d67f7ef Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/decoder.doctree b/3.21.0-scylla/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..47a0e5ba1d Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/decoder.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/encoder.doctree b/3.21.0-scylla/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..3f2bef1c61 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/encoder.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/graph.doctree b/3.21.0-scylla/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..b18e706825 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/graph.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree b/3.21.0-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..5497132056 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree b/3.21.0-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..dab6549231 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree b/3.21.0-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..4e7c813524 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/io/geventreactor.doctree b/3.21.0-scylla/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..cfb2b18b3b Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/io/libevreactor.doctree b/3.21.0-scylla/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..167566c361 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree b/3.21.0-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..3e020f432a Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/metadata.doctree b/3.21.0-scylla/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..a4342d2c28 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/metadata.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/metrics.doctree b/3.21.0-scylla/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..9ac1d5e8ff Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/metrics.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/policies.doctree b/3.21.0-scylla/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..8913aa381e Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/policies.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/pool.doctree b/3.21.0-scylla/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..cdf1d54c04 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/pool.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/protocol.doctree b/3.21.0-scylla/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..c6c7e75e22 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/protocol.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/query.doctree b/3.21.0-scylla/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..05d8242606 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/query.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/timestamps.doctree b/3.21.0-scylla/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..ba3f7b9a1f Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/cassandra/util.doctree b/3.21.0-scylla/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..b8b08b8f8d Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/cassandra/util.doctree differ diff --git a/3.21.0-scylla/.doctrees/api/index.doctree b/3.21.0-scylla/.doctrees/api/index.doctree new file mode 100644 index 0000000000..29ce601a28 Binary files /dev/null and b/3.21.0-scylla/.doctrees/api/index.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/batches.doctree b/3.21.0-scylla/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..98da3143df Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/batches.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/connections.doctree b/3.21.0-scylla/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..3927aac6ab Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/connections.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/faq.doctree b/3.21.0-scylla/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..5c1cd06139 Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/faq.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/models.doctree b/3.21.0-scylla/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..893ef710d1 Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/models.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/queryset.doctree b/3.21.0-scylla/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..53aaa325b4 Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/queryset.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/third_party.doctree b/3.21.0-scylla/.doctrees/cqlengine/third_party.doctree new file mode 100644 index 0000000000..d390a6248f Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/third_party.doctree differ diff --git a/3.21.0-scylla/.doctrees/cqlengine/upgrade_guide.doctree b/3.21.0-scylla/.doctrees/cqlengine/upgrade_guide.doctree new file mode 100644 index 0000000000..31721dd65b Binary files /dev/null and b/3.21.0-scylla/.doctrees/cqlengine/upgrade_guide.doctree differ diff --git a/3.21.0-scylla/.doctrees/dates_and_times.doctree b/3.21.0-scylla/.doctrees/dates_and_times.doctree new file mode 100644 index 0000000000..7e2826cb5d Binary files /dev/null and b/3.21.0-scylla/.doctrees/dates_and_times.doctree differ diff --git a/3.21.0-scylla/.doctrees/environment.pickle b/3.21.0-scylla/.doctrees/environment.pickle new file mode 100644 index 0000000000..754241e9da Binary files /dev/null and b/3.21.0-scylla/.doctrees/environment.pickle differ diff --git a/3.21.0-scylla/.doctrees/execution_profiles.doctree b/3.21.0-scylla/.doctrees/execution_profiles.doctree new file mode 100644 index 0000000000..c4c04fafb7 Binary files /dev/null and b/3.21.0-scylla/.doctrees/execution_profiles.doctree differ diff --git a/3.21.0-scylla/.doctrees/faq.doctree b/3.21.0-scylla/.doctrees/faq.doctree new file mode 100644 index 0000000000..02fe01d3af Binary files /dev/null and b/3.21.0-scylla/.doctrees/faq.doctree differ diff --git a/3.21.0-scylla/.doctrees/getting_started.doctree b/3.21.0-scylla/.doctrees/getting_started.doctree new file mode 100644 index 0000000000..225c2a4980 Binary files /dev/null and b/3.21.0-scylla/.doctrees/getting_started.doctree differ diff --git a/3.21.0-scylla/.doctrees/index.doctree b/3.21.0-scylla/.doctrees/index.doctree new file mode 100644 index 0000000000..19d9e32ca2 Binary files /dev/null and b/3.21.0-scylla/.doctrees/index.doctree differ diff --git a/3.21.0-scylla/.doctrees/installation.doctree b/3.21.0-scylla/.doctrees/installation.doctree new file mode 100644 index 0000000000..46ecd85505 Binary files /dev/null and b/3.21.0-scylla/.doctrees/installation.doctree differ diff --git a/3.21.0-scylla/.doctrees/lwt.doctree b/3.21.0-scylla/.doctrees/lwt.doctree new file mode 100644 index 0000000000..8243425eea Binary files /dev/null and b/3.21.0-scylla/.doctrees/lwt.doctree differ diff --git a/3.21.0-scylla/.doctrees/object_mapper.doctree b/3.21.0-scylla/.doctrees/object_mapper.doctree new file mode 100644 index 0000000000..6b16497bf8 Binary files /dev/null and b/3.21.0-scylla/.doctrees/object_mapper.doctree differ diff --git a/3.21.0-scylla/.doctrees/performance.doctree b/3.21.0-scylla/.doctrees/performance.doctree new file mode 100644 index 0000000000..29c2512a59 Binary files /dev/null and b/3.21.0-scylla/.doctrees/performance.doctree differ diff --git a/3.21.0-scylla/.doctrees/query_paging.doctree b/3.21.0-scylla/.doctrees/query_paging.doctree new file mode 100644 index 0000000000..078ac71539 Binary files /dev/null and b/3.21.0-scylla/.doctrees/query_paging.doctree differ diff --git a/3.21.0-scylla/.doctrees/security.doctree b/3.21.0-scylla/.doctrees/security.doctree new file mode 100644 index 0000000000..0176c06d91 Binary files /dev/null and b/3.21.0-scylla/.doctrees/security.doctree differ diff --git a/3.21.0-scylla/.doctrees/upgrading.doctree b/3.21.0-scylla/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..f9044ec534 Binary files /dev/null and b/3.21.0-scylla/.doctrees/upgrading.doctree differ diff --git a/3.21.0-scylla/.doctrees/user_defined_types.doctree b/3.21.0-scylla/.doctrees/user_defined_types.doctree new file mode 100644 index 0000000000..f7be2d69a6 Binary files /dev/null and b/3.21.0-scylla/.doctrees/user_defined_types.doctree differ diff --git a/3.21.0-scylla/.nojekyll b/3.21.0-scylla/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.21.0-scylla/404.html b/3.21.0-scylla/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/3.21.0-scylla/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
+

404

+

The ScyllaDB monster ate your page!

+

+ Home +

+
+ + + \ No newline at end of file diff --git a/3.21.0-scylla/CHANGELOG.html b/3.21.0-scylla/CHANGELOG.html new file mode 100644 index 0000000000..67fbc9224d --- /dev/null +++ b/3.21.0-scylla/CHANGELOG.html @@ -0,0 +1,2786 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ Download +
+
+ +
+
+ Menu +
+
+
+
+
+ + +
+

Caution

+

+ + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

+
+ + + +
+ +
+ +
+

CHANGELOG

+
+

3.22.0

+

UNRELEASED

+
+

Features

+
    +
  • Add all() function to the ResultSet API (PYTHON-1203)

  • +
+
+
+
+

3.21.0

+

January 15, 2020

+
+

Features

+
    +
  • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

  • +
  • Add Python 3.8 support (PYTHON-1189)

  • +
  • Allow passing ssl context for Twisted (PYTHON-1161)

  • +
  • Ssl context and cloud support for Eventlet (PYTHON-1162)

  • +
  • Cloud Twisted support (PYTHON-1163)

  • +
  • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

  • +
  • Flexible version parsing (PYTHON-1174)

  • +
  • Support NULL in collection deserializer (PYTHON-1123)

  • +
  • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

  • +
+
+
+

Bug Fixes

+
    +
  • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

  • +
  • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

  • +
  • asyncio message chunks can be processed discontinuously (PYTHON-1185)

  • +
  • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

  • +
  • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

  • +
  • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

  • +
  • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

  • +
+
+
+

Others

+
    +
  • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

  • +
  • Remove *read_repair_chance table options (PYTHON-1140)

  • +
  • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

  • +
  • Add new DSE CQL keywords (PYTHON-1122)

  • +
  • Publish binary wheel distributions (PYTHON-1013)

  • +
+
+
+

Deprecations

+
    +
  • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

  • +
+

Merged from dse-driver:

+
+
+

Features

+
    +
  • Insights integration (PYTHON-1047)

  • +
  • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

  • +
  • Add NodeSync metadata (PYTHON-799)

  • +
  • Add new NodeSync failure values (PYTHON-934)

  • +
  • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

  • +
  • GraphOptions should show a warning for unknown parameters (PYTHON-819)

  • +
  • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

  • +
  • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

  • +
  • Add graph-results payload option for GraphSON format (PYTHON-773)

  • +
  • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

  • +
  • Implement serializers for the Graph String API (PYTHON-778)

  • +
  • Provide deserializers for GraphSON types (PYTHON-782)

  • +
  • Add Graph DurationType support (PYTHON-607)

  • +
  • Support DSE DateRange type (PYTHON-668)

  • +
  • RLAC CQL output for materialized views (PYTHON-682)

  • +
  • Add Geom Types wkt deserializer

  • +
  • DSE Graph Client timeouts in custom payload (PYTHON-589)

  • +
  • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

  • +
  • Add config profiles to DSE graph execution (PYTHON-570)

  • +
  • DSE Driver version checking (PYTHON-568)

  • +
  • Distinct default timeout for graph queries (PYTHON-477)

  • +
  • Graph result parsing for known types (PYTHON-479,487)

  • +
  • Distinct read/write CL for graph execution (PYTHON-509)

  • +
  • Target graph analytics query to spark master when available (PYTHON-510)

  • +
+
+
+

Bug Fixes

+
    +
  • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

  • +
  • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

  • +
  • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

  • +
  • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

  • +
  • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

  • +
  • Update date serialization to isoformat in graph (PYTHON-805)

  • +
  • DateRange Parse Error (PYTHON-729)

  • +
  • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

  • +
  • metadata.get_host returning None unexpectedly (PYTHON-709)

  • +
  • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

  • +
  • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

  • +
  • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

  • +
  • Correctly handle other types in geo type equality (PYTHON-508)

  • +
+
+
+

Other

+
    +
  • Add tests around cqlengine and continuous paging (PYTHON-872)

  • +
  • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

  • +
  • Write documentation examples for DSE 2.0 features (PYTHON-732)

  • +
  • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

  • +
+
+
+
+

3.20.2

+

November 19, 2019

+
+

Bug Fixes

+
    +
  • Fix import error for old python installation without SSLContext (PYTHON-1183)

  • +
+
+
+
+

3.20.1

+

November 6, 2019

+
+

Bug Fixes

+
    +
  • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

  • +
+
+
+
+

3.20.0

+

October 28, 2019

+
+

Features

+
    +
  • DataStax Apollo Support (PYTHON-1074)

  • +
  • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

  • +
+
+
+

Bug Fixes

+
    +
  • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

  • +
  • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

  • +
  • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

  • +
+
+
+
+

3.19.0

+

August 26, 2019

+
+

Features

+
    +
  • Add Python 3.7 support (PYTHON-1016)

  • +
  • Future-proof Mapping imports (PYTHON-1023)

  • +
  • Include param values in cqlengine logging (PYTHON-1105)

  • +
  • NTS Token Replica Map Generation is slow (PYTHON-622)

  • +
+
+
+

Bug Fixes

+
    +
  • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

  • +
  • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

  • +
  • Fix incorrect metadata for compact counter tables (PYTHON-1100)

  • +
  • Call ConnectionException with correct kwargs (PYTHON-1117)

  • +
  • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

  • +
  • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

  • +
  • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

  • +
+
+
+

Other

+
    +
  • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

  • +
  • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

  • +
+
+
+
+

3.18.0

+

May 27, 2019

+
+

Features

+
    +
  • Abstract Host Connection information (PYTHON-1079)

  • +
  • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

  • +
  • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

  • +
  • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

  • +
+
+
+

Bug Fixes

+
    +
  • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

  • +
  • Accept legacy empty strings as column names (PYTHON-1082)

  • +
  • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

  • +
+
+
+
+

3.17.1

+

May 2, 2019

+
+

Bug Fixes

+
    +
  • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

  • +
+
+
+
+

3.17.0

+

February 19, 2019

+
+

Features

+
    +
  • Send driver name and version in startup message (PYTHON-1068)

  • +
  • Add Cluster ssl_context option to enable SSL (PYTHON-995)

  • +
  • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

  • +
  • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

  • +
  • Add Session.get_execution_profile (PYTHON-932)

  • +
  • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

  • +
+
+
+

Bug Fixes

+
    +
  • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

  • +
  • Serial consistency level is not used (PYTHON-1007)

  • +
+
+
+

Other

+
    +
  • Fail faster on incorrect lz4 import (PYTHON-1042)

  • +
  • Bump Cython dependency version to 0.29 (PYTHON-1036)

  • +
  • Expand Driver SSL Documentation (PYTHON-740)

  • +
+
+
+

Deprecations

+
    +
  • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

  • +
  • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

  • +
+
+
+
+

3.16.0

+

November 12, 2018

+
+

Bug Fixes

+
    +
  • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

  • +
  • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

  • +
  • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

  • +
  • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

  • +
  • Log profile name on attempt to create existing profile (PYTHON-944)

  • +
  • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

  • +
+
+
+

Other

+
    +
  • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

  • +
  • Fix wrong use of ResultSet indexing (PYTHON-1015)

  • +
+
+
+
+

3.15.1

+

September 6, 2018

+
+

Bug Fixes

+
    +
  • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

  • +
+
+
+
+

3.15.0

+

August 30, 2018

+
+

Features

+
    +
  • Parse Virtual Keyspace Metadata (PYTHON-992)

  • +
+
+
+

Bug Fixes

+
    +
  • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

  • +
  • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

  • +
  • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

  • +
  • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

  • +
+
+
+

Other

+
    +
  • Use global variable for libev loops so it can be subclassed (PYTHON-973)

  • +
  • Update SchemaParser for V4 (PYTHON-1006)

  • +
  • Bump Cython dependency version to 0.28 (PYTHON-1012)

  • +
+
+
+
+

3.14.0

+

April 17, 2018

+
+

Features

+
    +
  • Add one() function to the ResultSet API (PYTHON-947)

  • +
  • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

  • +
  • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

  • +
  • Twisted SSL Support (PYTHON-343)

  • +
  • Support IS NOT NULL operator in cqlengine (PYTHON-968)

  • +
+
+
+

Other

+
    +
  • Fix Broken Links in Docs (PYTHON-916)

  • +
  • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

  • +
  • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

  • +
  • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

  • +
  • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

  • +
  • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

  • +
  • Add DSE smoke test to OSS driver tests (PYTHON-894)

  • +
  • Document long compilation times and workarounds (PYTHON-868)

  • +
  • Improve error for batch WriteTimeouts (PYTHON-941)

  • +
  • Deprecate ResultSet indexing (PYTHON-945)

  • +
+
+
+
+

3.13.0

+

January 30, 2018

+
+

Features

+
    +
  • cqlengine: LIKE filter operator (PYTHON-512)

  • +
  • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

  • +
+
+
+

Bug Fixes

+
    +
  • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

  • +
  • Support retry_policy in PreparedStatement (PYTHON-861)

  • +
  • __del__ method in Session is throwing an exception (PYTHON-813)

  • +
  • LZ4 import issue with recent versions (PYTHON-897)

  • +
  • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

  • +
  • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

  • +
+
+
+

Other

+
    +
  • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

  • +
  • Fix DeprecationWarning of log.warn (PYTHON-846)

  • +
  • Fix example_mapper.py for python3 (PYTHON-860)

  • +
  • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

  • +
  • Add some known deprecated warnings for 4.x (PYTHON-877)

  • +
  • Remove copyright dates from copyright notices (PYTHON-863)

  • +
  • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

  • +
  • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

  • +
  • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

  • +
  • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

  • +
+
+
+
+

3.12.0

+

November 6, 2017

+
+

Features

+
    +
  • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

  • +
  • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

  • +
  • WriteType.CDC and VIEW missing (PYTHON-794)

  • +
  • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

  • +
  • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

  • +
  • Include hash of result set metadata in prepared stmt id (PYTHON-808)

  • +
  • Add NO_COMPACT startup option (PYTHON-839)

  • +
  • Add new exception type for CDC (PYTHON-837)

  • +
  • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

  • +
  • Add asyncio reactor (PYTHON-507)

  • +
+
+
+

Bug Fixes

+
    +
  • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

  • +
  • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

  • +
  • Not create two sessions by default in CQLEngine (PYTHON-814)

  • +
  • Bug when subclassing AyncoreConnection (PYTHON-827)

  • +
  • Error at cleanup when closing the asyncore connections (PYTHON-829)

  • +
  • Fix sites where sessions can change during iteration (PYTHON-793)

  • +
  • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

  • +
  • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

  • +
  • Dont set the session keyspace when preparing statements (PYTHON-843)

  • +
  • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

  • +
+
+
+

Other

+
    +
  • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

  • +
  • Bump Cython dependency version to 0.27 (PYTHON-833)

  • +
+
+
+
+

3.11.0

+

July 24, 2017

+
+

Features

+
    +
  • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

  • +
  • Add HostFilterPolicy (PYTHON-761)

  • +
+
+
+

Bug Fixes

+
    +
  • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

  • +
  • Fix asyncore hang on exit (PYTHON-767)

  • +
  • Driver takes several minutes to remove a bad host from session (PYTHON-762)

  • +
  • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

  • +
  • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

  • +
  • request_ids may not be returned to the pool (PYTHON-739)

  • +
  • Fix murmur3 on big-endian systems (PYTHON-653)

  • +
  • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

  • +
  • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

  • +
+
+
+

Other

+
    +
  • Bump Cython dependency version to 0.25.2 (PYTHON-754)

  • +
  • Fix DeprecationWarning when using lz4 (PYTHON-769)

  • +
  • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

  • +
  • Improve upgrade guide for materializing pages (PYTHON-464)

  • +
  • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

  • +
  • Point to DSA Slack, not IRC, in docs index

  • +
+
+
+
+

3.10.0

+

May 24, 2017

+
+

Features

+
    +
  • Add Duration type to cqlengine (PYTHON-750)

  • +
  • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

  • +
  • get_query_trace() contract is ambiguous (PYTHON-196)

  • +
+
+
+

Bug Fixes

+
    +
  • Queries using speculative execution policy timeout prematurely (PYTHON-755)

  • +
  • Fix map where results are not consumed (PYTHON-749)

  • +
  • Driver fails to encode Duration’s with large values (PYTHON-747)

  • +
  • UDT values are not updated correctly in CQLEngine (PYTHON-743)

  • +
  • UDT types are not validated in CQLEngine (PYTHON-742)

  • +
  • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

  • +
  • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

  • +
  • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

  • +
  • Memory grows and doesn’t get removed (PYTHON-720)

  • +
  • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

  • +
  • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

  • +
  • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

  • +
+
+
+

Other

+
    +
  • Update README (PYTHON-746)

  • +
  • Test python versions 3.5 and 3.6 (PYTHON-737)

  • +
  • Docs Warning About Prepare “select *” (PYTHON-626)

  • +
  • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

  • +
  • Example SSL connection code does not verify server certificates (PYTHON-469)

  • +
+
+
+
+

3.9.0

+
+

Features

+
    +
  • cqlengine: remove elements by key from a map (PYTHON-688)

  • +
+
+
+

Bug Fixes

+
    +
  • improve error handling when connecting to non-existent keyspace (PYTHON-665)

  • +
  • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

  • +
  • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

  • +
  • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

  • +
  • race where callback or errback for request may not be called (PYTHON-733)

  • +
  • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

  • +
  • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

  • +
+
+
+

Other

+
    +
  • Connection not closed in example_mapper (PYTHON-723)

  • +
  • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

  • +
+
+
+
+

3.8.1

+

March 16, 2017

+
+

Bug Fixes

+
    +
  • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

  • +
  • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

  • +
  • Fix DecimalType regression (PYTHON-724)

  • +
+
+
+
+

3.8.0

+
+

Features

+
    +
  • Quote index names in metadata CQL generation (PYTHON-616)

  • +
  • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

  • +
  • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

  • +
  • Added cql types to result set (PYTHON-648)

  • +
  • Add __len__ to BatchStatement (PYTHON-650)

  • +
  • Duration Type for Cassandra (PYTHON-655)

  • +
  • Send flags with PREPARE message in v5 (PYTHON-684)

  • +
+
+
+

Bug Fixes

+
    +
  • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

  • +
  • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

  • +
  • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

  • +
  • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

  • +
  • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

  • +
  • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

  • +
  • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

  • +
  • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

  • +
  • Make client timestamps strictly monotonic (PYTHON-676)

  • +
  • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

  • +
+
+
+

Other

+
    +
  • Create a cqlengine doc section explaining None semantics (PYTHON-623)

  • +
  • Resolve warnings in documentation generation (PYTHON-645)

  • +
  • Cython dependency (PYTHON-686)

  • +
  • Drop Support for Python 2.6 (PYTHON-690)

  • +
+
+
+
+

3.7.1

+

October 26, 2016

+
+

Bug Fixes

+
    +
  • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

  • +
+
+
+
+

3.7.0

+

September 13, 2016

+
+

Features

+
    +
  • Add v5 protocol failure map (PYTHON-619)

  • +
  • Don’t return from initial connect on first error (PYTHON-617)

  • +
  • Indicate failed column when deserialization fails (PYTHON-361)

  • +
  • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

  • +
  • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

  • +
  • EC2 Address Resolver (PYTHON-198)

  • +
  • Speculative query retries (PYTHON-218)

  • +
  • Expose paging state in API (PYTHON-200)

  • +
  • Don’t mark host down while one connection is active (PYTHON-498)

  • +
  • Query request size information (PYTHON-284)

  • +
  • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

  • +
  • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

  • +
  • Add beta version native protocol flag (PYTHON-614)

  • +
  • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

  • +
+
+
+

Bug Fixes

+
    +
  • Race when adding a pool while setting keyspace (PYTHON-628)

  • +
  • Update results_metadata when prepared statement is reprepared (PYTHON-621)

  • +
  • CQL Export for Thrift Tables (PYTHON-213)

  • +
  • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

  • +
  • cqlengine: columns are no longer hashable (PYTHON-618)

  • +
  • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

  • +
+
+
+
+

3.6.0

+

August 1, 2016

+
+

Features

+
    +
  • Handle null values in NumpyProtocolHandler (PYTHON-553)

  • +
  • Collect greplin scales stats per cluster (PYTHON-561)

  • +
  • Update mock unit test dependency requirement (PYTHON-591)

  • +
  • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

  • +
  • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

  • +
  • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

  • +
  • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

  • +
  • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

  • +
  • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

  • +
+
+
+

Bug Fixes

+
    +
  • Fix geventreactor with SSL support (PYTHON-600)

  • +
  • Don’t downgrade protocol version if explicitly set (PYTHON-537)

  • +
  • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

  • +
  • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

  • +
  • Libev loop shutdown race (PYTHON-578)

  • +
  • Include aliases in DCT type string (PYTHON-579)

  • +
  • cqlengine: Comparison operators for Columns (PYTHON-595)

  • +
  • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

  • +
  • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

  • +
  • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

  • +
  • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

  • +
  • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

  • +
  • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

  • +
+
+
+
+

3.5.0

+

June 27, 2016

+
+

Features

+
    +
  • Optional Execution Profiles for the core driver (PYTHON-569)

  • +
  • API to get the host metadata associated with the control connection node (PYTHON-583)

  • +
  • Expose CDC option in table metadata CQL (PYTHON-593)

  • +
+
+
+

Bug Fixes

+
    +
  • Clean up Asyncore socket map when fork is detected (PYTHON-577)

  • +
  • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

  • +
+
+
+
+

3.4.1

+

May 26, 2016

+
+

Bug Fixes

+
    +
  • Gevent connection closes on IO timeout (PYTHON-573)

  • +
  • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

  • +
+
+
+
+

3.4.0

+

May 24, 2016

+
+

Features

+
    +
  • Include DSE version and workload in Host data (PYTHON-555)

  • +
  • Add a context manager to Cluster and Session (PYTHON-521)

  • +
  • Better Error Message for Unsupported Protocol Version (PYTHON-157)

  • +
  • Make the error message explicitly state when an error comes from the server (PYTHON-412)

  • +
  • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

  • +
  • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

  • +
  • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

  • +
  • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

  • +
  • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

  • +
  • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

  • +
  • Write docs around working with datetime and timezones (PYTHON-394)

  • +
+
+
+

Bug Fixes

+
    +
  • High CPU utilization when using asyncore event loop (PYTHON-239)

  • +
  • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

  • +
  • Make stress scripts Python 2.6 compatible (PYTHON-434)

  • +
  • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

  • +
  • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

  • +
  • Cluster and Session do not GC after leaving scope (PYTHON-135)

  • +
  • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

  • +
  • Reprepare on_up with many clients causes node overload (PYTHON-556)

  • +
  • None inserted into host map when control connection node is decommissioned (PYTHON-548)

  • +
  • weakref.ref does not accept keyword arguments (github #585)

  • +
+
+
+
+

3.3.0

+

May 2, 2016

+
+

Features

+
    +
  • Add an AddressTranslator interface (PYTHON-69)

  • +
  • New Retry Policy Decision - try next host (PYTHON-285)

  • +
  • Don’t mark host down on timeout (PYTHON-286)

  • +
  • SSL hostname verification (PYTHON-296)

  • +
  • Add C* version to metadata or cluster objects (PYTHON-301)

  • +
  • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

  • +
  • Expose listen_address of node we get ring information from (PYTHON-332)

  • +
  • Use A-record with multiple IPs for contact points (PYTHON-415)

  • +
  • Custom consistency level for populating query traces (PYTHON-435)

  • +
  • Normalize Server Exception Types (PYTHON-443)

  • +
  • Propagate exception message when DDL schema agreement fails (PYTHON-444)

  • +
  • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

  • +
+
+
+

Bug Fixes

+
    +
  • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

  • +
  • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

  • +
  • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

  • +
  • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

  • +
  • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

  • +
  • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

  • +
+
+
+
+

3.2.2

+

April 19, 2016

+
    +
  • Fix counter save-after-no-update (PYTHON-547)

  • +
+
+
+

3.2.1

+

April 13, 2016

+
    +
  • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

  • +
+
+
+

3.2.0

+

April 12, 2016

+
+

Features

+
    +
  • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

  • +
  • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

  • +
  • cqlengine: support non-equal conditions for LWT (PYTHON-528)

  • +
  • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

  • +
  • cqlengine: token-aware routing for mapper statements (PYTHON-535)

  • +
+
+
+

Bug Fixes

+
    +
  • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

  • +
  • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

  • +
  • comparing models with datetime fields fail #79 (PYTHON-273)

  • +
  • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

  • +
  • db_field is not always respected with UpdateStatement (PYTHON-530)

  • +
  • Sync_table fails on column.Set with secondary index (PYTHON-533)

  • +
+
+
+
+

3.1.1

+

March 14, 2016

+
+

Bug Fixes

+
    +
  • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

  • +
+
+
+
+

3.1.0

+

March 10, 2016

+
+

Features

+
    +
  • Pass name of server auth class to AuthProvider (PYTHON-454)

  • +
  • Surface schema agreed flag for DDL statements (PYTHON-458)

  • +
  • Automatically convert float and int to Decimal on serialization (PYTHON-468)

  • +
  • Eventlet Reactor IO improvement (PYTHON-495)

  • +
  • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

  • +
  • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

  • +
  • Add Session.default_serial_consistency_level (github #510)

  • +
  • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

  • +
  • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

  • +
  • cqlengine: Add DISTINCT query operator (PYTHON-266)

  • +
  • cqlengine: Tuple cqlengine api (PYTHON-306)

  • +
  • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

  • +
  • cqlengine: Allow nested container types (PYTHON-478)

  • +
  • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

  • +
  • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

  • +
  • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

  • +
+
+
+

Bug Fixes

+
    +
  • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

  • +
  • Overflow when decoding large collections (cython) (PYTHON-459)

  • +
  • Timer heap comparison issue with Python 3 (github #466)

  • +
  • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

  • +
  • Decode error encountered when cython deserializing large map results (PYTHON-459)

  • +
  • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

  • +
  • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

  • +
  • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

  • +
  • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

  • +
  • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

  • +
  • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

  • +
  • cqlengine: db_field breaks UserType (PYTHON-346)

  • +
  • cqlengine: UDT badly quoted (PYTHON-347)

  • +
  • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

  • +
  • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

  • +
  • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

  • +
  • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

  • +
  • cqlengine: Better error for management functions when no connection set (PYTHON-451)

  • +
  • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

  • +
  • cqlengine: Fix inserting None for model save (PYTHON-475)

  • +
  • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

  • +
  • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

  • +
  • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

  • +
+
+
+

Other

+
    +
  • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

  • +
  • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

  • +
+
+
+
+

3.0.0

+

November 24, 2015

+
+

Features

+
    +
  • Support datetime.date objects as a DateType (PYTHON-212)

  • +
  • Add Cluster.update_view_metadata (PYTHON-407)

  • +
  • QueryTrace option to populate partial trace sessions (PYTHON-438)

  • +
  • Attach column names to ResultSet (PYTHON-439)

  • +
  • Change default consistency level to LOCAL_ONE

  • +
+
+
+

Bug Fixes

+
    +
  • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

  • +
  • Evict UDTs from UserType cache on change (PYTHON-226)

  • +
  • Make sure query strings are always encoded UTF-8 (PYTHON-334)

  • +
  • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

  • +
  • UDT CQL encoding does not work for unicode values (PYTHON-353)

  • +
  • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

  • +
  • Cython integer overflow on decimal type deserialization (PYTHON-433)

  • +
  • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

  • +
+
+
+
+

3.0.0rc1

+

November 9, 2015

+
+

Features

+
    +
  • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

  • +
  • Remove deprecated features (PYTHON-292)

  • +
  • Don’t assign trace data to Statements (PYTHON-318)

  • +
  • Normalize results return (PYTHON-368)

  • +
  • Process Materialized View Metadata/Events (PYTHON-371)

  • +
  • Remove blist as soft dependency (PYTHON-385)

  • +
  • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

  • +
  • Normalize CQL query/export in metadata model (PYTHON-405)

  • +
+
+
+

Bug Fixes

+
    +
  • Implementation of named arguments bind is non-pythonic (PYTHON-178)

  • +
  • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

  • +
  • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

  • +
  • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

  • +
  • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

  • +
+
+
+
+

2.7.2

+

September 14, 2015

+
+

Bug Fixes

+
    +
  • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

  • +
  • Remove futures dep. for Python 3 (PYTHON-393)

  • +
  • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

  • +
  • Unit test runtime issues (PYTHON-397,398)

  • +
+
+
+
+

2.7.1

+

August 25, 2015

+
+

Bug Fixes

+
    +
  • Explicitly include extension source files in Manifest

  • +
+
+
+
+

2.7.0

+

August 25, 2015

+

Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

+
+

Features

+
    +
  • General Performance Improvements for Throughput (PYTHON-283)

  • +
  • Improve synchronous request performance with Timers (PYTHON-108)

  • +
  • Enable C Extensions for PyPy Runtime (PYTHON-357)

  • +
  • Refactor SerDes functionality for pluggable interface (PYTHON-313)

  • +
  • Cython SerDes Extension (PYTHON-377)

  • +
  • Accept iterators/generators for execute_concurrent() (PYTHON-123)

  • +
  • cythonize existing modules (PYTHON-342)

  • +
  • Pure Python murmur3 implementation (PYTHON-363)

  • +
  • Make driver tolerant of inconsistent metadata (PYTHON-370)

  • +
+
+
+

Bug Fixes

+
    +
  • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

  • +
  • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

  • +
  • Blocking connect does not use connect_timeout (PYTHON-381)

  • +
  • Properly protect partition key in CQL export (PYTHON-375)

  • +
  • Trigger error callbacks on timeout (PYTHON-294)

  • +
+
+
+
+

2.6.0

+

July 20, 2015

+
+

Bug Fixes

+
    +
  • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

  • +
+
+
+
+

2.6.0c2

+

June 24, 2015

+
+

Features

+
    +
  • Automatic Protocol Version Downgrade (PYTHON-240)

  • +
  • cqlengine Python 2.6 compatibility (PYTHON-288)

  • +
  • Double-dollar string quote UDF body (PYTHON-345)

  • +
  • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

  • +
+
+
+

Bug Fixes

+
    +
  • Avoid stall while connecting to mixed version cluster (PYTHON-303)

  • +
  • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

  • +
  • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

  • +
  • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

  • +
  • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

  • +
+
+
+
+

2.6.0c1

+

June 4, 2015

+

This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

+
+

Features

+
    +
  • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

  • +
  • Configuration option for connection timeout (PYTHON-206)

  • +
  • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

  • +
  • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

  • +
  • Implement new request failure messages in protocol v4+ (PYTHON-238)

  • +
  • Metadata model now maps index meta by index name (PYTHON-241)

  • +
  • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

  • +
  • cqle: add Double column type and remove Float overload (PYTHON-246)

  • +
  • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

  • +
  • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

  • +
  • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

  • +
  • Save trace id even when trace complete times out (PYTHON-302)

  • +
  • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

  • +
  • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

  • +
  • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

  • +
  • Expose CQL keywords in API (PYTHON-324)

  • +
+
+
+

Bug Fixes

+
    +
  • IPv6 address support on Windows (PYTHON-20)

  • +
  • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

  • +
  • cqle: Quote keywords properly in table management functions (PYTHON-244)

  • +
  • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

  • +
  • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

  • +
  • Make protocol read_inet work for Windows (PYTHON-309)

  • +
  • cqle: Correct encoding for nested types (PYTHON-311)

  • +
  • Update list of CQL keywords used quoting identifiers (PYTHON-319)

  • +
  • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

  • +
  • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

  • +
+
+
+
+

2.5.1

+

April 23, 2015

+
+

Bug Fixes

+
    +
  • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

  • +
  • Fix race condition in node/token rebuild (PYTHON-298)

  • +
  • Set and send serial consistency parameter (PYTHON-299)

  • +
+
+
+
+

2.5.0

+

March 30, 2015

+
+

Features

+
    +
  • Integrated cqlengine object mapping package

  • +
  • Utility functions for converting timeuuids and datetime (PYTHON-99)

  • +
  • Schema metadata fetch window randomized, config options added (PYTHON-202)

  • +
  • Support for new Date and Time Cassandra types (PYTHON-190)

  • +
+
+
+

Bug Fixes

+
    +
  • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

  • +
  • Thread exception during GIL cleanup (PYTHON-229)

  • +
  • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

  • +
  • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

  • +
  • Support reading CompositeType data (PYTHON-234)

  • +
  • Preserve float precision in CQL encoding (PYTHON-243)

  • +
+
+
+
+

2.1.4

+

January 26, 2015

+
+

Features

+
    +
  • SaslAuthenticator for Kerberos support (PYTHON-109)

  • +
  • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

  • +
  • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

  • +
  • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

  • +
  • Add eventlet connection support (PYTHON-194)

  • +
+
+
+

Bug Fixes

+
    +
  • Schema meta fix for complex thrift tables (PYTHON-191)

  • +
  • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

  • +
  • Resolve stream ID leak on set_keyspace (PYTHON-195)

  • +
  • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

  • +
  • Resolve stream id collision when using SASL auth (PYTHON-210)

  • +
  • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

  • +
+
+
+
+

2.1.3

+

December 16, 2014

+
+

Features

+
    +
  • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

  • +
  • Avoid connecting to peer with incomplete metadata (PYTHON-163)

  • +
  • Add SSL support to gevent reactor (PYTHON-174)

  • +
  • Use control connection timeout in wait for schema agreement (PYTHON-175)

  • +
  • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

  • +
  • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

  • +
+
+
+

Bug Fixes

+
    +
  • Support large negative timestamps on Windows (PYTHON-119)

  • +
  • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

  • +
  • Retain table metadata following keyspace meta refresh (PYTHON-173)

  • +
  • Use a timeout when preparing a statement for all nodes (PYTHON-179)

  • +
  • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

  • +
  • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

  • +
  • Correct routing key encoding for composite keys (PYTHON-184)

  • +
  • Include compression option in schema export string when disabled (PYTHON-187)

  • +
+
+
+
+

2.1.2

+

October 16, 2014

+
+

Features

+
    +
  • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

  • +
  • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

  • +
  • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

  • +
+
+
+

Bug Fixes

+
    +
  • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

  • +
  • Handle Unauthorized message on schema_triggers query (PYTHON-155)

  • +
  • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

  • +
  • Support CUSTOM index metadata and string export (PYTHON-165)

  • +
+
+
+
+

2.1.1

+

September 11, 2014

+
+

Features

+
    +
  • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

  • +
  • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

  • +
+
+
+

Bug Fixes

+
    +
  • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

  • +
  • Keep timeout for paged results (PYTHON-150)

  • +
+
+
+

Other

+
    +
  • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

  • +
+
+
+
+

2.1.0

+

August 7, 2014

+
+

Bug Fixes

+
    +
  • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

  • +
  • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

  • +
+
+
+
+

2.1.0c1

+

July 25, 2014

+
+

Bug Fixes

+
    +
  • Properly specify UDTs for columns in CREATE TABLE statements

  • +
  • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

  • +
  • Don’t ignore fetch_size arguments to Statement constructors (github-151)

  • +
  • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

  • +
  • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

  • +
  • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

  • +
  • Raise TypeError when a string is used for contact_points (github #164)

  • +
  • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

  • +
+
+
+

Other

+
    +
  • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

  • +
+
+
+
+

2.1.0b1

+

July 11, 2014

+

This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

+
+

Features

+
    +
  • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

  • +
  • Support for user-defined types (Cassandra 2.1+)

  • +
  • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

  • +
  • Protocol-level client-side timestamps (see Session.use_client_timestamp)

  • +
  • Overridable type encoding for non-prepared statements (see Session.encoders)

  • +
  • Configurable serial consistency levels for batch statements

  • +
  • Use io.BytesIO for reduced CPU consumption (github #143)

  • +
  • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

  • +
+
+
+

Bug Fixes

+
    +
  • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

  • +
  • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

  • +
  • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

  • +
  • Don’t share prepared statement lock across Cluster instances

  • +
  • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

  • +
  • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

  • +
  • Properly defunct connections after protocol errors

  • +
  • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

  • +
  • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

  • +
  • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

  • +
  • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

  • +
  • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

  • +
  • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

  • +
  • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

  • +
+
+
+
+

2.0.2

+

June 10, 2014

+
+

Bug Fixes

+
    +
  • Add six to requirements.txt

  • +
  • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

  • +
  • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

  • +
  • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

  • +
  • Add python-six to debian dependencies, move python-blist to recommends

  • +
  • Fix memory leak when libev connections are created and +destroyed (github #93)

  • +
  • Ensure token map is rebuilt when hosts are removed from the cluster

  • +
+
+
+
+

2.0.1

+

May 28, 2014

+
+

Bug Fixes

+
    +
  • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

  • +
+
+
+
+

2.0.0

+

May 28, 2014

+
+

Features

+
    +
  • Make libev C extension Python3-compatible (PYTHON-70)

  • +
  • Support v2 protocol authentication (PYTHON-73, github #125)

  • +
+
+
+

Bug Fixes

+
    +
  • Fix murmur3 C extension compilation under Python3.4 (github #124)

  • +
+
+
+

Merged From 1.x

+
+

Features

+
    +
  • Add Session.default_consistency_level (PYTHON-14)

  • +
+
+
+

Bug Fixes

+
    +
  • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

  • +
  • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

  • +
  • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

  • +
  • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

  • +
  • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

  • +
  • Avoid rebuilding token metadata when cluster topology has not +actually changed

  • +
  • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

  • +
+
+
+

Other

+
    +
  • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

  • +
+
+
+
+
+

2.0.0b1

+

May 6, 2014

+
+

Upgrading from 1.x

+

Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

+

If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

+
+

cluster = Cluster(…, protocol_version=1)

+
+
+
+

Features

+
    +
  • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

  • +
  • Support for Python 3.3 and 3.4

  • +
  • Allow a default query timeout to be set per-Session

  • +
+
+
+

Bug Fixes

+
    +
  • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

  • +
+
+
+

Deprecations

+

The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

+
    +
  • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

  • +
  • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

  • +
  • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

  • +
  • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

  • +
+

Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

+
+
+
+

1.1.2

+

May 8, 2014

+
+

Features

+
    +
  • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

  • +
+
+
+

Bug Fixes

+
    +
  • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

  • +
  • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

  • +
  • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

  • +
  • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

  • +
  • Handle exhausted ReconnectionPolicy schedule correctly

  • +
+
+
+

Other

+
    +
  • Don’t log at ERROR when a connection is closed during the startup +communications

  • +
  • Mke scales, blist optional dependencies

  • +
+
+
+
+

1.1.1

+

April 16, 2014

+
+

Bug Fixes

+
    +
  • Fix unconditional import of nose in setup.py (github #111)

  • +
+
+
+
+

1.1.0

+

April 16, 2014

+
+

Features

+
    +
  • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

  • +
  • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

  • +
  • Add debian packaging (github issue #101)

  • +
  • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

  • +
+
+
+

Bug Fixes

+
    +
  • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

  • +
  • Lowercase boolean literals when generating schemas

  • +
  • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

  • +
  • Don’t reconnect the control connection every time Cluster.connect() is +called

  • +
  • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

  • +
  • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

  • +
  • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

  • +
  • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

  • +
  • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

  • +
+
+
+

Other

+
    +
  • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

  • +
  • Better error message when libevwrapper is not found

  • +
  • Only try to import scales when metrics are enabled (github issue #92)

  • +
  • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

  • +
  • Issue warning log when schema versions do not match

  • +
+
+
+
+

1.0.2

+

March 4, 2014

+
+

Bug Fixes

+
    +
  • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

  • +
  • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

  • +
  • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

  • +
  • Handle latest table options when parsing the schema and generating +CREATE statements.

  • +
  • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

  • +
+
+
+

Other

+
    +
  • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

  • +
  • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

  • +
  • More consistent type checking for query parameters

  • +
  • Add option to a return special object for empty string values for non-string +columns

  • +
+
+
+
+

1.0.1

+

Feb 19, 2014

+
+

Bug Fixes

+
    +
  • Include table indexes in KeyspaceMetadata.export_as_string()

  • +
  • Fix broken token awareness on ByteOrderedPartitioner

  • +
  • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

  • +
  • Handle “custom” types (such as the replaced DateType) correctly

  • +
  • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

  • +
  • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

  • +
  • Handle data that is already utf8-encoded for UTF8Type values

  • +
  • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

  • +
  • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

  • +
+
+
+

Other

+
    +
  • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

  • +
  • Add details about errors and the last queried host to OperationTimedOut

  • +
+
+
+
+

1.0.0 Final

+

Jan 29, 2014

+
+

Bug Fixes

+
    +
  • Prevent leak of Scheduler thread (even with proper shutdown)

  • +
  • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

  • +
  • Hold strong reference to prepared statement while executing it to avoid +garbage collection

  • +
  • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

  • +
  • Fix bad handling of nodes that have been removed from the cluster

  • +
  • Properly escape string types within cql collections

  • +
  • Handle setting the same keyspace twice in a row

  • +
  • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

  • +
  • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

  • +
  • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

  • +
  • Fix endless hanging of some requests when using the libev reactor

  • +
  • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

  • +
  • Generators map to CQL lists, not key sequences

  • +
  • Always defunct connections when an internal operation fails

  • +
  • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

  • +
  • Avoid potential double-erroring of callbacks when a connection +becomes defunct

  • +
+
+
+

Features

+
    +
  • Add default query timeout to Session

  • +
  • Add timeout parameter to Session.execute()

  • +
  • Add WhiteListRoundRobinPolicy as a load balancing policy option

  • +
  • Support for consistency level LOCAL_ONE

  • +
  • Make the backoff for fetching traces exponentially increasing and +configurable

  • +
+
+
+

Other

+
    +
  • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

  • +
  • Add encoder mapping for OrderedDict

  • +
  • Use timeouts on all control connection queries

  • +
  • Benchmark improvements, including command line options and eay +multithreading support

  • +
  • Reduced lock contention when using the asyncore reactor

  • +
  • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

  • +
  • Add requirements.txt and test-requirements.txt

  • +
  • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

  • +
+
+
+
+

1.0.0b7

+

Nov 12, 2013

+

This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

+
+

Features

+
    +
  • Add timeout kwarg to ResponseFuture.result()

  • +
  • Create connection pools to all hosts in parallel when initializing +new Sesssions.

  • +
+
+
+

Bug Fixes

+
    +
  • Properly set exception on ResponseFuture when a query fails +against all hosts

  • +
  • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

  • +
  • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

  • +
  • Better error messages for failed Session.prepare() opertaions

  • +
  • Prepare new statements against all hosts in parallel (formerly +sequential)

  • +
  • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

  • +
  • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

  • +
  • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

  • +
  • Throttle trashing of underutilized connections to avoid trashing newly +created connections

  • +
  • Fix race condition which could result in trashed connections being closed +before the last operations had completed

  • +
  • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

  • +
  • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

  • +
  • Correctly handle large messages through libev

  • +
  • Add timeout to schema agreement check queries

  • +
  • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

  • +
+
+
+

Other

+
    +
  • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

  • +
  • Better debug logging around connection management

  • +
  • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

  • +
+
+
+
+

1.0.0b6

+

Oct 22, 2013

+
+

Bug Fixes

+
    +
  • Use lazy string formatting when logging

  • +
  • Avoid several deadlock scenarios, especially when nodes go down

  • +
  • Avoid trashing newly created connections due to insufficient traffic

  • +
  • Gracefully handle un-handled Exceptions when erroring callbacks

  • +
+
+
+

Other

+
    +
  • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

  • +
+
+
+
+

1.0.0b5

+

Oct 10, 2013

+
+

Features

+
    +
  • SSL support

  • +
+
+
+

Bug Fixes

+
    +
  • Avoid KeyError when building replica map for NetworkTopologyStrategy

  • +
  • Work around python bug which causes deadlock when a thread imports +the utf8 module

  • +
  • Handle no blist library, which is not compatible with pypy

  • +
  • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

  • +
+
+
+

Other

+
    +
  • Switch packaging from Distribute to setuptools, improved C extension +support

  • +
  • Use PEP 386 compliant beta and post-release versions

  • +
+
+
+
+

1.0.0-beta4

+

Sep 24, 2013

+
+

Features

+
    +
  • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

  • +
  • Add cql_version kwarg to Cluster.__init__

  • +
+
+
+

Bug Fixes

+
    +
  • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

  • +
  • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

  • +
+
+
+
+

1.0.0-beta3

+

Sep 20, 2013

+
+

Features

+
    +
  • Support for LZ4 compression (Cassandra 2.0+)

  • +
  • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

  • +
+
+
+

Bug Fixes

+
    +
  • Fix libev include path for CentOS

  • +
  • Fix varint packing of the value 0

  • +
  • Correctly pack unicode values

  • +
  • Don’t attempt to return failed connections to the pool when a final result +is set

  • +
  • Fix bad iteration of connection credentials

  • +
  • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

  • +
  • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

  • +
  • Boolean constants shouldn’t be surrounded by single quotes

  • +
  • Avoid a potential loss of precision on float constants due to string +formatting

  • +
  • Actually utilize non-standard ports set on Cluster objects

  • +
  • Fix export of schema as a set of CQL queries

  • +
+
+
+

Other

+
    +
  • Use cStringIO for connection buffer for better performance

  • +
  • Add __repr__ method for Statement classes

  • +
  • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

  • +
  • Make all tests compatible with Python 2.6

  • +
  • Add 1s timeout for opening new connections

  • +
+
+
+
+

1.0.0-beta2

+

Aug 19, 2013

+
+

Bug Fixes

+
    +
  • Fix pip packaging

  • +
+
+
+
+

1.0.0-beta

+

Aug 16, 2013

+

Initial release

+
+
+ + +
+ + + + + +
+ + +
+
+

+ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

+
+
+ +
+ + + + +
+ + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/CNAME b/3.21.0-scylla/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/3.21.0-scylla/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/3.21.0-scylla/_sources/CHANGELOG.rst.txt b/3.21.0-scylla/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..592a2c0efa --- /dev/null +++ b/3.21.0-scylla/_sources/CHANGELOG.rst.txt @@ -0,0 +1,5 @@ +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/3.21.0-scylla/_sources/api/cassandra.rst.txt b/3.21.0-scylla/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/auth.rst.txt b/3.21.0-scylla/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/cluster.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..71e110559e --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,222 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/3.21.0-scylla/_sources/api/cassandra/concurrent.rst.txt b/3.21.0-scylla/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/3.21.0-scylla/_sources/api/cassandra/connection.rst.txt b/3.21.0-scylla/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/3.21.0-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/3.21.0-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/3.21.0-scylla/_sources/api/cassandra/cqlengine/management.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/3.21.0-scylla/_sources/api/cassandra/cqlengine/models.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/3.21.0-scylla/_sources/api/cassandra/cqlengine/query.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/3.21.0-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt b/3.21.0-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..09f9e4c8fa --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,11 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: Geo + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..285ca5ffc2 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,94 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/decoder.rst.txt b/3.21.0-scylla/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/3.21.0-scylla/_sources/api/cassandra/encoder.rst.txt b/3.21.0-scylla/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/3.21.0-scylla/_sources/api/cassandra/graph.rst.txt b/3.21.0-scylla/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..2211a25d96 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,94 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt b/3.21.0-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt b/3.21.0-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt b/3.21.0-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/io/geventreactor.rst.txt b/3.21.0-scylla/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/io/libevreactor.rst.txt b/3.21.0-scylla/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/3.21.0-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt b/3.21.0-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/3.21.0-scylla/_sources/api/cassandra/metadata.rst.txt b/3.21.0-scylla/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..ed79d04f42 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,76 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica diff --git a/3.21.0-scylla/_sources/api/cassandra/metrics.rst.txt b/3.21.0-scylla/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/policies.rst.txt b/3.21.0-scylla/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/pool.rst.txt b/3.21.0-scylla/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/3.21.0-scylla/_sources/api/cassandra/protocol.rst.txt b/3.21.0-scylla/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/3.21.0-scylla/_sources/api/cassandra/query.rst.txt b/3.21.0-scylla/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/3.21.0-scylla/_sources/api/cassandra/timestamps.rst.txt b/3.21.0-scylla/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..7c7f534aea --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +============================================= + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/3.21.0-scylla/_sources/api/cassandra/util.rst.txt b/3.21.0-scylla/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/3.21.0-scylla/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/3.21.0-scylla/_sources/api/index.rst.txt b/3.21.0-scylla/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/3.21.0-scylla/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/3.21.0-scylla/_sources/cqlengine/batches.rst.txt b/3.21.0-scylla/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/3.21.0-scylla/_sources/cqlengine/connections.rst.txt b/3.21.0-scylla/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/3.21.0-scylla/_sources/cqlengine/faq.rst.txt b/3.21.0-scylla/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/3.21.0-scylla/_sources/cqlengine/models.rst.txt b/3.21.0-scylla/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/3.21.0-scylla/_sources/cqlengine/queryset.rst.txt b/3.21.0-scylla/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/3.21.0-scylla/_sources/cqlengine/third_party.rst.txt b/3.21.0-scylla/_sources/cqlengine/third_party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/third_party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/3.21.0-scylla/_sources/cqlengine/upgrade_guide.rst.txt b/3.21.0-scylla/_sources/cqlengine/upgrade_guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/3.21.0-scylla/_sources/cqlengine/upgrade_guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/3.21.0-scylla/_sources/dates_and_times.rst.txt b/3.21.0-scylla/_sources/dates_and_times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/3.21.0-scylla/_sources/dates_and_times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/3.21.0-scylla/_sources/execution_profiles.rst.txt b/3.21.0-scylla/_sources/execution_profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/3.21.0-scylla/_sources/execution_profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/3.21.0-scylla/_sources/faq.rst.txt b/3.21.0-scylla/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/3.21.0-scylla/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/3.21.0-scylla/_sources/getting_started.rst.txt b/3.21.0-scylla/_sources/getting_started.rst.txt new file mode 100644 index 0000000000..8cb86a5504 --- /dev/null +++ b/3.21.0-scylla/_sources/getting_started.rst.txt @@ -0,0 +1,473 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to Cassandra +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +The simplest way to create a :class:`~.Cluster` is like this: +First, make sure you have the Cassandra driver properly :doc:`installed `. + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +^^^^^^^^^^^^^^^^ +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +^^^^^^^^^^^^^^^^^^^^ +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +^^^^^^^^^^^^^^^^^^^^^ + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/3.21.0-scylla/_sources/index.rst.txt b/3.21.0-scylla/_sources/index.rst.txt new file mode 100644 index 0000000000..3a752975bd --- /dev/null +++ b/3.21.0-scylla/_sources/index.rst.txt @@ -0,0 +1,106 @@ +DataStax Python Driver for Apache Cassandra® +============================================ +A Python client driver for `Apache Cassandra® `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. Cassandra 2.1+ is supported, including DSE 4.7+. + +The driver supports Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +**Note:** DataStax products do not support big-endian systems. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting_started` + A guide through the first steps of connecting to Cassandra and executing queries + +:doc:`execution_profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object_mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query_paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user_defined_types` + Working with Cassandra 2.1's user-defined types + +:doc:`dates_and_times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`cloud` + A guide to connecting to Datastax Apollo + +:doc:`geo_types` + Working with DSE geometry types + +:doc:`graph` + Graph queries with DSE Graph + +:doc:`graph_fluent` + DataStax Graph Fluent API + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting_started + upgrading + execution_profiles + performance + query_paging + lwt + security + user_defined_types + object_mapper + geo_types + graph + graph_fluent + dse_auth + dates_and_times + cloud + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the `mailing list `_. + +Alternatively, you can use the `DataStax Community `_. + +Reporting Issues +---------------- +Please report any bugs and make any feature requests on the +`JIRA `_ issue tracker. + +If you would like to contribute, please feel free to open a pull request. diff --git a/3.21.0-scylla/_sources/installation.rst.txt b/3.21.0-scylla/_sources/installation.rst.txt new file mode 100644 index 0000000000..99a0b8a4cc --- /dev/null +++ b/3.21.0-scylla/_sources/installation.rst.txt @@ -0,0 +1,236 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.21.0". + +.. _installation-datastax-graph: + +(*Optional*) DataStax Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +See :doc:`graph_fluent` for more details about this API. + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/3.21.0-scylla/_sources/lwt.rst.txt b/3.21.0-scylla/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/3.21.0-scylla/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/3.21.0-scylla/_sources/object_mapper.rst.txt b/3.21.0-scylla/_sources/object_mapper.rst.txt new file mode 100644 index 0000000000..50d3cbf320 --- /dev/null +++ b/3.21.0-scylla/_sources/object_mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade_guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third_party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade_guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third_party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/3.21.0-scylla/_sources/performance.rst.txt b/3.21.0-scylla/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/3.21.0-scylla/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/3.21.0-scylla/_sources/query_paging.rst.txt b/3.21.0-scylla/_sources/query_paging.rst.txt new file mode 100644 index 0000000000..2c4a4995ca --- /dev/null +++ b/3.21.0-scylla/_sources/query_paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_stage'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/3.21.0-scylla/_sources/security.rst.txt b/3.21.0-scylla/_sources/security.rst.txt new file mode 100644 index 0000000000..4cf3163fb0 --- /dev/null +++ b/3.21.0-scylla/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1 + + ssl_context = SSLContext(PROTOCOL_TLSv1) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLSv1) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLSv1) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`_ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLSv1`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLSv1, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `_ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/3.21.0-scylla/_sources/upgrading.rst.txt b/3.21.0-scylla/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..9559fa3579 --- /dev/null +++ b/3.21.0-scylla/_sources/upgrading.rst.txt @@ -0,0 +1,388 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Upgrading from dse-driver +------------------------- + +Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes. + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/3.21.0-scylla/_sources/user_defined_types.rst.txt b/3.21.0-scylla/_sources/user_defined_types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/3.21.0-scylla/_sources/user_defined_types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
)") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
)") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
)") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/3.21.0-scylla/_static/basic.css b/3.21.0-scylla/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/3.21.0-scylla/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/3.21.0-scylla/_static/check-solid.svg b/3.21.0-scylla/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/3.21.0-scylla/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.21.0-scylla/_static/clipboard.min.js b/3.21.0-scylla/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/3.21.0-scylla/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/3.21.0-scylla/_static/copybutton.css b/3.21.0-scylla/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/3.21.0-scylla/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/3.21.0-scylla/_static/copybutton.js b/3.21.0-scylla/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/3.21.0-scylla/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/3.21.0-scylla/_static/copybutton_funcs.js b/3.21.0-scylla/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/3.21.0-scylla/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/3.21.0-scylla/_static/css/main.css b/3.21.0-scylla/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/3.21.0-scylla/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/3.21.0-scylla/_static/doctools.js b/3.21.0-scylla/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/3.21.0-scylla/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/3.21.0-scylla/_static/documentation_options.js b/3.21.0-scylla/_static/documentation_options.js new file mode 100644 index 0000000000..49058727ac --- /dev/null +++ b/3.21.0-scylla/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.21.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/3.21.0-scylla/_static/file.png b/3.21.0-scylla/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/3.21.0-scylla/_static/file.png differ diff --git a/3.21.0-scylla/_static/img/banner-background.svg b/3.21.0-scylla/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/3.21.0-scylla/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/favicon-228x228.png b/3.21.0-scylla/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/3.21.0-scylla/_static/img/favicon-228x228.png differ diff --git a/3.21.0-scylla/_static/img/favicon-32x32.png b/3.21.0-scylla/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/3.21.0-scylla/_static/img/favicon-32x32.png differ diff --git a/3.21.0-scylla/_static/img/favicon.ico b/3.21.0-scylla/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/3.21.0-scylla/_static/img/favicon.ico differ diff --git a/3.21.0-scylla/_static/img/icons/icon-about-team.svg b/3.21.0-scylla/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/3.21.0-scylla/_static/img/icons/icon-about-us-m.svg b/3.21.0-scylla/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-about-us.svg b/3.21.0-scylla/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-alternator.svg b/3.21.0-scylla/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-apps.svg b/3.21.0-scylla/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-architecture.svg b/3.21.0-scylla/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/3.21.0-scylla/_static/img/icons/icon-benchmarks.svg b/3.21.0-scylla/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/3.21.0-scylla/_static/img/icons/icon-blog.svg b/3.21.0-scylla/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/3.21.0-scylla/_static/img/icons/icon-careers.svg b/3.21.0-scylla/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/3.21.0-scylla/_static/img/icons/icon-chevron-left.svg b/3.21.0-scylla/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-chevron-right.svg b/3.21.0-scylla/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-circe.svg b/3.21.0-scylla/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-clock.svg b/3.21.0-scylla/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-close.svg b/3.21.0-scylla/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-cloud-docs.svg b/3.21.0-scylla/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-cloud.svg b/3.21.0-scylla/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-comparison.svg b/3.21.0-scylla/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/3.21.0-scylla/_static/img/icons/icon-contact-us.svg b/3.21.0-scylla/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/3.21.0-scylla/_static/img/icons/icon-developers-blog.svg b/3.21.0-scylla/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/3.21.0-scylla/_static/img/icons/icon-docs.svg b/3.21.0-scylla/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/3.21.0-scylla/_static/img/icons/icon-enterprise-m.svg b/3.21.0-scylla/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-enterprise.svg b/3.21.0-scylla/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-events.svg b/3.21.0-scylla/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/3.21.0-scylla/_static/img/icons/icon-exclamation.svg b/3.21.0-scylla/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-expand.svg b/3.21.0-scylla/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-forum.svg b/3.21.0-scylla/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-getting-started.svg b/3.21.0-scylla/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-glossary.svg b/3.21.0-scylla/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-home.svg b/3.21.0-scylla/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-infoworld.svg b/3.21.0-scylla/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/3.21.0-scylla/_static/img/icons/icon-integrations.svg b/3.21.0-scylla/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-knowledge-base.svg b/3.21.0-scylla/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-less.svg b/3.21.0-scylla/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-live-test.svg b/3.21.0-scylla/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/3.21.0-scylla/_static/img/icons/icon-mail-list.svg b/3.21.0-scylla/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-manager.svg b/3.21.0-scylla/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/3.21.0-scylla/_static/img/icons/icon-memory-management.svg b/3.21.0-scylla/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/3.21.0-scylla/_static/img/icons/icon-modeling.svg b/3.21.0-scylla/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-monitoring.svg b/3.21.0-scylla/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/3.21.0-scylla/_static/img/icons/icon-networking.svg b/3.21.0-scylla/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/3.21.0-scylla/_static/img/icons/icon-news.svg b/3.21.0-scylla/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/3.21.0-scylla/_static/img/icons/icon-newsletter.svg b/3.21.0-scylla/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/3.21.0-scylla/_static/img/icons/icon-nsql-guides.svg b/3.21.0-scylla/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/3.21.0-scylla/_static/img/icons/icon-open-source.svg b/3.21.0-scylla/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/3.21.0-scylla/_static/img/icons/icon-operator.svg b/3.21.0-scylla/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-overview.svg b/3.21.0-scylla/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/3.21.0-scylla/_static/img/icons/icon-partners.svg b/3.21.0-scylla/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/3.21.0-scylla/_static/img/icons/icon-plus.svg b/3.21.0-scylla/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-pricing.svg b/3.21.0-scylla/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/3.21.0-scylla/_static/img/icons/icon-release-notes.svg b/3.21.0-scylla/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/3.21.0-scylla/_static/img/icons/icon-resource-center.svg b/3.21.0-scylla/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/3.21.0-scylla/_static/img/icons/icon-roadmap.svg b/3.21.0-scylla/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/3.21.0-scylla/_static/img/icons/icon-search.svg b/3.21.0-scylla/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-slack.svg b/3.21.0-scylla/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-stack-overflow.svg b/3.21.0-scylla/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-summit.svg b/3.21.0-scylla/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/icons/icon-support.svg b/3.21.0-scylla/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/3.21.0-scylla/_static/img/icons/icon-tech-talks.svg b/3.21.0-scylla/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/3.21.0-scylla/_static/img/icons/icon-testing.svg b/3.21.0-scylla/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/3.21.0-scylla/_static/img/icons/icon-thumbs-down.svg b/3.21.0-scylla/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-thumbs-up.svg b/3.21.0-scylla/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.21.0-scylla/_static/img/icons/icon-tip.svg b/3.21.0-scylla/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-training.svg b/3.21.0-scylla/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/3.21.0-scylla/_static/img/icons/icon-triangle-down.svg b/3.21.0-scylla/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-university.svg b/3.21.0-scylla/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/3.21.0-scylla/_static/img/icons/icon-users-blog.svg b/3.21.0-scylla/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/3.21.0-scylla/_static/img/icons/icon-warning.svg b/3.21.0-scylla/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/icons/icon-webinars.svg b/3.21.0-scylla/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/3.21.0-scylla/_static/img/icons/icon-whitepapers.svg b/3.21.0-scylla/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/3.21.0-scylla/_static/img/icons/icon-workshop.svg b/3.21.0-scylla/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/3.21.0-scylla/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/3.21.0-scylla/_static/img/logo-docs.svg b/3.21.0-scylla/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/3.21.0-scylla/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/logo-scylla-horizontal-RGB.svg b/3.21.0-scylla/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/3.21.0-scylla/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.21.0-scylla/_static/img/mascots/404.jpg b/3.21.0-scylla/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/404.jpg differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-3monsters.png b/3.21.0-scylla/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-3monsters.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-advisor-crystal.png b/3.21.0-scylla/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-alternator.svg b/3.21.0-scylla/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/3.21.0-scylla/_static/img/mascots/scylla-cloud.svg b/3.21.0-scylla/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/3.21.0-scylla/_static/img/mascots/scylla-computer-3-monsters.png b/3.21.0-scylla/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-computer-headset.png b/3.21.0-scylla/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-computer-headset.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-cup-number-one.png b/3.21.0-scylla/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-docs.svg b/3.21.0-scylla/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/3.21.0-scylla/_static/img/mascots/scylla-drivers.svg b/3.21.0-scylla/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/3.21.0-scylla/_static/img/mascots/scylla-enterprise.svg b/3.21.0-scylla/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/3.21.0-scylla/_static/img/mascots/scylla-forklift-boxes.png b/3.21.0-scylla/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-forklift-migration.png b/3.21.0-scylla/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-gear.png b/3.21.0-scylla/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-gear.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-hardhat.png b/3.21.0-scylla/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-hardhat.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-headband.png b/3.21.0-scylla/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-headband.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-headset.png b/3.21.0-scylla/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-headset.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-hearts.png b/3.21.0-scylla/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-hearts.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-looking-down.png b/3.21.0-scylla/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-looking-down.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-looking-up.png b/3.21.0-scylla/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-looking-up.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png b/3.21.0-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-magnifying-glass.png b/3.21.0-scylla/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-manager.svg b/3.21.0-scylla/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/3.21.0-scylla/_static/img/mascots/scylla-monitor.svg b/3.21.0-scylla/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/3.21.0-scylla/_static/img/mascots/scylla-movement-fast.png b/3.21.0-scylla/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-movement-fast.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-movement.png b/3.21.0-scylla/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-movement.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-onpremise.png b/3.21.0-scylla/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-onpremise.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-opensource.svg b/3.21.0-scylla/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/3.21.0-scylla/_static/img/mascots/scylla-operator.svg b/3.21.0-scylla/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/3.21.0-scylla/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/3.21.0-scylla/_static/img/mascots/scylla-plugin.png b/3.21.0-scylla/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-plugin.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-release-mascot.png b/3.21.0-scylla/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-release-mascot.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-repair.png b/3.21.0-scylla/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-repair.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-server.png b/3.21.0-scylla/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-server.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-sleeping.png b/3.21.0-scylla/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-sleeping.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-tall-measure.png b/3.21.0-scylla/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-tall-measure.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-university.png b/3.21.0-scylla/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-university.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-weights.png b/3.21.0-scylla/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-weights.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-window-cleaning.png b/3.21.0-scylla/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-with-computer-2.png b/3.21.0-scylla/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-with-computer.png b/3.21.0-scylla/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-with-computer.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-with-linux.png b/3.21.0-scylla/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-with-linux.png differ diff --git a/3.21.0-scylla/_static/img/mascots/scylla-writting.png b/3.21.0-scylla/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/3.21.0-scylla/_static/img/mascots/scylla-writting.png differ diff --git a/3.21.0-scylla/_static/img/menu.svg b/3.21.0-scylla/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/3.21.0-scylla/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.21.0-scylla/_static/js/main.bundle.js b/3.21.0-scylla/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/3.21.0-scylla/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
  • Back
  • ',backButtonPosition:"top",wrapper:"
    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra - Exceptions and Enums

      +
      +
      +cassandra.__version_info__
      +

      The version of the driver in a tuple format

      +
      + +
      +
      +cassandra.__version__
      +

      The version of the driver in a string format

      +
      + +
      +
      +class cassandra.ConsistencyLevel
      +

      Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

      +
      +
      +ANY = 0
      +

      Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

      +
      + +
      +
      +ONE = 1
      +

      Only one replica needs to respond to consider the operation a success

      +
      + +
      +
      +TWO = 2
      +

      Two replicas must respond to consider the operation a success

      +
      + +
      +
      +THREE = 3
      +

      Three replicas must respond to consider the operation a success

      +
      + +
      +
      +QUORUM = 4
      +

      ceil(RF/2) + 1 replicas must respond to consider the operation a success

      +
      + +
      +
      +ALL = 5
      +

      All replicas must respond to consider the operation a success

      +
      + +
      +
      +LOCAL_QUORUM = 6
      +

      Requires a quorum of replicas in the local datacenter

      +
      + +
      +
      +EACH_QUORUM = 7
      +

      Requires a quorum of replicas in each datacenter

      +
      + +
      +
      +SERIAL = 8
      +

      For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

      +
      + +
      +
      +LOCAL_SERIAL = 9
      +

      Like SERIAL, but only requires consensus +among replicas in the local datacenter.

      +
      + +
      +
      +LOCAL_ONE = 10
      +

      Sends a request only to replicas in the local datacenter and waits for +one response.

      +
      + +
      + +
      +
      +class cassandra.ProtocolVersion
      +

      Defines native protocol versions supported by this driver.

      +
      +
      +V1 = 1
      +

      v1, supported in Cassandra 1.2–>2.2

      +
      + +
      +
      +V2 = 2
      +

      v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

      +
      + +
      +
      +V3 = 3
      +

      v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

      +
      + +
      +
      +V4 = 4
      +

      v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

      +
      + +
      +
      +V5 = 5
      +

      v5, in beta from 3.x+. Finalised in 4.0-beta5

      +
      + +
      +
      +V6 = 6
      +

      v6, in beta from 4.0-beta5

      +
      + +
      +
      +DSE_V1 = 65
      +

      DSE private protocol v1, supported in DSE 5.1+

      +
      + +
      +
      +DSE_V2 = 66
      +

      DSE private protocol v2, supported in DSE 6.0+

      +
      + +
      +
      +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
      +

      A tuple of all supported protocol versions

      +
      + +
      +
      +BETA_VERSIONS = (6,)
      +

      A tuple of all beta protocol versions

      +
      + +
      +
      +MIN_SUPPORTED = 1
      +

      Minimum protocol version supported by this driver.

      +
      + +
      +
      +MAX_SUPPORTED = 66
      +

      Maximum protocol version supported by this driver.

      +
      + +
      +
      +classmethod get_lower_supported(previous_version)
      +

      Return the lower supported protocol version. Beta versions are omitted.

      +
      + +
      + +
      +
      +class cassandra.UserFunctionDescriptor(name, argument_types)
      +

      Describes a User function by name and argument signature

      +
      +
      +name = None
      +

      name of the function

      +
      + +
      +
      +argument_types = None
      +

      Ordered list of CQL argument type names comprising the type signature

      +
      + +
      +
      +property signature
      +

      function signature string in the form ‘name([type0[,type1[…]]])’

      +

      can be used to uniquely identify overloaded function names within a keyspace

      +
      + +
      + +
      +
      +class cassandra.UserAggregateDescriptor(name, argument_types)
      +

      Describes a User aggregate function by name and argument signature

      +
      +
      +name = None
      +

      name of the aggregate

      +
      + +
      +
      +argument_types = None
      +

      Ordered list of CQL argument type names comprising the type signature

      +
      + +
      +
      +property signature
      +

      function signature string in the form ‘name([type0[,type1[…]]])’

      +

      can be used to uniquely identify overloaded function names within a keyspace

      +
      + +
      + +
      +
      +exception cassandra.DriverException
      +

      Base for all exceptions explicitly raised by the driver.

      +
      + +
      +
      +exception cassandra.RequestExecutionException
      +

      Base for request execution exceptions returned from the server.

      +
      + +
      +
      +exception cassandra.Unavailable
      +

      There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

      +
      +
      +consistency = None
      +

      The requested ConsistencyLevel

      +
      + +
      +
      +required_replicas = None
      +

      The number of replicas that needed to be live to complete the operation

      +
      + +
      +
      +alive_replicas = None
      +

      The number of replicas that were actually alive

      +
      + +
      + +
      +
      +exception cassandra.Timeout
      +

      Replicas failed to respond to the coordinator node before timing out.

      +
      +
      +consistency = None
      +

      The requested ConsistencyLevel

      +
      + +
      +
      +required_responses = None
      +

      The number of required replica responses

      +
      + +
      +
      +received_responses = None
      +

      The number of replicas that responded before the coordinator timed out +the operation

      +
      + +
      + +
      +
      +exception cassandra.ReadTimeout
      +

      A subclass of Timeout for read operations.

      +

      This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

      +
      +
      +data_retrieved = None
      +

      A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

      +
      + +
      + +
      +
      +exception cassandra.WriteTimeout
      +

      A subclass of Timeout for write operations.

      +

      This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

      +
      +
      +write_type = None
      +

      The type of write operation, enum on WriteType

      +
      + +
      + +
      +
      +exception cassandra.CoordinationFailure
      +

      Replicas sent a failure to the coordinator.

      +
      +
      +consistency = None
      +

      The requested ConsistencyLevel

      +
      + +
      +
      +required_responses = None
      +

      The number of required replica responses

      +
      + +
      +
      +received_responses = None
      +

      The number of replicas that responded before the coordinator timed out +the operation

      +
      + +
      +
      +failures = None
      +

      The number of replicas that sent a failure message

      +
      + +
      +
      +error_code_map = None
      +

      A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

      +
      + +
      + +
      +
      +exception cassandra.ReadFailure
      +

      A subclass of CoordinationFailure for read operations.

      +

      This indicates that the replicas sent a failure message to the coordinator.

      +
      +
      +data_retrieved = None
      +

      A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

      +
      + +
      + +
      +
      +exception cassandra.WriteFailure
      +

      A subclass of CoordinationFailure for write operations.

      +

      This indicates that the replicas sent a failure message to the coordinator.

      +
      +
      +write_type = None
      +

      The type of write operation, enum on WriteType

      +
      + +
      + +
      +
      +exception cassandra.FunctionFailure
      +

      User Defined Function failed during execution

      +
      +
      +keyspace = None
      +

      Keyspace of the function

      +
      + +
      +
      +function = None
      +

      Name of the function

      +
      + +
      +
      +arg_types = None
      +

      List of argument type names of the function

      +
      + +
      + +
      +
      +exception cassandra.RequestValidationException
      +

      Server request validation failed

      +
      + +
      +
      +exception cassandra.ConfigurationException
      +

      Server indicated request errro due to current configuration

      +
      + +
      +
      +exception cassandra.AlreadyExists
      +

      An attempt was made to create a keyspace or table that already exists.

      +
      +
      +keyspace = None
      +

      The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

      +
      + +
      +
      +table = None
      +

      The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

      +
      + +
      + +
      +
      +exception cassandra.InvalidRequest
      +

      A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

      +
      + +
      +
      +exception cassandra.Unauthorized
      +

      The current user is not authorized to perform the requested operation.

      +
      + +
      +
      +exception cassandra.AuthenticationFailed
      +

      Failed to authenticate.

      +
      + +
      +
      +exception cassandra.OperationTimedOut
      +

      The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

      +
      +
      +errors = None
      +

      A dict of errors keyed by the Host against which they occurred.

      +
      + +
      +
      +last_host = None
      +

      The last Host this operation was attempted against.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/auth.html b/3.21.0-scylla/api/cassandra/auth.html new file mode 100644 index 0000000000..649990c733 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/auth.html @@ -0,0 +1,827 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.auth - Authentication

      +
      +
      +class cassandra.auth.AuthProvider
      +

      An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

      +
      +

      New in version 2.0.0.

      +
      +
      +
      +new_authenticator(host)
      +

      Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

      +
      + +
      + +
      +
      +class cassandra.auth.Authenticator
      +

      An abstract class that handles SASL authentication with Cassandra servers.

      +

      Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

      +

      1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

      +

      2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

      +

      3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

      +

      The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

      +
      +

      New in version 2.0.0.

      +
      +
      +
      +server_authenticator_class = None
      +

      Set during the connection AUTHENTICATE phase

      +
      + +
      +
      +initial_response()
      +

      Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

      +
      + +
      +
      +evaluate_challenge(challenge)
      +

      Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

      +
      + +
      +
      +on_authentication_success(token)
      +

      Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

      +
      + +
      + +
      +
      +class cassandra.auth.PlainTextAuthProvider(username, password)
      +

      An AuthProvider that works with Cassandra’s PasswordAuthenticator.

      +

      Example usage:

      +
      from cassandra.cluster import Cluster
      +from cassandra.auth import PlainTextAuthProvider
      +
      +auth_provider = PlainTextAuthProvider(
      +        username='cassandra', password='cassandra')
      +cluster = Cluster(auth_provider=auth_provider)
      +
      +
      +
      +

      New in version 2.0.0.

      +
      +
      +
      +new_authenticator(host)
      +

      Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

      +
      + +
      + +
      +
      +class cassandra.auth.PlainTextAuthenticator(username, password)
      +
      +
      +evaluate_challenge(challenge)
      +

      Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

      +
      + +
      + +
      +
      +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
      +

      An AuthProvider supporting general SASL auth mechanisms

      +

      Suitable for GSSAPI or other SASL mechanisms

      +

      Example usage:

      +
      from cassandra.cluster import Cluster
      +from cassandra.auth import SaslAuthProvider
      +
      +sasl_kwargs = {'service': 'something',
      +               'mechanism': 'GSSAPI',
      +               'qops': 'auth'.split(',')}
      +auth_provider = SaslAuthProvider(**sasl_kwargs)
      +cluster = Cluster(auth_provider=auth_provider)
      +
      +
      +
      +

      New in version 2.1.4.

      +
      +
      +
      +new_authenticator(host)
      +

      Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

      +
      + +
      + +
      +
      +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
      +

      A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

      +
      +

      New in version 2.1.4.

      +
      +
      +
      +initial_response()
      +

      Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

      +
      + +
      +
      +evaluate_challenge(challenge)
      +

      Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cluster.html b/3.21.0-scylla/api/cassandra/cluster.html new file mode 100644 index 0000000000..e3106f876b --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cluster.html @@ -0,0 +1,1876 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cluster - Clusters and Sessions

      +
      +
      +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
      +

      The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

      +

      Example usage:

      +
      >>> from cassandra.cluster import Cluster
      +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
      +>>> session = cluster.connect()
      +>>> session.execute("CREATE KEYSPACE ...")
      +>>> ...
      +>>> cluster.shutdown()
      +
      +
      +

      Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

      +

      executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

      +

      Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

      +
      +
      +contact_points = ['127.0.0.1']
      +
      + +
      +
      +port = 9042
      +
      + +
      +
      +cql_version = None
      +
      + +
      +
      +protocol_version = 66
      +
      + +
      +
      +compression = True
      +
      + +
      +
      +auth_provider
      +

      When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

      +

      When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

      +

      When not using authentication, this should be left as None.

      +
      + +
      +
      +load_balancing_policy
      +

      An instance of policies.LoadBalancingPolicy or +one of its subclasses.

      +
      +

      Changed in version 2.6.0.

      +
      +

      Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

      +

      Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

      +
      + +
      +
      +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
      +
      + +
      +
      +default_retry_policy = <cassandra.policies.RetryPolicy object>
      +

      A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

      +
      + +
      +
      +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
      +
      + +
      +
      +address_translator = <cassandra.policies.IdentityTranslator object>
      +
      + +
      +
      +metrics_enabled = False
      +
      + +
      +
      +metrics = None
      +
      + +
      +
      +ssl_context = None
      +
      + +
      +
      +ssl_options = None
      +
      + +
      +
      +sockopts = None
      +
      + +
      +
      +max_schema_agreement_wait = 10
      +
      + +
      +
      +metadata = None
      +
      + +
      +
      +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
      +
      + +
      +
      +control_connection_timeout = 2.0
      +
      + +
      +
      +idle_heartbeat_interval = 30
      +
      + +
      +
      +idle_heartbeat_timeout = 30
      +
      + +
      +
      +schema_event_refresh_window = 2
      +
      + +
      +
      +topology_event_refresh_window = 10
      +
      + +
      +
      +status_event_refresh_window = 2
      +
      + +
      +
      +prepare_on_all_hosts = True
      +
      + +
      +
      +reprepare_on_up = True
      +
      + +
      +
      +connect_timeout = 5
      +
      + +
      +
      +schema_metadata_enabled = True
      +

      Flag indicating whether internal schema metadata is updated.

      +

      When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

      +
      + +
      +
      +token_metadata_enabled = True
      +

      Flag indicating whether internal token metadata is updated.

      +

      When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

      +
      + +
      +
      +timestamp_generator = None
      +
      + +
      +
      +endpoint_factory = None
      +
      + +
      +
      +cloud = None
      +
      + +
      +
      +connect(keyspace=None, wait_for_all_pools=False)
      +

      Creates and returns a new Session object.

      +

      If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

      +

      wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

      +
      + +
      +
      +shutdown()
      +

      Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

      +

      Once shutdown, a Cluster should not be used for any purpose.

      +
      + +
      +
      +register_user_type(keyspace, user_type, klass)
      +

      Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

      +

      keyspace is the name of the keyspace that the UDT is defined in.

      +

      user_type is the string name of the UDT to register the mapping +for.

      +

      klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

      +

      This method should only be called after the type has been created +within Cassandra.

      +

      Example:

      +
      cluster = Cluster(protocol_version=3)
      +session = cluster.connect()
      +session.set_keyspace('mykeyspace')
      +session.execute("CREATE TYPE address (street text, zipcode int)")
      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
      +
      +# create a class to map to the "address" UDT
      +class Address(object):
      +
      +    def __init__(self, street, zipcode):
      +        self.street = street
      +        self.zipcode = zipcode
      +
      +cluster.register_user_type('mykeyspace', 'address', Address)
      +
      +# insert a row using an instance of Address
      +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
      +                (0, Address("123 Main St.", 78723)))
      +
      +# results will include Address instances
      +results = session.execute("SELECT * FROM users")
      +row = results[0]
      +print row.id, row.location.street, row.location.zipcode
      +
      +
      +
      + +
      +
      +register_listener(listener)
      +

      Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

      +
      + +
      +
      +unregister_listener(listener)
      +

      Removes a registered listener.

      +
      + +
      +
      +add_execution_profile(name, profile, pool_wait_timeout=5)
      +

      Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

      +

      Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

      +

      Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

      +
      + +
      +
      +set_max_requests_per_connection(host_distance, max_requests)
      +

      Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

      +

      Pertains to connection pool management in protocol versions {1,2}.

      +
      + +
      +
      +get_max_requests_per_connection(host_distance)
      +
      + +
      +
      +set_min_requests_per_connection(host_distance, min_requests)
      +

      Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

      +

      Pertains to connection pool management in protocol versions {1,2}.

      +
      + +
      +
      +get_min_requests_per_connection(host_distance)
      +
      + +
      +
      +get_core_connections_per_host(host_distance)
      +

      Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

      +

      This property is ignored if protocol_version is +3 or higher.

      +
      + +
      +
      +set_core_connections_per_host(host_distance, core_connections)
      +

      Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

      +

      Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

      +

      If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

      +
      + +
      +
      +get_max_connections_per_host(host_distance)
      +

      Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

      +

      This property is ignored if protocol_version is +3 or higher.

      +
      + +
      +
      +set_max_connections_per_host(host_distance, max_connections)
      +

      Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

      +

      If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

      +
      + +
      +
      +get_control_connection_host()
      +

      Returns the control connection host metadata.

      +
      + +
      +
      +refresh_schema_metadata(max_schema_agreement_wait=None)
      +

      Synchronously refresh all schema metadata.

      +

      By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

      +

      Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

      +

      Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

      +

      An Exception is raised if schema refresh fails for any reason.

      +
      + +
      +
      +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
      +

      Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

      +

      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

      +
      + +
      +
      +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
      +

      Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

      +

      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

      +
      + +
      +
      +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
      +

      Synchronously refresh user defined type metadata.

      +

      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

      +
      + +
      +
      +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
      +

      Synchronously refresh user defined function metadata.

      +

      function is a cassandra.UserFunctionDescriptor.

      +

      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

      +
      + +
      +
      +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
      +

      Synchronously refresh user defined aggregate metadata.

      +

      aggregate is a cassandra.UserAggregateDescriptor.

      +

      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

      +
      + +
      +
      +refresh_nodes(force_token_rebuild=False)
      +

      Synchronously refresh the node list and token metadata

      +

      force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

      +

      An Exception is raised if node refresh fails for any reason.

      +
      + +
      +
      +set_meta_refresh_enabled(enabled)
      +

      Deprecated: set schema_metadata_enabled token_metadata_enabled instead

      +

      Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

      +

      Disabling this is useful to minimize refreshes during multiple changes.

      +

      Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

      +
      + +
      + +
      +
      +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
      +
      +
      +consistency_level = LOCAL_ONE
      +
      + +
      +
      +static row_factory(colnames, rows)
      +

      Returns each row as a namedtuple. +This is the default row factory.

      +

      Example:

      +
      >>> from cassandra.query import named_tuple_factory
      +>>> session = cluster.connect('mykeyspace')
      +>>> session.row_factory = named_tuple_factory
      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
      +>>> user = rows[0]
      +
      +>>> # you can access field by their name:
      +>>> print "name: %s, age: %d" % (user.name, user.age)
      +name: Bob, age: 42
      +
      +>>> # or you can access fields by their position (like a tuple)
      +>>> name, age = user
      +>>> print "name: %s, age: %d" % (name, age)
      +name: Bob, age: 42
      +>>> name = user[0]
      +>>> age = user[1]
      +>>> print "name: %s, age: %d" % (name, age)
      +name: Bob, age: 42
      +
      +
      +
      +

      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

      +
      +
      + +
      + +
      +
      +cassandra.cluster.EXEC_PROFILE_DEFAULT
      +

      The base class of the class hierarchy.

      +

      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

      +
      + +
      +
      +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
      +

      The base class of the class hierarchy.

      +

      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

      +
      + +
      +
      +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
      +

      The base class of the class hierarchy.

      +

      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

      +
      + +
      +
      +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
      +

      The base class of the class hierarchy.

      +

      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

      +
      + +
      +
      +class cassandra.cluster.Session
      +

      A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

      +

      Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

      +

      Example usage:

      +
      >>> session = cluster.connect()
      +>>> session.set_keyspace("mykeyspace")
      +>>> session.execute("SELECT * FROM mycf")
      +
      +
      +
      +
      +default_timeout = 10.0
      +

      A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

      +

      Setting this to None will cause no timeouts to be set by default.

      +

      Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

      +
      +

      New in version 2.0.0.

      +
      +
      + +
      +
      +default_consistency_level = LOCAL_ONE
      +

      Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

      +
      +

      New in version 1.2.0.

      +
      +
      +

      Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

      +
      +
      + +
      +
      +default_serial_consistency_level = None
      +

      The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

      +

      Only valid for protocol_version >= 2.

      +
      + +
      +
      +row_factory = <function named_tuple_factory>
      +

      The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

      + +
      + +
      +
      +default_fetch_size = 5000
      +
      + +
      +
      +use_client_timestamp = True
      +
      + +
      +
      +timestamp_generator = None
      +
      + +
      +
      +encoder = None
      +
      + +
      +
      +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
      +
      + +
      +
      +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
      +

      Execute the given query and synchronously wait for the response.

      +

      If an error is encountered while executing the query, an Exception +will be raised.

      +

      query may be a query string or an instance of cassandra.query.Statement.

      +

      parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

      +

      timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

      +

      If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

      +

      custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

      +

      execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

      +

      paging_state is an optional paging state, reused from a previous ResultSet.

      +

      host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

      +

      execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

      +
      + +
      +
      +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
      +

      Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

      +

      See Session.execute() for parameter definitions.

      +

      Example usage:

      +
      >>> session = cluster.connect()
      +>>> future = session.execute_async("SELECT * FROM mycf")
      +
      +>>> def log_results(results):
      +...     for row in results:
      +...         log.info("Results: %s", row)
      +
      +>>> def log_error(exc):
      +>>>     log.error("Operation failed: %s", exc)
      +
      +>>> future.add_callbacks(log_results, log_error)
      +
      +
      +

      Async execution with blocking wait for results:

      +
      >>> future = session.execute_async("SELECT * FROM mycf")
      +>>> # do other stuff...
      +
      +>>> try:
      +...     results = future.result()
      +... except Exception:
      +...     log.exception("Operation failed:")
      +
      +
      +
      + +
      +
      +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
      +

      Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

      +

      parameters is dict of named parameters to bind. The values must be +JSON-serializable.

      +

      execution_profile: Selects an execution profile for the request.

      +

      execute_as the user that will be used on the server to execute the request.

      +
      + +
      +
      +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
      +

      Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

      +
      + +
      +
      +prepare(statement)
      +

      Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

      +
      >>> session = cluster.connect("mykeyspace")
      +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
      +>>> prepared = session.prepare(query)
      +>>> session.execute(prepared, (user.id, user.name, user.age))
      +
      +
      +

      Or you may bind values to the prepared statement ahead of time:

      +
      >>> prepared = session.prepare(query)
      +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
      +>>> session.execute(bound_stmt)
      +
      +
      +

      Of course, prepared statements may (and should) be reused:

      +
      >>> prepared = session.prepare(query)
      +>>> for user in users:
      +...     bound = prepared.bind((user.id, user.name, user.age))
      +...     session.execute(bound)
      +
      +
      +

      Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

      +
      >>> analyticskeyspace_prepared = session.prepare(
      +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
      +...     keyspace="analyticskeyspace")  # note the different keyspace
      +
      +
      +

      Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

      +

      custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

      +
      + +
      +
      +shutdown()
      +

      Close all connections. Session instances should not be used +for any purpose after being shutdown.

      +
      + +
      +
      +set_keyspace(keyspace)
      +

      Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

      +
      + +
      +
      +get_execution_profile(name)
      +

      Returns the execution profile associated with the provided name.

      +
      +
      Parameters:
      +

      name – The name (or key) of the execution profile.

      +
      +
      +
      + +
      +
      +execution_profile_clone_update(ep, **kwargs)
      +

      Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

      +

      This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

      +
      + +
      +
      +add_request_init_listener(fn, *args, **kwargs)
      +

      Adds a callback with arguments to be called when any request is created.

      +

      It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

      +

      response_future is the ResponseFuture for the request.

      +

      Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

      +

      See this example in the +source tree for an example.

      +
      + +
      +
      +remove_request_init_listener(fn, *args, **kwargs)
      +

      Removes a callback and arguments from the list.

      +

      See Session.add_request_init_listener().

      +
      + +
      + +
      +
      +class cassandra.cluster.ResponseFuture
      +

      An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

      +
      +
      There are two ways for results to be delivered:
      +
      +
      +
      +
      +query = None
      +
      + +
      +
      +result()
      +

      Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

      +

      Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

      +

      Example usage:

      +
      >>> future = session.execute_async("SELECT * FROM mycf")
      +>>> # do other stuff...
      +
      +>>> try:
      +...     rows = future.result()
      +...     for row in rows:
      +...         ... # process results
      +... except Exception:
      +...     log.exception("Operation failed:")
      +
      +
      +
      + +
      +
      +get_query_trace()
      +

      Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

      +

      Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

      +

      If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

      +

      query_cl is the consistency level used to poll the trace tables.

      +
      + +
      +
      +get_all_query_traces()
      +

      Fetches and returns the query traces for all query pages, if tracing was enabled.

      +

      See note in get_query_trace() regarding possible exceptions.

      +
      + +
      +
      +custom_payload
      +

      The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

      +

      Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

      +
      +
      Returns:
      +

      Custom Payloads.

      +
      +
      +
      + +
      +
      +is_schema_agreed = True
      +
      + +
      +
      +has_more_pages
      +

      Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

      +
      +

      New in version 2.0.0.

      +
      +
      + +
      +
      +warnings
      +

      Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

      +

      Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

      +

      Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

      +
      + +
      +
      +start_fetching_next_page()
      +

      If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

      +

      This should only be called after the first page has been returned.

      +
      +

      New in version 2.0.0.

      +
      +
      + +
      +
      +add_callback(fn, *args, **kwargs)
      +

      Attaches a callback function to be called when the final results arrive.

      +

      By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

      +

      If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

      +

      If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

      +

      Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

      +

      Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

      +

      Usage example:

      +
      >>> session = cluster.connect("mykeyspace")
      +
      +>>> def handle_results(rows, start_time, should_log=False):
      +...     if should_log:
      +...         log.info("Total time: %f", time.time() - start_time)
      +...     ...
      +
      +>>> future = session.execute_async("SELECT * FROM users")
      +>>> future.add_callback(handle_results, time.time(), should_log=True)
      +
      +
      +
      + +
      +
      +add_errback(fn, *args, **kwargs)
      +

      Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

      +
      + +
      +
      +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None)
      +

      A convenient combination of add_callback() and +add_errback().

      +

      Example usage:

      +
      >>> session = cluster.connect()
      +>>> query = "SELECT * FROM mycf"
      +>>> future = session.execute_async(query)
      +
      +>>> def log_results(results, level='debug'):
      +...     for row in results:
      +...         log.log(level, "Result: %s", row)
      +
      +>>> def log_error(exc, query):
      +...     log.error("Query '%s' failed: %s", query, exc)
      +
      +>>> future.add_callbacks(
      +...     callback=log_results, callback_kwargs={'level': 'info'},
      +...     errback=log_error, errback_args=(query,))
      +
      +
      +
      + +
      + +
      +
      +class cassandra.cluster.ResultSet
      +

      An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

      +

      You can treat this as a normal iterator over rows:

      +
      >>> from cassandra.query import SimpleStatement
      +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
      +>>> for user_row in session.execute(statement):
      +...     process_user(user_row)
      +
      +
      +

      Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

      +
      +
      +all()
      +

      Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

      +

      This function is not recommended for queries that return a large number of elements.

      +
      + +
      +
      +property current_rows
      +

      The list of current page rows. May be empty if the result was empty, +or this is the last page.

      +
      + +
      +
      +fetch_next_page()
      +

      Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

      +
      + +
      +
      +get_all_query_traces(max_wait_sec_per=None)
      +

      Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

      +
      + +
      +
      +get_query_trace(max_wait_sec=None)
      +

      Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

      +
      + +
      +
      +property has_more_pages
      +

      True if the last response indicated more pages; False otherwise

      +
      + +
      +
      +one()
      +

      Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

      +
      + +
      +
      +property paging_state
      +

      Server paging state of the query. Can be None if the query was not paged.

      +

      The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

      +
      + +
      +
      +property was_applied
      +

      For LWT results, returns whether the transaction was applied.

      +

      Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

      +

      Only valid when one of the of the internal row factories is in use.

      +
      + +
      + +
      +
      +exception cassandra.cluster.QueryExhausted
      +

      Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

      +
      +

      New in version 2.0.0.

      +
      +
      + +
      +
      +exception cassandra.cluster.NoHostAvailable
      +

      Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

      +
      + +
      +
      +exception cassandra.cluster.UserTypeDoesNotExist
      +

      An attempt was made to use a user-defined type that does not exist.

      +
      +

      New in version 2.1.0.

      +
      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/concurrent.html b/3.21.0-scylla/api/cassandra/concurrent.html new file mode 100644 index 0000000000..95f9a56ab7 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/concurrent.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.concurrent - Utilities for Concurrent Statement Execution

      +
      +
      +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
      +

      Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

      +

      The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

      +

      If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

      +

      results_generator controls how the results are returned.

      +
        +
      • If False, the results are returned only after all requests have completed.

      • +
      • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

      • +
      +

      execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

      +

      A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

      +

      Example usage:

      +
      select_statement = session.prepare("SELECT * FROM users WHERE id=?")
      +
      +statements_and_params = []
      +for user_id in user_ids:
      +    params = (user_id, )
      +    statements_and_params.append((select_statement, params))
      +
      +results = execute_concurrent(
      +    session, statements_and_params, raise_on_first_error=False)
      +
      +for (success, result) in results:
      +    if not success:
      +        handle_error(result)  # result will be an Exception
      +    else:
      +        process_user(result[0])  # result will be a list of rows
      +
      +
      +

      Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

      +
      + +
      +
      +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
      +

      Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

      +

      Example usage:

      +
      statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
      +parameters = [(x,) for x in range(1000)]
      +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
      +
      +
      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/connection.html b/3.21.0-scylla/api/cassandra/connection.html new file mode 100644 index 0000000000..85e6c40611 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/connection.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.connection - Low Level Connection Info

      +
      +
      +exception cassandra.connection.ConnectionException
      +

      An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

      +
      + +
      +
      +exception cassandra.connection.ConnectionShutdown
      +

      Raised when a connection has been marked as defunct or has been closed.

      +
      + +
      +
      +exception cassandra.connection.ConnectionBusy
      +

      An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

      +
      + +
      +
      +exception cassandra.connection.ProtocolError
      +

      Communication did not match the protocol that this driver expects.

      +
      + +
      +
      +class cassandra.connection.EndPoint
      +

      Represents the information to connect to a cassandra node.

      +
      +
      +property address
      +

      The IP address of the node. This is the RPC address the driver uses when connecting to the node

      +
      + +
      +
      +property port
      +

      The port of the node.

      +
      + +
      +
      +resolve()
      +

      Resolve the endpoint to an address/port. This is called +only on socket connection.

      +
      + +
      +
      +property socket_family
      +

      The socket family of the endpoint.

      +
      + +
      +
      +property ssl_options
      +

      SSL options specific to this endpoint.

      +
      + +
      + +
      +
      +class cassandra.connection.EndPointFactory
      +
      +
      +configure(cluster)
      +

      This is called by the cluster during its initialization.

      +
      + +
      +
      +create(row)
      +

      Create an EndPoint from a system.peers row.

      +
      + +
      + +
      +
      +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
      +

      SNI Proxy EndPoint implementation.

      +
      + +
      +
      +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
      +
      + +
      +
      +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
      +

      Unix Socket EndPoint implementation.

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cqlengine/columns.html b/3.21.0-scylla/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..fdfce97aae --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cqlengine/columns.html @@ -0,0 +1,982 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cqlengine.columns - Column types for object mapping models

      +
      +

      Columns

      +

      Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

      +

      Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

      +

      Each column on your model definitions needs to be an instance of a Column class.

      +
      +
      +class cassandra.cqlengine.columns.Column(**kwargs)
      +
      +
      +primary_key = False
      +

      bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

      +
      + +
      +
      +partition_key = False
      +

      indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

      +
      + +
      +
      +index = False
      +

      bool flag, indicates an index should be created for this column

      +
      + +
      +
      +custom_index = False
      +

      bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

      +
      + +
      +
      +db_field = None
      +

      the fieldname this field will map to in the database

      +
      + +
      +
      +default = None
      +

      the default value, can be a value or a callable (no args)

      +
      + +
      +
      +required = False
      +

      boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

      +
      + +
      +
      +clustering_order = None
      +

      only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

      +
      + +
      +
      +discriminator_column = False
      +

      boolean, if set to True, this column will be used for discriminating records +of inherited models.

      +

      Should only be set on a column of an abstract model being used for inheritance.

      +

      There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

      +
      + +
      +
      +static = False
      +

      boolean, if set to True, this is a static column, with a single value per partition

      +
      + +
      + +
      +
      +

      Column Types

      +

      Columns of all types are initialized by passing Column attributes to the constructor by keyword.

      +
      +
      +class cassandra.cqlengine.columns.Ascii(**kwargs)
      +

      Stores a US-ASCII character string

      +
      +
      Parameters:
      +
        +
      • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

      • +
      • max_length (int) – Sets the maximum length of this string, for validation purposes.

      • +
      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.columns.BigInt(**kwargs)
      +

      Stores a 64-bit signed integer value

      +
      + +
      +
      +class cassandra.cqlengine.columns.Blob(**kwargs)
      +

      Stores a raw binary value

      +
      + +
      +
      +cassandra.cqlengine.columns.Bytes
      +

      alias of Blob

      +
      + +
      +
      +class cassandra.cqlengine.columns.Boolean(**kwargs)
      +

      Stores a boolean True or False value

      +
      + +
      +
      +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
      +

      Stores a counter that can be incremented and decremented

      +
      + +
      +
      +class cassandra.cqlengine.columns.Date(**kwargs)
      +

      Stores a simple date, with no time-of-day

      +
      +

      Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

      +
      +

      requires C* 2.2+ and protocol v4+

      +
      + +
      +
      +class cassandra.cqlengine.columns.DateTime(**kwargs)
      +

      Stores a datetime value

      +
      +
      +truncate_microseconds = False
      +

      Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

      +
      DateTime.truncate_microseconds = True
      +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
      +
      +
      +

      Defaults to False to preserve legacy behavior. May change in the future.

      +
      + +
      + +
      +
      +class cassandra.cqlengine.columns.Decimal(**kwargs)
      +

      Stores a variable precision decimal value

      +
      + +
      +
      +class cassandra.cqlengine.columns.Double(**kwargs)
      +

      Stores a double-precision floating-point value

      +
      + +
      +
      +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
      +

      Stores a single-precision floating-point value

      +
      + +
      +
      +class cassandra.cqlengine.columns.Integer(**kwargs)
      +

      Stores a 32-bit signed integer value

      +
      + +
      +
      +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
      +

      Stores a list of ordered values

      +

      http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

      +
      +
      Parameters:
      +

      value_type – a column class indicating the types of the value

      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
      +

      Stores a key -> value map (dictionary)

      +

      https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

      +
      +
      Parameters:
      +
        +
      • key_type – a column class indicating the types of the key

      • +
      • value_type – a column class indicating the types of the value

      • +
      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
      +

      Stores a set of unordered, unique values

      +

      http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

      +
      +
      Parameters:
      +
        +
      • value_type – a column class indicating the types of the value

      • +
      • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

      • +
      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.columns.SmallInt(**kwargs)
      +

      Stores a 16-bit signed integer value

      +
      +

      New in version 2.6.0.

      +
      +

      requires C* 2.2+ and protocol v4+

      +
      + +
      +
      +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
      +

      Stores a UTF-8 encoded string

      +
      +
      Parameters:
      +
        +
      • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

      • +
      • max_length (int) – Sets the maximum length of this string, for validation purposes.

      • +
      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.columns.Time(**kwargs)
      +

      Stores a timezone-naive time-of-day, with nanosecond precision

      +
      +

      New in version 2.6.0.

      +
      +

      requires C* 2.2+ and protocol v4+

      +
      + +
      +
      +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
      +

      UUID containing timestamp

      +
      + +
      +
      +class cassandra.cqlengine.columns.TinyInt(**kwargs)
      +

      Stores an 8-bit signed integer value

      +
      +

      New in version 2.6.0.

      +
      +

      requires C* 2.2+ and protocol v4+

      +
      + +
      +
      +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
      +

      User Defined Type column

      +

      http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

      +

      These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

      +

      Please see User Defined Types for examples and discussion.

      +
      +
      Parameters:
      +

      user_type (type) – specifies the UserType model of the column

      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.columns.UUID(**kwargs)
      +

      Stores a type 1 or 4 UUID

      +
      + +
      +
      +class cassandra.cqlengine.columns.VarInt(**kwargs)
      +

      Stores an arbitrary-precision integer

      +
      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cqlengine/connection.html b/3.21.0-scylla/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..aa3f45f1d7 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cqlengine/connection.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cqlengine.connection - Connection management for cqlengine

      +
      +
      +cassandra.cqlengine.connection.default()
      +

      Configures the default connection to localhost, using the driver defaults +(except for row_factory)

      +
      + +
      +
      +cassandra.cqlengine.connection.set_session(s)
      +

      Configures the default connection with a preexisting cassandra.cluster.Session

      +

      Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

      +
      + +
      +
      +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
      +

      Setup a the driver connection used by the mapper

      +
      +
      Parameters:
      +
        +
      • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

      • +
      • default_keyspace (str) – The default keyspace to use

      • +
      • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

      • +
      • lazy_connect (bool) – True if should not connect until first use

      • +
      • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

      • +
      • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

      • +
      +
      +
      +
      + +
      +
      +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
      +

      Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

      +
      +
      Parameters:
      +
        +
      • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

      • +
      • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

      • +
      • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

      • +
      • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

      • +
      • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

      • +
      • default (bool) – If True, set the new connection as the cqlengine +default

      • +
      • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

      • +
      +
      +
      +
      + +
      +
      +cassandra.cqlengine.connection.unregister_connection(name)
      +
      + +
      +
      +cassandra.cqlengine.connection.set_default_connection(name)
      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cqlengine/management.html b/3.21.0-scylla/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..b8a73505dc --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cqlengine/management.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cqlengine.management - Schema management for cqlengine

      +

      A collection of functions for managing keyspace and table schema.

      +
      +
      +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
      +

      Creates a keyspace with SimpleStrategy for replica placement

      +

      If the keyspace already exists, it will not be modified.

      +

      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

      +

      There are plans to guard schema-modifying functions with an environment-driven conditional.

      +
      +
      Parameters:
      +
        +
      • name (str) – name of keyspace to create

      • +
      • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

      • +
      • durable_writes (bool) – Write log is bypassed if set to False

      • +
      • connections (list) – List of connection names

      • +
      +
      +
      +
      + +
      +
      +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
      +

      Creates a keyspace with NetworkTopologyStrategy for replica placement

      +

      If the keyspace already exists, it will not be modified.

      +

      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

      +

      There are plans to guard schema-modifying functions with an environment-driven conditional.

      +
      +
      Parameters:
      +
        +
      • name (str) – name of keyspace to create

      • +
      • dc_replication_map (dict) – map of dc_names: replication_factor

      • +
      • durable_writes (bool) – Write log is bypassed if set to False

      • +
      • connections (list) – List of connection names

      • +
      +
      +
      +
      + +
      +
      +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
      +

      Drops a keyspace, if it exists.

      +

      There are plans to guard schema-modifying functions with an environment-driven conditional.

      +

      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

      +
      +
      Parameters:
      +
        +
      • name (str) – name of keyspace to drop

      • +
      • connections (list) – List of connection names

      • +
      +
      +
      +
      + +
      +
      +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
      +

      Inspects the model and creates / updates the corresponding table and columns.

      +

      If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

      +

      If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

      +

      Any User Defined Types used in the table are implicitly synchronized.

      +

      This function can only add fields that are not part of the primary key.

      +

      Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

      +

      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

      +

      There are plans to guard schema-modifying functions with an environment-driven conditional.

      +
      + +
      +
      +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
      +

      Inspects the type_model and creates / updates the corresponding type.

      +

      Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

      +

      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

      +

      There are plans to guard schema-modifying functions with an environment-driven conditional.

      +
      + +
      +
      +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
      +

      Drops the table indicated by the model, if it exists.

      +

      If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

      +

      If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

      +

      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

      +

      There are plans to guard schema-modifying functions with an environment-driven conditional.

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cqlengine/models.html b/3.21.0-scylla/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..4e049f4284 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cqlengine/models.html @@ -0,0 +1,962 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cqlengine.models - Table models for object mapping

      +
      +

      Model

      +
      +
      +class cassandra.cqlengine.models.Model(\*\*kwargs)
      +

      The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

      +
      class Person(Model):
      +    id = columns.UUID(primary_key=True)
      +    first_name  = columns.Text()
      +    last_name = columns.Text()
      +
      +person = Person(first_name='Blake', last_name='Eggleston')
      +person.first_name  #returns 'Blake'
      +person.last_name  #returns 'Eggleston'
      +
      +
      +

      Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

      +
      +
      +__abstract__ = False
      +

      Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

      +
      + +
      +
      +__table_name__ = None
      +

      Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

      +
      + +
      +
      +__table_name_case_sensitive__ = False
      +

      Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

      +
      + +
      +
      +__keyspace__ = None
      +

      Sets the name of the keyspace used by this model.

      +
      + +
      +
      +__connection__ = None
      +

      Sets the name of the default connection used by this model.

      +
      + +
      +
      +__default_ttl__ = None
      +

      Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

      +
      + +
      +
      +__discriminator_value__ = None
      +

      Optional Specifies a value for the discriminator column when using model inheritance.

      +

      See Model Inheritance for usage examples.

      +
      + +

      Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

      +

      When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

      +

      Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

      +

      See the list of supported table properties for more information.

      +
      +
      +__options__
      +

      For example:

      +
      class User(Model):
      +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
      +                                  'sstable_size_in_mb': '64',
      +                                  'tombstone_threshold': '.2'},
      +                   'comment': 'User data stored here'}
      +
      +    user_id = columns.UUID(primary_key=True)
      +    name = columns.Text()
      +
      +
      +

      or :

      +
      class TimeData(Model):
      +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
      +                                  'bucket_low': '.3',
      +                                  'bucket_high': '2',
      +                                  'min_threshold': '2',
      +                                  'max_threshold': '64',
      +                                  'tombstone_compaction_interval': '86400'},
      +                   'gc_grace_seconds': '0'}
      +
      +
      +
      + +
      +
      +__compute_routing_key__ = True
      +

      Optional Setting False disables computing the routing key for TokenAwareRouting

      +
      + +

      The base methods allow creating, storing, and querying modeled objects.

      +
      +
      +classmethod create(**kwargs)
      +

      Create an instance of this model in the database.

      +

      Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

      +

      Returns the instance.

      +
      + +
      +
      +if_not_exists()
      +

      Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

      +

      If the insertion isn’t applied, a LWTException is raised.

      +
      try:
      +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
      +except LWTException as e:
      +    # handle failure case
      +    print e.existing  # dict containing LWT result fields
      +
      +
      +

      This method is supported on Cassandra 2.0 or later.

      +
      + +
      +
      +if_exists()
      +

      Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

      +

      If the update or delete isn’t applied, a LWTException is raised.

      +
      try:
      +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
      +except LWTException as e:
      +    # handle failure case
      +    pass
      +
      +
      +

      This method is supported on Cassandra 2.0 or later.

      +
      + +
      +
      +save()
      +

      Saves an object to the database.

      +
      #create a person instance
      +person = Person(first_name='Kimberly', last_name='Eggleston')
      +#saves it to Cassandra
      +person.save()
      +
      +
      +
      + +
      +
      +update(**values)
      +

      Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

      +

      It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

      +
      + +
      +
      +iff(**values)
      +

      Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

      +

      If the insertion isn’t applied, a LWTException is raised.

      +
      t = TestTransactionModel(text='some text', count=5)
      +try:
      +     t.iff(count=5).update('other text')
      +except LWTException as e:
      +    # handle failure case
      +    print e.existing # existing object
      +
      +
      +
      + +
      +
      +classmethod get(*args, **kwargs)
      +

      Returns a single object based on the passed filter constraints.

      +

      This is a pass-through to the model objects().:method:~cqlengine.queries.get.

      +
      + +
      +
      +classmethod filter(*args, **kwargs)
      +

      Returns a queryset based on filter parameters.

      +

      This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

      +
      + +
      +
      +classmethod all()
      +

      Returns a queryset representing all stored objects

      +

      This is a pass-through to the model objects().all()

      +
      + +
      +
      +delete()
      +

      Deletes the object from the database

      +
      + +
      +
      +batch(batch_object)
      +

      Sets the batch object to run instance updates and inserts queries with.

      +

      See Batch Queries for usage examples

      +
      + +
      +
      +timeout(timeout)
      +

      Sets a timeout for use in save(), update(), and delete() +operations

      +
      + +
      +
      +timestamp(timedelta_or_datetime)
      +

      Sets the timestamp for the query

      +
      + +
      +
      +ttl(ttl_in_sec)
      +

      Sets the ttl values to run instance updates and inserts queries with.

      +
      + +
      +
      +using(connection=None)
      +

      Change the context on the fly of the model instance (keyspace, connection)

      +
      + +
      +
      +classmethod column_family_name(include_keyspace=True)
      +

      Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

      +
      + +

      Models also support dict-like access:

      +
      +
      +len(m)
      +

      Returns the number of columns defined in the model

      +
      + +
      +
      +m[col_name]()
      +

      Returns the value of column col_name

      +
      + +
      +
      +m[col_name] = value
      +

      Set m[col_name] to value

      +
      + +
      +
      +keys()
      +

      Returns a list of column IDs.

      +
      + +
      +
      +values()
      +

      Returns list of column values.

      +
      + +
      +
      +items()
      +

      Returns a list of column ID/value tuples.

      +
      + +
      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cqlengine/query.html b/3.21.0-scylla/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..a1e5cf7f85 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cqlengine/query.html @@ -0,0 +1,1058 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cqlengine.query - Query and filter model objects

      +
      +

      QuerySet

      +

      QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

      +
      +
      +class cassandra.cqlengine.query.ModelQuerySet(model)
      +
      +
      +all()
      +

      Returns a queryset matching all rows

      +
      for user in User.objects().all():
      +    print(user)
      +
      +
      +
      + +
      +
      +batch(batch_obj)
      +

      Set a batch object to run the query on.

      +

      Note: running a select query with a batch object will raise an exception

      +
      + +
      +
      +consistency(consistency)
      +

      Sets the consistency level for the operation. See ConsistencyLevel.

      +
      for user in User.objects(id=3).consistency(CL.ONE):
      +    print(user)
      +
      +
      +
      + +
      +
      +count()
      +

      Returns the number of rows matched by this query.

      +

      Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

      +
      + +
      +
      +len(queryset)
      +

      Returns the number of rows matched by this query. This function uses count() internally.

      +

      Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

      +
      + +
      +
      +distinct(distinct_fields=None)
      +

      Returns the DISTINCT rows matched by this query.

      +

      distinct_fields default to the partition key fields if not specified.

      +

      Note: distinct_fields must be a partition key or a static column

      +
      class Automobile(Model):
      +    manufacturer = columns.Text(partition_key=True)
      +    year = columns.Integer(primary_key=True)
      +    model = columns.Text(primary_key=True)
      +    price = columns.Decimal()
      +
      +sync_table(Automobile)
      +
      +# create rows
      +
      +Automobile.objects.distinct()
      +
      +# or
      +
      +Automobile.objects.distinct(['manufacturer'])
      +
      +
      +
      + +
      +
      +filter(*args, **kwargs)
      +

      Adds WHERE arguments to the queryset, returning a new queryset

      +

      See Retrieving objects with filters

      +

      Returns a QuerySet filtered on the keyword arguments

      +
      + +
      +
      +get(*args, **kwargs)
      +

      Returns a single instance matching this query, optionally with additional filter kwargs.

      +

      See Retrieving objects with filters

      +

      Returns a single object matching the QuerySet.

      +
      user = User.get(id=1)
      +
      +
      +

      If no objects are matched, a DoesNotExist exception is raised.

      +

      If more than one object is found, a MultipleObjectsReturned exception is raised.

      +
      + +
      +
      +limit(v)
      +

      Limits the number of results returned by Cassandra. Use 0 or None to disable.

      +

      Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

      +
      # Fetch 100 users
      +for user in User.objects().limit(100):
      +    print(user)
      +
      +# Fetch all users
      +for user in User.objects().limit(None):
      +    print(user)
      +
      +
      +
      + +
      +
      +fetch_size(v)
      +

      Sets the number of rows that are fetched at a time.

      +

      Note that driver’s default fetch size is 5000.

      +
      for user in User.objects().fetch_size(500):
      +    print(user)
      +
      +
      +
      + +
      +
      +if_not_exists()
      +

      Check the existence of an object before insertion.

      +

      If the insertion isn’t applied, a LWTException is raised.

      +
      + +
      +
      +if_exists()
      +

      Check the existence of an object before an update or delete.

      +

      If the update or delete isn’t applied, a LWTException is raised.

      +
      + +
      +
      +order_by(*colnames)
      +

      Sets the column(s) to be used for ordering

      +

      Default order is ascending, prepend a ‘-’ to any column name for descending

      +

      Note: column names must be a clustering key

      +
      from uuid import uuid1,uuid4
      +
      +class Comment(Model):
      +    photo_id = UUID(primary_key=True)
      +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
      +    comment = Text()
      +
      +sync_table(Comment)
      +
      +u = uuid4()
      +for x in range(5):
      +    Comment.create(photo_id=u, comment="test %d" % x)
      +
      +print("Normal")
      +for comment in Comment.objects(photo_id=u):
      +    print comment.comment_id
      +
      +print("Reversed")
      +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
      +    print comment.comment_id
      +
      +
      +
      + +
      +
      +allow_filtering()
      +

      Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

      +
      + +
      +
      +only(fields)
      +

      Load only these fields for the returned query

      +
      + +
      +
      +defer(fields)
      +

      Don’t load these fields for the returned query

      +
      + +
      +
      +timestamp(timestamp)
      +

      Allows for custom timestamps to be saved with the record.

      +
      + +
      +
      +ttl(ttl)
      +

      Sets the ttl (in seconds) for modified data.

      +

      Note that running a select query with a ttl value will raise an exception

      +
      + +
      +
      +using(keyspace=None, connection=None)
      +

      Change the context on-the-fly of the Model class (keyspace, connection)

      +
      + +
      +
      +update(**values)
      +

      Performs an update on the row selected by the queryset. Include values to update in the +update like so:

      +
      Model.objects(key=n).update(value='x')
      +
      +
      +

      Passing in updates for columns which are not part of the model will raise a ValidationError.

      +

      Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

      +

      For example:

      +
      class User(Model):
      +    id = Integer(primary_key=True)
      +    name = Text()
      +
      +setup(["localhost"], "test")
      +sync_table(User)
      +
      +u = User.create(id=1, name="jon")
      +
      +User.objects(id=1).update(name="Steve")
      +
      +# sets name to null
      +User.objects(id=1).update(name=None)
      +
      +
      +

      Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

      +

      Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

      +

      Given the model below, here are the operations that can be performed on the different container columns:

      +
      class Row(Model):
      +    row_id      = columns.Integer(primary_key=True)
      +    set_column  = columns.Set(Integer)
      +    list_column = columns.List(Integer)
      +    map_column  = columns.Map(Integer, Integer)
      +
      +
      +

      Set

      +
        +
      • add: adds the elements of the given set to the column

      • +
      • remove: removes the elements of the given set to the column

      • +
      +
      # add elements to a set
      +Row.objects(row_id=5).update(set_column__add={6})
      +
      +# remove elements to a set
      +Row.objects(row_id=5).update(set_column__remove={4})
      +
      +
      +

      List

      +
        +
      • append: appends the elements of the given list to the end of the column

      • +
      • prepend: prepends the elements of the given list to the beginning of the column

      • +
      +
      # append items to a list
      +Row.objects(row_id=5).update(list_column__append=[6, 7])
      +
      +# prepend items to a list
      +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
      +
      +
      +

      Map

      +
        +
      • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

      • +
      +
      # add items to a map
      +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
      +
      +# remove items from a map
      +Row.objects(row_id=5).update(map_column__remove={1, 2})
      +
      +
      +
      + +
      + +
      +
      +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
      +

      Handles the batching of queries

      +

      http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

      +

      See Batch Queries for more details.

      +
      +
      Parameters:
      +
        +
      • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

      • +
      • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

      • +
      • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

      • +
      • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

      • +
      • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

      • +
      • connection (str) – Connection name to use for the batch execution

      • +
      +
      +
      +
      +
      +add_query(query)
      +
      + +
      +
      +execute()
      +
      + +
      +
      +add_callback(fn, *args, **kwargs)
      +

      Add a function and arguments to be passed to it to be executed after the batch executes.

      +

      A batch can support multiple callbacks.

      +

      Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

      +
      +
      Parameters:
      +
        +
      • fn (callable) – Callable object

      • +
      • *args – Positional arguments to be passed to the callback at the time of execution

      • +
      • **kwargs – Named arguments to be passed to the callback at the time of execution

      • +
      +
      +
      +
      + +
      + +
      +
      +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
      +

      A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

      +
      +
      Parameters:
      +
        +
      • *args – One or more models. A model should be a class type, not an instance.

      • +
      • **kwargs – (optional) Context parameters: can be keyspace or connection

      • +
      +
      +
      +

      For example:

      +
      with ContextQuery(Automobile, keyspace='test2') as A:
      +    A.objects.create(manufacturer='honda', year=2008, model='civic')
      +    print len(A.objects.all())  # 1 result
      +
      +with ContextQuery(Automobile, keyspace='test4') as A:
      +    print len(A.objects.all())  # 0 result
      +
      +# Multiple models
      +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
      +    print len(A.objects.all())
      +    print len(A2.objects.all())
      +
      +
      +
      + +
      +
      +class cassandra.cqlengine.query.DoesNotExist
      +
      + +
      +
      +class cassandra.cqlengine.query.MultipleObjectsReturned
      +
      + +
      +
      +class cassandra.cqlengine.query.LWTException(existing)
      +

      Lightweight conditional exception.

      +

      This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

      +
      +
      Parameters:
      +

      existing – The current state of the data which prevented the write.

      +
      +
      +
      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/cqlengine/usertype.html b/3.21.0-scylla/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..b5f8f1090a --- /dev/null +++ b/3.21.0-scylla/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.cqlengine.usertype - Model classes for User Defined Types

      +
      +

      UserType

      +
      +
      +class cassandra.cqlengine.usertype.UserType(**values)
      +

      This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

      +
      # connect with default keyspace ...
      +
      +from cassandra.cqlengine.columns import Text, Integer
      +from cassandra.cqlengine.usertype import UserType
      +
      +class address(UserType):
      +    street = Text()
      +    zipcode = Integer()
      +
      +from cassandra.cqlengine import management
      +management.sync_type(address)
      +
      +
      +

      Please see User Defined Types for a complete example and discussion.

      +
      +
      +__type_name__ = None
      +

      Optional. Sets the name of the CQL type for this type.

      +

      If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

      +
      + +
      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/datastax/graph/fluent/index.html b/3.21.0-scylla/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..ee79f23bfb --- /dev/null +++ b/3.21.0-scylla/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.datastax.graph.fluent

      +
      +
      +class cassandra.datastax.graph.fluent.DseGraph
      +

      Dse Graph utility class for GraphTraversal construction and execution.

      +
      +
      +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
      +

      Graph query language, Default is ‘bytecode-json’ (GraphSON).

      +
      + +
      +
      +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
      +

      Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

      +
      +
      Parameters:
      +
        +
      • graph_name – The graph name

      • +
      • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

      • +
      +
      +
      +
      + +
      +
      +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
      +

      From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

      +
      +
      Parameters:
      +
        +
      • traversal – The GraphTraversal object

      • +
      • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

      • +
      • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

      • +
      +
      +
      +
      + +
      +
      +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
      +

      Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

      +
      +
      Parameters:
      +
        +
      • session – (Optional) A DSE session

      • +
      • graph_name – (Optional) DSE Graph name

      • +
      • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

      • +
      • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

      • +
      +
      +
      +
      from cassandra.cluster import Cluster
      +from cassandra.datastax.graph.fluent import DseGraph
      +
      +c = Cluster()
      +session = c.connect()
      +
      +g = DseGraph.traversal_source(session, 'my_graph')
      +print g.V().valueMap().toList()
      +
      +
      +
      + +
      +
      +static batch(session=None, execution_profile=None)
      +

      Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
      +

      A Tinkerpop RemoteConnection to execute traversal queries on DSE.

      +
      +
      Parameters:
      +
        +
      • session – A DSE session

      • +
      • graph_name – (Optional) DSE Graph name.

      • +
      • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

      • +
      +
      +
      +
      + +
      +
      +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
      +

      Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

      +
      +
      Currently supported:
        +
      • bulk results

      • +
      +
      +
      +
      + +
      +
      +cassandra.datastax.graph.fluent.graph_traversal_row_factory
      +

      alias of _GremlinGraphSON2RowFactory

      +
      + +
      +
      +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
      +

      alias of _DseGraphSON2RowFactory

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/datastax/graph/fluent/predicates.html b/3.21.0-scylla/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..7e66dc33df --- /dev/null +++ b/3.21.0-scylla/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,728 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.datastax.graph.fluent.predicates

      +
      +
      +class cassandra.datastax.graph.fluent.predicates.Search
      +
      +
      +static token(value)
      +

      Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

      +
      + +
      +
      +static token_prefix(value)
      +

      Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

      +
      + +
      +
      +static token_regex(value)
      +

      Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

      +
      + +
      +
      +static prefix(value)
      +

      Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

      +
      + +
      +
      +static regex(value)
      +

      Search for this regular expression inside the text property targeted. +:param value: the value to look for.

      +
      + +
      +
      +static fuzzy(value, distance)
      +

      Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

      +
      + +
      +
      +static token_fuzzy(value, distance)
      +

      Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

      +
      + +
      +
      +static phrase(value, proximity)
      +

      Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.fluent.predicates.Geo
      +
      +
      +static inside(value, units=1)
      +

      Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/datastax/graph/fluent/query.html b/3.21.0-scylla/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..a903f3a69c --- /dev/null +++ b/3.21.0-scylla/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.datastax.graph.fluent.query

      +
      +
      +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
      +

      A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

      +

      If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

      +
      +
      Parameters:
      +
        +
      • session – (Optional) A DSE session

      • +
      • execution_profile – (Optional) The execution profile to use for the batch execution

      • +
      +
      +
      +
      +
      +add(traversal)
      +

      Add a traversal to the batch.

      +
      +
      Parameters:
      +

      traversal – A gremlin GraphTraversal

      +
      +
      +
      + +
      +
      +add_all(traversals)
      +

      Adds a sequence of traversals to the batch.

      +
      +
      Parameters:
      +

      traversals – A sequence of gremlin GraphTraversal

      +
      +
      +
      + +
      +
      +execute()
      +

      Execute the traversal batch if bounded to a DSE Session.

      +
      + +
      +
      +as_graph_statement(graph_protocol=b'graphson-2.0')
      +

      Return the traversal batch as GraphStatement.

      +
      +
      Parameters:
      +

      graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

      +
      +
      +
      + +
      +
      +clear()
      +

      Clear a traversal batch for reuse.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/datastax/graph/index.html b/3.21.0-scylla/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..91cf81ba4e --- /dev/null +++ b/3.21.0-scylla/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1027 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.datastax.graph - Graph Statements, Options, and Row Factories

      +
      +
      +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
      +

      returns the JSON string value of graph results

      +
      + +
      +
      +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
      +

      Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

      +
      + +
      +
      +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
      +

      Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

      +
      + +
      +
      +class cassandra.datastax.graph.GraphProtocol
      +
      +
      +GRAPHSON_1_0 = b'graphson-1.0'
      +

      GraphSON1

      +
      + +
      +
      +GRAPHSON_2_0 = b'graphson-2.0'
      +

      GraphSON2

      +
      + +
      +
      +GRAPHSON_3_0 = b'graphson-3.0'
      +

      GraphSON3

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.GraphOptions(**kwargs)
      +

      Options for DSE Graph Query handler.

      +
      +
      +graph_name
      +

      name of the targeted graph.

      +
      + +
      +
      +graph_source
      +

      choose the graph traversal source, configured on the server side.

      +
      + +
      +
      +graph_language
      +

      the language used in the queries (default “gremlin-groovy”)

      +
      + +
      +
      +graph_read_consistency_level
      +

      read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

      +
      + +
      +
      +graph_write_consistency_level
      +

      write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

      +
      + +
      +
      +is_default_source
      +
      + +
      +
      +is_analytics_source
      +

      True if graph_source is set to the server-defined analytics traversal source (‘a’)

      +
      + +
      +
      +is_graph_source
      +

      True if graph_source is set to the server-defined graph traversal source (‘g’)

      +
      + +
      +
      +set_source_default()
      +

      Sets graph_source to the server-defined default traversal source (‘default’)

      +
      + +
      +
      +set_source_analytics()
      +

      Sets graph_source to the server-defined analytic traversal source (‘a’)

      +
      + +
      +
      +set_source_graph()
      +

      Sets graph_source to the server-defined graph traversal source (‘g’)

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
      +

      Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

      +

      query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

      +

      See Statement attributes for a description of the other parameters.

      +
      + +
      +
      +class cassandra.datastax.graph.Result(value)
      +

      Represents deserialized graph results. +Property and item getters are provided for convenience.

      +
      +
      +value = None
      +

      Deserialized value from the result

      +
      + +
      +
      +as_vertex()
      +

      Return a Vertex parsed from this result

      +

      Raises TypeError if parsing fails (i.e. the result structure is not valid).

      +
      + +
      +
      +as_edge()
      +

      Return a Edge parsed from this result

      +

      Raises TypeError if parsing fails (i.e. the result structure is not valid).

      +
      + +
      +
      +as_path()
      +

      Return a Path parsed from this result

      +

      Raises TypeError if parsing fails (i.e. the result structure is not valid).

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.Vertex(id, label, type, properties)
      +

      Represents a Vertex element from a graph query.

      +

      Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

      +
      + +
      +
      +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
      +

      Vertex properties have a top-level value and an optional dict of properties.

      +
      +
      +label = None
      +

      label of the property

      +
      + +
      +
      +value = None
      +

      Value of the property

      +
      + +
      +
      +properties = None
      +

      dict of properties attached to the property

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
      +

      Represents an Edge element from a graph query.

      +

      Attributes match initializer parameters.

      +
      + +
      +
      +class cassandra.datastax.graph.Path(labels, objects)
      +

      Represents a graph path.

      +

      Labels list is taken verbatim from the results.

      +

      Objects are either Result or Vertex/Edge for recognized types

      +
      +
      +labels = None
      +

      List of labels in the path

      +
      + +
      +
      +objects = None
      +

      List of objects in the path

      +
      + +
      + +
      +
      +class cassandra.datastax.graph.GraphSON1Serializer
      +

      Serialize python objects to graphson types.

      +
      + +
      +
      +class cassandra.datastax.graph.GraphSON1Deserializer
      +

      Deserialize graphson1 types to python objects.

      +
      +
      +classmethod deserialize_date(value)
      +
      + +
      +
      +classmethod deserialize_timestamp(value)
      +
      + +
      +
      +classmethod deserialize_time(value)
      +
      + +
      +
      +classmethod deserialize_duration(value)
      +
      + +
      +
      +classmethod deserialize_int(value)
      +
      + +
      +
      +classmethod deserialize_bigint(value)
      +
      + +
      +
      +classmethod deserialize_double(value)
      +
      + +
      +
      +classmethod deserialize_float(value)
      +
      + +
      +
      +classmethod deserialize_uuid(value)
      +
      + +
      +
      +classmethod deserialize_blob(value)
      +
      + +
      +
      +classmethod deserialize_decimal(value)
      +
      + +
      +
      +classmethod deserialize_point(value)
      +
      + +
      +
      +classmethod deserialize_linestring(value)
      +
      + +
      +
      +classmethod deserialize_polygon(value)
      +
      + +
      + +
      +
      +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
      +

      GraphSON2 Reader that parse json and deserialize to python objects.

      +
      +
      Parameters:
      +

      extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

      +
      +
      +
      +
      +read(json_data)
      +

      Read and deserialize json_data.

      +
      + +
      +
      +deserialize(obj)
      +

      Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/decoder.html b/3.21.0-scylla/api/cassandra/decoder.html new file mode 100644 index 0000000000..710d2f1736 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/decoder.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.decoder - Data Return Formats

      +
      +
      +cassandra.decoder.tuple_factory()
      +

      Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

      +
      + +
      +
      +cassandra.decoder.named_tuple_factory()
      +

      Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

      +
      + +
      +
      +cassandra.decoder.dict_factory()
      +

      Deprecated in 2.0.0. Use cassandra.query.dict_factory()

      +
      + +
      +
      +cassandra.decoder.ordered_dict_factory()
      +

      Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/encoder.html b/3.21.0-scylla/api/cassandra/encoder.html new file mode 100644 index 0000000000..c6e1e53e18 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/encoder.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.encoder - Encoders for non-prepared Statements

      +
      +
      +class cassandra.encoder.Encoder
      +

      A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

      +
      +
      +mapping = None
      +

      A map of python types to encoder functions.

      +
      + +
      +
      +cql_encode_none()
      +

      Converts None to the string ‘NULL’.

      +
      + +
      +
      +cql_encode_object()
      +

      Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

      +
      + +
      +
      +cql_encode_all_types()
      +

      Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

      +
      + +
      +
      +cql_encode_sequence()
      +

      Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

      +
      + +
      +
      +cql_encode_str()
      +

      Escapes quotes in str objects.

      +
      + +
      +
      +cql_encode_unicode()
      +

      Converts unicode objects to UTF-8 encoded strings with quote escaping.

      +
      + +
      +
      +cql_encode_bytes()
      +

      Converts strings, buffers, and bytearrays into CQL blob literals.

      +
      + +
      +
      +cql_encode_datetime()
      +

      Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

      +
      + +
      +
      +cql_encode_date()
      +

      Converts a datetime.date object to a string with format +YYYY-MM-DD.

      +
      + +
      +
      +cql_encode_map_collection()
      +

      Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

      +
      + +
      +
      +cql_encode_list_collection()
      +

      Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

      +
      + +
      +
      +cql_encode_set_collection()
      +

      Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

      +
      + +
      +
      +cql_encode_tuple()
      +

      Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/graph.html b/3.21.0-scylla/api/cassandra/graph.html new file mode 100644 index 0000000000..0db5544c2c --- /dev/null +++ b/3.21.0-scylla/api/cassandra/graph.html @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.graph - Graph Statements, Options, and Row Factories

      +
      +

      Note

      +

      This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

      +
      +
      +
      +cassandra.graph.single_object_row_factory(column_names, rows)
      +

      returns the JSON string value of graph results

      +
      + +
      +
      +cassandra.graph.graph_result_row_factory(column_names, rows)
      +

      Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

      +
      + +
      +
      +cassandra.graph.graph_object_row_factory(column_names, rows)
      +

      Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

      +
      + +
      +
      +class cassandra.graph.GraphProtocol
      +
      +
      +GRAPHSON_1_0 = b'graphson-1.0'
      +

      GraphSON1

      +
      + +
      +
      +GRAPHSON_2_0 = b'graphson-2.0'
      +

      GraphSON2

      +
      + +
      +
      +GRAPHSON_3_0 = b'graphson-3.0'
      +

      GraphSON3

      +
      + +
      + +
      +
      +class cassandra.graph.GraphOptions(**kwargs)
      +

      Options for DSE Graph Query handler.

      +
      +
      +graph_name
      +

      name of the targeted graph.

      +
      + +
      +
      +graph_source
      +

      choose the graph traversal source, configured on the server side.

      +
      + +
      +
      +graph_language
      +

      the language used in the queries (default “gremlin-groovy”)

      +
      + +
      +
      +graph_read_consistency_level
      +

      read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

      +
      + +
      +
      +graph_write_consistency_level
      +

      write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

      +
      + +
      +
      +is_default_source
      +
      + +
      +
      +is_analytics_source
      +

      True if graph_source is set to the server-defined analytics traversal source (‘a’)

      +
      + +
      +
      +is_graph_source
      +

      True if graph_source is set to the server-defined graph traversal source (‘g’)

      +
      + +
      +
      +set_source_default()
      +

      Sets graph_source to the server-defined default traversal source (‘default’)

      +
      + +
      +
      +set_source_analytics()
      +

      Sets graph_source to the server-defined analytic traversal source (‘a’)

      +
      + +
      +
      +set_source_graph()
      +

      Sets graph_source to the server-defined graph traversal source (‘g’)

      +
      + +
      + +
      +
      +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
      +

      Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

      +

      query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

      +

      See Statement attributes for a description of the other parameters.

      +
      + +
      +
      +class cassandra.graph.Result(value)
      +

      Represents deserialized graph results. +Property and item getters are provided for convenience.

      +
      +
      +value = None
      +

      Deserialized value from the result

      +
      + +
      +
      +as_vertex()
      +

      Return a Vertex parsed from this result

      +

      Raises TypeError if parsing fails (i.e. the result structure is not valid).

      +
      + +
      +
      +as_edge()
      +

      Return a Edge parsed from this result

      +

      Raises TypeError if parsing fails (i.e. the result structure is not valid).

      +
      + +
      +
      +as_path()
      +

      Return a Path parsed from this result

      +

      Raises TypeError if parsing fails (i.e. the result structure is not valid).

      +
      + +
      + +
      +
      +class cassandra.graph.Vertex(id, label, type, properties)
      +

      Represents a Vertex element from a graph query.

      +

      Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

      +
      + +
      +
      +class cassandra.graph.VertexProperty(label, value, properties=None)
      +

      Vertex properties have a top-level value and an optional dict of properties.

      +
      +
      +label = None
      +

      label of the property

      +
      + +
      +
      +value = None
      +

      Value of the property

      +
      + +
      +
      +properties = None
      +

      dict of properties attached to the property

      +
      + +
      + +
      +
      +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
      +

      Represents an Edge element from a graph query.

      +

      Attributes match initializer parameters.

      +
      + +
      +
      +class cassandra.graph.Path(labels, objects)
      +

      Represents a graph path.

      +

      Labels list is taken verbatim from the results.

      +

      Objects are either Result or Vertex/Edge for recognized types

      +
      +
      +labels = None
      +

      List of labels in the path

      +
      + +
      +
      +objects = None
      +

      List of objects in the path

      +
      + +
      + +
      +
      +class cassandra.graph.GraphSON1Serializer
      +

      Serialize python objects to graphson types.

      +
      + +
      +
      +class cassandra.graph.GraphSON1Deserializer
      +

      Deserialize graphson1 types to python objects.

      +
      +
      +classmethod deserialize_date(value)
      +
      + +
      +
      +classmethod deserialize_timestamp(value)
      +
      + +
      +
      +classmethod deserialize_time(value)
      +
      + +
      +
      +classmethod deserialize_duration(value)
      +
      + +
      +
      +classmethod deserialize_int(value)
      +
      + +
      +
      +classmethod deserialize_bigint(value)
      +
      + +
      +
      +classmethod deserialize_double(value)
      +
      + +
      +
      +classmethod deserialize_float(value)
      +
      + +
      +
      +classmethod deserialize_uuid(value)
      +
      + +
      +
      +classmethod deserialize_blob(value)
      +
      + +
      +
      +classmethod deserialize_decimal(value)
      +
      + +
      +
      +classmethod deserialize_point(value)
      +
      + +
      +
      +classmethod deserialize_linestring(value)
      +
      + +
      +
      +classmethod deserialize_polygon(value)
      +
      + +
      + +
      +
      +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
      +

      GraphSON2 Reader that parse json and deserialize to python objects.

      +
      +
      Parameters:
      +

      extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

      +
      +
      +
      +
      +read(json_data)
      +

      Read and deserialize json_data.

      +
      + +
      +
      +deserialize(obj)
      +

      Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/io/asyncioreactor.html b/3.21.0-scylla/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..8303ee1971 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.io.asyncioreactor - asyncio Event Loop

      +
      +
      +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
      +

      An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

      +

      Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

      +
      +
      +classmethod initialize_reactor()
      +

      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/io/asyncorereactor.html b/3.21.0-scylla/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..b87b6999e8 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.io.asyncorereactor - asyncore Event Loop

      +
      +
      +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
      +

      An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

      +
      +
      +classmethod initialize_reactor()
      +

      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

      +
      + +
      +
      +classmethod handle_fork()
      +

      Called after a forking. This should cleanup any remaining reactor state +from the parent process.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/io/eventletreactor.html b/3.21.0-scylla/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..72c49dfe69 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/io/eventletreactor.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.io.eventletreactor - eventlet-compatible Connection

      +
      +
      +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
      +

      An implementation of Connection that utilizes eventlet.

      +

      This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

      +
      +
      +classmethod initialize_reactor()
      +

      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

      +
      + +
      +
      +classmethod service_timeouts()
      +

      cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/io/geventreactor.html b/3.21.0-scylla/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..0b13c95e3f --- /dev/null +++ b/3.21.0-scylla/api/cassandra/io/geventreactor.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.io.geventreactor - gevent-compatible Event Loop

      +
      +
      +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
      +

      An implementation of Connection that utilizes gevent.

      +

      This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

      +
      +
      +classmethod initialize_reactor()
      +

      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/io/libevreactor.html b/3.21.0-scylla/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..d20b1217ca --- /dev/null +++ b/3.21.0-scylla/api/cassandra/io/libevreactor.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.io.libevreactor - libev Event Loop

      +
      +
      +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
      +

      An implementation of Connection that uses libev for its event loop.

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/io/twistedreactor.html b/3.21.0-scylla/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..14ca5cccbe --- /dev/null +++ b/3.21.0-scylla/api/cassandra/io/twistedreactor.html @@ -0,0 +1,642 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.io.twistedreactor - Twisted Event Loop

      +
      +
      +class cassandra.io.twistedreactor.TwistedConnection
      +

      An implementation of Connection that uses +Twisted’s reactor as its event loop.

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/metadata.html b/3.21.0-scylla/api/cassandra/metadata.html new file mode 100644 index 0000000000..7d906b4eaf --- /dev/null +++ b/3.21.0-scylla/api/cassandra/metadata.html @@ -0,0 +1,1047 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.metadata - Schema and Ring Topology

      +
      +
      +cassandra.metadata.cql_keywords
      +

      set() -> new empty set object +set(iterable) -> new set object

      +

      Build an unordered collection of unique elements.

      +
      + +
      +
      +cassandra.metadata.cql_keywords_unreserved
      +

      set() -> new empty set object +set(iterable) -> new set object

      +

      Build an unordered collection of unique elements.

      +
      + +
      +
      +cassandra.metadata.cql_keywords_reserved
      +

      set() -> new empty set object +set(iterable) -> new set object

      +

      Build an unordered collection of unique elements.

      +
      + +
      +
      +class cassandra.metadata.Metadata
      +

      Holds a representation of the cluster schema and topology.

      +
      +
      +add_or_return_host(host)
      +

      Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

      +
      + +
      +
      +all_hosts()
      +

      Returns a list of all known Host instances in the cluster.

      +
      + +
      +
      +export_schema_as_string()
      +

      Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

      +
      + +
      +
      +get_host(endpoint_or_address, port=None)
      +

      Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

      +
      + +
      +
      +get_host_by_host_id(host_id)
      +

      Same as get_host() but use host_id for lookup.

      +
      + +
      +
      +get_replicas(keyspace, key)
      +

      Returns a list of Host instances that are replicas for a given +partition key.

      +
      + +
      + +
      +

      Schemas

      +
      +
      +class cassandra.metadata.KeyspaceMetadata
      +

      A representation of the schema for a single keyspace.

      +
      +
      +as_cql_query()
      +

      Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

      +
      + +
      +
      +export_as_string()
      +

      Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

      +
      + +
      + +
      +
      +class cassandra.metadata.UserType
      +

      A user defined type, as created by CREATE TYPE statements.

      +

      User-defined types were introduced in Cassandra 2.1.

      +
      +

      New in version 2.1.0.

      +
      +
      +
      +as_cql_query(formatted=False)
      +

      Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

      +
      + +
      + +
      +
      +class cassandra.metadata.Function
      +

      A user defined function, as created by CREATE FUNCTION statements.

      +

      User-defined functions were introduced in Cassandra 2.2

      +
      +

      New in version 2.6.0.

      +
      +
      +
      +as_cql_query(formatted=False)
      +

      Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

      +
      + +
      + +
      +
      +class cassandra.metadata.Aggregate
      +

      A user defined aggregate function, as created by CREATE AGGREGATE statements.

      +

      Aggregate functions were introduced in Cassandra 2.2

      +
      +

      New in version 2.6.0.

      +
      +
      +
      +as_cql_query(formatted=False)
      +

      Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

      +
      + +
      + +
      +
      +class cassandra.metadata.TableMetadata
      +

      A representation of the schema for a single table.

      +
      +
      +as_cql_query(formatted=False)
      +

      Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

      +
      + +
      +
      +export_as_string()
      +

      Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

      +
      + +
      +
      +property is_cql_compatible
      +

      A boolean indicating if this table can be represented as CQL in export

      +
      + +
      +
      +property primary_key
      +

      A list of ColumnMetadata representing the components of +the primary key for this table.

      +
      + +
      + +
      +
      +class cassandra.metadata.ColumnMetadata
      +

      A representation of a single column in a table.

      +
      + +
      +
      +class cassandra.metadata.IndexMetadata
      +

      A representation of a secondary index on a column.

      +
      +
      +as_cql_query()
      +

      Returns a CQL query that can be used to recreate this index.

      +
      + +
      +
      +export_as_string()
      +

      Returns a CQL query string that can be used to recreate this index.

      +
      + +
      + +
      +
      +class cassandra.metadata.MaterializedViewMetadata
      +

      A representation of a materialized view on a table

      +
      +
      +as_cql_query(formatted=False)
      +

      Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

      +
      + +
      + +
      +
      +

      Tokens and Ring Topology

      +
      +
      +class cassandra.metadata.TokenMap
      +

      Information about the layout of the ring.

      +
      +
      +get_replicas(keyspace, token)
      +

      Get a set of Host instances representing all of the +replica nodes for a given Token.

      +
      + +
      + +
      +
      +class cassandra.metadata.Token
      +

      Abstract class representing a token.

      +
      + +
      +
      +class cassandra.metadata.Murmur3Token(token)
      +

      A token for Murmur3Partitioner.

      +

      token is an int or string representing the token.

      +
      + +
      +
      +class cassandra.metadata.MD5Token(token)
      +

      A token for RandomPartitioner.

      +
      + +
      +
      +class cassandra.metadata.BytesToken(token)
      +

      A token for ByteOrderedPartitioner.

      +
      +
      +classmethod from_string(token_string)
      +

      token_string should be the string representation from the server.

      +
      + +
      + +
      +
      +cassandra.metadata.ReplicationStrategy
      +

      alias of _ReplicationStrategy

      +
      + +
      +
      +class cassandra.metadata.SimpleStrategy(options_map)
      +
      +
      +export_for_schema()
      +

      Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

      +
      + +
      +
      +property replication_factor
      +

      The replication factor for this keyspace.

      +

      For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

      +
      + +
      + +
      +
      +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
      +
      +
      +export_for_schema()
      +

      Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

      +
      + +
      + +
      +
      +class cassandra.metadata.LocalStrategy(options_map)
      +
      +
      +export_for_schema()
      +

      Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

      +
      + +
      + +
      +
      +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
      +

      Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

      +

      If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

      +

      Example usage:

      +
      >>> result = group_keys_by_replica(
      +...     session, "system", "peers",
      +...     (("127.0.0.1", ), ("127.0.0.2", )))
      +
      +
      +
      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/metrics.html b/3.21.0-scylla/api/cassandra/metrics.html new file mode 100644 index 0000000000..dbde1b05c4 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/metrics.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.metrics - Performance Metrics

      +
      +
      +class cassandra.metrics.Metrics
      +

      A collection of timers and counters for various performance metrics.

      +

      Timer metrics are represented as floating point seconds.

      +
      +
      +request_timer = None
      +

      A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

      +
        +
      • count - number of requests that have been timed

      • +
      • min - min latency

      • +
      • max - max latency

      • +
      • mean - mean latency

      • +
      • stddev - standard deviation for latencies

      • +
      • median - median latency

      • +
      • 75percentile - 75th percentile latencies

      • +
      • 95percentile - 95th percentile latencies

      • +
      • 98percentile - 98th percentile latencies

      • +
      • 99percentile - 99th percentile latencies

      • +
      • 999percentile - 99.9th percentile latencies

      • +
      +
      + +
      +
      +connection_errors = None
      +

      A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

      +
      + +
      +
      +write_timeouts = None
      +

      A greplin.scales.IntStat count of write requests that resulted +in a timeout.

      +
      + +
      +
      +read_timeouts = None
      +

      A greplin.scales.IntStat count of read requests that resulted +in a timeout.

      +
      + +
      +
      +unavailables = None
      +

      A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

      +
      + +
      +
      +other_errors = None
      +

      A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

      +
      + +
      +
      +retries = None
      +

      A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

      +
      + +
      +
      +ignores = None
      +

      A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

      +
      + +
      +
      +known_hosts = None
      +

      A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

      +
      + +
      +
      +connected_to = None
      +

      A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

      +
      + +
      +
      +open_connections = None
      +

      A greplin.scales.IntStat count of the number connections +the driver currently has open.

      +
      + +
      +
      +get_stats()
      +

      Returns the metrics for the registered cluster instance.

      +
      + +
      +
      +set_stats_name(stats_name)
      +

      Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/policies.html b/3.21.0-scylla/api/cassandra/policies.html new file mode 100644 index 0000000000..63683ee627 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/policies.html @@ -0,0 +1,1878 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.policies - Load balancing and Failure Handling Policies

      +
      +

      Load Balancing

      +
      +
      +class cassandra.policies.HostDistance
      +

      A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

      +
      +
      +IGNORED = -1
      +

      A node with this distance should never be queried or have +connections opened to it.

      +
      + +
      +
      +LOCAL = 0
      +

      Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

      +

      This distance is typically used for nodes within the same +datacenter as the client.

      +
      + +
      +
      +REMOTE = 1
      +

      Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

      +

      This distance is typically used for nodes outside of the +datacenter that the client is running in.

      +
      + +
      + +
      +
      +class cassandra.policies.LoadBalancingPolicy
      +

      Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

      +

      In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

      +

      You may also use subclasses of LoadBalancingPolicy for +custom behavior.

      +
      +
      +distance(host)
      +

      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

      +
      + +
      +
      +populate(cluster, hosts)
      +

      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

      +
      + +
      +
      +make_query_plan(working_keyspace=None, query=None)
      +

      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

      +

      Note that the query argument may be None when preparing +statements.

      +

      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

      +
      + +
      +
      +check_supported()
      +

      This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

      +
      + +
      + +
      +
      +class cassandra.policies.RoundRobinPolicy
      +

      A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

      +
      +
      +populate(cluster, hosts)
      +

      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

      +
      + +
      +
      +distance(host)
      +

      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

      +
      + +
      +
      +make_query_plan(working_keyspace=None, query=None)
      +

      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

      +

      Note that the query argument may be None when preparing +statements.

      +

      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

      +
      + +
      +
      +on_up(host)
      +

      Called when a node is marked up.

      +
      + +
      +
      +on_down(host)
      +

      Called when a node is marked down.

      +
      + +
      +
      +on_add(host)
      +

      Called when a node is added to the cluster. The newly added node +should be considered up.

      +
      + +
      +
      +on_remove(host)
      +

      Called when a node is removed from the cluster.

      +
      + +
      + +
      +
      +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
      +

      Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

      +

      The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

      +

      used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

      +
      +
      +populate(cluster, hosts)
      +

      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

      +
      + +
      +
      +distance(host)
      +

      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

      +
      + +
      +
      +make_query_plan(working_keyspace=None, query=None)
      +

      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

      +

      Note that the query argument may be None when preparing +statements.

      +

      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

      +
      + +
      +
      +on_up(host)
      +

      Called when a node is marked up.

      +
      + +
      +
      +on_down(host)
      +

      Called when a node is marked down.

      +
      + +
      +
      +on_add(host)
      +

      Called when a node is added to the cluster. The newly added node +should be considered up.

      +
      + +
      +
      +on_remove(host)
      +

      Called when a node is removed from the cluster.

      +
      + +
      + +
      +
      +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
      +

      A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

      +

      This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

      +

      The hosts parameter should be a sequence of hosts to permit +connections to.

      +
      +
      +populate(cluster, hosts)
      +

      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

      +
      + +
      +
      +distance(host)
      +

      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

      +
      + +
      +
      +on_up(host)
      +

      Called when a node is marked up.

      +
      + +
      +
      +on_add(host)
      +

      Called when a node is added to the cluster. The newly added node +should be considered up.

      +
      + +
      + +
      +
      +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
      +

      A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

      +

      This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

      +

      If no routing_key is set on the query, the child +policy’s query plan will be used as is.

      +
      +
      +shuffle_replicas = False
      +

      Yield local replicas in a random order.

      +
      + +
      +
      +populate(cluster, hosts)
      +

      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

      +
      + +
      +
      +check_supported()
      +

      This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

      +
      + +
      +
      +distance(*args, **kwargs)
      +

      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

      +
      + +
      +
      +make_query_plan(working_keyspace=None, query=None)
      +

      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

      +

      Note that the query argument may be None when preparing +statements.

      +

      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

      +
      + +
      +
      +on_up(*args, **kwargs)
      +

      Called when a node is marked up.

      +
      + +
      +
      +on_down(*args, **kwargs)
      +

      Called when a node is marked down.

      +
      + +
      +
      +on_add(*args, **kwargs)
      +

      Called when a node is added to the cluster. The newly added node +should be considered up.

      +
      + +
      +
      +on_remove(*args, **kwargs)
      +

      Called when a node is removed from the cluster.

      +
      + +
      + +
      +
      +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
      +

      A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

      +

      This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

      +
      def address_is_ignored(host):
      +    return host.address in [ignored_address0, ignored_address1]
      +
      +blacklist_filter_policy = HostFilterPolicy(
      +    child_policy=RoundRobinPolicy(),
      +    predicate=address_is_ignored
      +)
      +
      +cluster = Cluster(
      +    primary_host,
      +    load_balancing_policy=blacklist_filter_policy,
      +)
      +
      +
      +

      See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

      +

      Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

      +
      +
      Parameters:
      +
        +
      • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

      • +
      • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

      • +
      +
      +
      +
      +
      +predicate(host)
      +

      A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

      +

      This is a read-only value set in __init__, implemented as a +property.

      +
      + +
      +
      +distance(host)
      +

      Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

      +
      + +
      +
      +make_query_plan(working_keyspace=None, query=None)
      +

      Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

      +

      Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

      +
      + +
      + +
      +
      +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
      +

      A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

      +

      If no host is set on the query, the child policy’s query plan will be used as is.

      +
      +
      +populate(cluster, hosts)
      +

      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

      +
      + +
      +
      +make_query_plan(working_keyspace=None, query=None)
      +

      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

      +

      Note that the query argument may be None when preparing +statements.

      +

      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

      +
      + +
      + +
      +
      +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
      +

      Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

      +
      + +
      +
      +

      Translating Server Node Addresses

      +
      +
      +class cassandra.policies.AddressTranslator
      +

      Interface for translating cluster-defined endpoints.

      +

      The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

      +

      Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

      +
      +
      +translate(addr)
      +

      Accepts the node ip address, and returns a translated address to be used connecting to this node.

      +
      + +
      + +
      +
      +class cassandra.policies.IdentityTranslator
      +

      Returns the endpoint with no translation

      +
      +
      +translate(addr)
      +

      Accepts the node ip address, and returns a translated address to be used connecting to this node.

      +
      + +
      + +
      +
      +class cassandra.policies.EC2MultiRegionTranslator
      +

      Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

      +
      +
      +translate(addr)
      +

      Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

      +
      + +
      + +
      +
      +

      Marking Hosts Up or Down

      +
      +
      +class cassandra.policies.ConvictionPolicy(host)
      +

      A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

      +

      If custom behavior is needed, this class may be subclassed.

      +

      host is an instance of Host.

      +
      +
      +add_failure(connection_exc)
      +

      Implementations should return True if the host should be +convicted, False otherwise.

      +
      + +
      +
      +reset()
      +

      Implementations should clear out any convictions or state regarding +the host.

      +
      + +
      + +
      +
      +class cassandra.policies.SimpleConvictionPolicy(host)
      +

      The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

      +

      host is an instance of Host.

      +
      +
      +add_failure(connection_exc)
      +

      Implementations should return True if the host should be +convicted, False otherwise.

      +
      + +
      +
      +reset()
      +

      Implementations should clear out any convictions or state regarding +the host.

      +
      + +
      + +
      +
      +

      Reconnecting to Dead Hosts

      +
      +
      +class cassandra.policies.ReconnectionPolicy
      +

      This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

      +

      If custom behavior is needed, this class may be subclassed.

      +
      +
      +new_schedule()
      +

      This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

      +
      + +
      + +
      +
      +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
      +

      A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

      +

      delay should be a floating point number of seconds to wait inbetween +each attempt.

      +

      max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

      +
      +
      +new_schedule()
      +

      This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

      +
      + +
      + +
      +
      +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
      +

      A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

      +

      A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

      +

      base_delay and max_delay should be in floating point units of +seconds.

      +

      max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

      +
      +
      +new_schedule()
      +

      This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

      +
      + +
      + +
      +
      +

      Retrying Failed Operations

      +
      +
      +class cassandra.policies.WriteType
      +

      For usage with RetryPolicy, this describe a type +of write operation.

      +
      +
      +SIMPLE = 0
      +

      A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

      +
      + +
      +
      +BATCH = 1
      +

      A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

      +
      + +
      +
      +UNLOGGED_BATCH = 2
      +

      A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

      +
      + +
      +
      +COUNTER = 3
      +

      A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

      +
      + +
      +
      +BATCH_LOG = 4
      +

      The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

      +
      + +
      +
      +CAS = 5
      +

      A lighweight-transaction write, such as “DELETE … IF EXISTS”.

      +
      + +
      +
      +VIEW = 6
      +

      This WriteType is only seen in results for requests that were unable to +complete MV operations.

      +
      + +
      +
      +CDC = 7
      +

      This WriteType is only seen in results for requests that were unable to +complete CDC operations.

      +
      + +
      + +
      +
      +class cassandra.policies.RetryPolicy
      +

      A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

      +

      To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

      +

      To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

      +

      If custom behavior is needed for retrying certain operations, +this class may be subclassed.

      +
      +
      +RETRY = 0
      +

      This should be returned from the below methods if the operation +should be retried on the same connection.

      +
      + +
      +
      +RETHROW = 1
      +

      This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

      +
      + +
      +
      +IGNORE = 2
      +

      This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

      +
      + +
      +
      +RETRY_NEXT_HOST = 3
      +

      This should be returned from the below methods if the operation +should be retried on another connection.

      +
      + +
      +
      +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
      +

      This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

      +
      + +
      +
      +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
      +

      This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      write_type is one of the WriteType enums describing the +type of write operation.

      +

      The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

      +
      + +
      +
      +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
      +

      This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

      +

      query is the Statement that failed.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

      +
      + +
      +
      +on_request_error(query, consistency, error, retry_num)
      +

      This is called when an unexpected error happens. This can be in the +following situations:

      +
        +
      • On a connection error

      • +
      • On server errors: overloaded, isBootstrapping, serverError, etc.

      • +
      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      error the instance of the exception.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      The default, it triggers a retry on the next host in the query plan +with the same consistency level.

      +
      + +
      + +
      +
      +class cassandra.policies.FallthroughRetryPolicy
      +

      A retry policy that never retries and always propagates failures to +the application.

      +
      +
      +on_read_timeout(*args, **kwargs)
      +

      This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

      +
      + +
      +
      +on_write_timeout(*args, **kwargs)
      +

      This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      write_type is one of the WriteType enums describing the +type of write operation.

      +

      The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

      +
      + +
      +
      +on_unavailable(*args, **kwargs)
      +

      This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

      +

      query is the Statement that failed.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

      +
      + +
      +
      +on_request_error(*args, **kwargs)
      +

      This is called when an unexpected error happens. This can be in the +following situations:

      +
        +
      • On a connection error

      • +
      • On server errors: overloaded, isBootstrapping, serverError, etc.

      • +
      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      error the instance of the exception.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      The default, it triggers a retry on the next host in the query plan +with the same consistency level.

      +
      + +
      + +
      +
      +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
      +

      Deprecated: This retry policy will be removed in the next major release.

      +

      A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

      +

      BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

      +

      This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

      +
        +
      • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

      • +
      • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

      • +
      • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

      • +
      +

      The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

      +
        +
      • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

      • +
      • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

      • +
      +

      In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

      +
      +
      +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
      +

      This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

      +
      + +
      +
      +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
      +

      This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

      +

      query is the Statement that timed out.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      write_type is one of the WriteType enums describing the +type of write operation.

      +

      The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

      +
      + +
      +
      +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
      +

      This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

      +

      query is the Statement that failed.

      +

      consistency is the ConsistencyLevel that the operation was +attempted at.

      +

      required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

      +

      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

      +

      By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

      +
      + +
      + +
      +
      +

      Retrying Idempotent Operations

      +
      +
      +class cassandra.policies.SpeculativeExecutionPolicy
      +

      Interface for specifying speculative execution plans

      +
      +
      +new_plan(keyspace, statement)
      +

      Returns

      +
      +
      Parameters:
      +
        +
      • keyspace

      • +
      • statement

      • +
      +
      +
      Returns:
      +

      +
      +
      +
      + +
      + +
      +
      +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
      +

      A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

      +
      +
      +new_plan(keyspace, statement)
      +

      Returns

      +
      +
      Parameters:
      +
        +
      • keyspace

      • +
      • statement

      • +
      +
      +
      Returns:
      +

      +
      +
      +
      + +
      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/pool.html b/3.21.0-scylla/api/cassandra/pool.html new file mode 100644 index 0000000000..ee1fd5e939 --- /dev/null +++ b/3.21.0-scylla/api/cassandra/pool.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.pool - Hosts and Connection Pools

      +

      Connection pooling and host management.

      +
      +
      +class cassandra.pool.Host
      +

      Represents a single Cassandra node.

      +
      +
      +property address
      +

      The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

      +
      + +
      +
      +property datacenter
      +

      The datacenter the node is in.

      +
      + +
      +
      +property rack
      +

      The rack the node is in.

      +
      + +
      + +
      +
      +exception cassandra.pool.NoConnectionsAvailable
      +

      All existing connections to a given host are busy, or there are +no open connections.

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/protocol.html b/3.21.0-scylla/api/cassandra/protocol.html new file mode 100644 index 0000000000..f6826f6f5e --- /dev/null +++ b/3.21.0-scylla/api/cassandra/protocol.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.protocol - Protocol Features

      +
      +

      Custom Payloads

      +

      Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

      +

      By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

      +

      See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

      +
      +
      +class cassandra.protocol._ProtocolHandler
      +

      _ProtocolHander handles encoding and decoding messages.

      +

      This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

      +

      Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

      +
      +
      +message_types_by_opcode = {default mapping}
      +
      + +
      +
      +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
      +

      Encodes a message using the specified frame parameters, and compressor

      +
      +
      Parameters:
      +
        +
      • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

      • +
      • stream_id – protocol stream id for the frame header

      • +
      • protocol_version – version for the frame header, and used encoding contents

      • +
      • compressor – optional compression function to be used on the body

      • +
      +
      +
      +
      + +
      +
      +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
      +

      Decodes a native protocol message body

      +
      +
      Parameters:
      +
        +
      • protocol_version – version to use decoding contents

      • +
      • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

      • +
      • stream_id – native protocol stream id from the frame header

      • +
      • flags – native protocol flags bitmap from the header

      • +
      • opcode – native protocol opcode from the header

      • +
      • body – frame body

      • +
      • decompressor – optional decompression function to inflate the body

      • +
      +
      +
      Returns:
      +

      a message decoded from the body and frame attributes

      +
      +
      +
      + +
      + +
      +
      +

      Faster Deserialization

      +

      When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

      +
      from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
      +from cassandra.query import tuple_factory
      +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
      +s.row_factory = tuple_factory  #required for Numpy results
      +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
      +
      +
      +

      These protocol handlers comprise different parsers, and return results as described below:

      +
        +
      • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

      • +
      • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

      • +
      • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

      • +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/query.html b/3.21.0-scylla/api/cassandra/query.html new file mode 100644 index 0000000000..aa79f3340c --- /dev/null +++ b/3.21.0-scylla/api/cassandra/query.html @@ -0,0 +1,1037 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

      +
      +
      +cassandra.query.tuple_factory(colnames, rows)
      +

      Returns each row as a tuple

      +

      Example:

      +
      >>> from cassandra.query import tuple_factory
      +>>> session = cluster.connect('mykeyspace')
      +>>> session.row_factory = tuple_factory
      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
      +>>> print rows[0]
      +('Bob', 42)
      +
      +
      +
      +

      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

      +
      +
      + +
      +
      +cassandra.query.named_tuple_factory(colnames, rows)
      +

      Returns each row as a namedtuple. +This is the default row factory.

      +

      Example:

      +
      >>> from cassandra.query import named_tuple_factory
      +>>> session = cluster.connect('mykeyspace')
      +>>> session.row_factory = named_tuple_factory
      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
      +>>> user = rows[0]
      +
      +>>> # you can access field by their name:
      +>>> print "name: %s, age: %d" % (user.name, user.age)
      +name: Bob, age: 42
      +
      +>>> # or you can access fields by their position (like a tuple)
      +>>> name, age = user
      +>>> print "name: %s, age: %d" % (name, age)
      +name: Bob, age: 42
      +>>> name = user[0]
      +>>> age = user[1]
      +>>> print "name: %s, age: %d" % (name, age)
      +name: Bob, age: 42
      +
      +
      +
      +

      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

      +
      +
      + +
      +
      +cassandra.query.dict_factory(colnames, rows)
      +

      Returns each row as a dict.

      +

      Example:

      +
      >>> from cassandra.query import dict_factory
      +>>> session = cluster.connect('mykeyspace')
      +>>> session.row_factory = dict_factory
      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
      +>>> print rows[0]
      +{u'age': 42, u'name': u'Bob'}
      +
      +
      +
      +

      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

      +
      +
      + +
      +
      +cassandra.query.ordered_dict_factory(colnames, rows)
      +

      Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

      +
      +

      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

      +
      +
      + +
      +
      +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
      +

      A simple, un-prepared query.

      +

      query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

      +

      See Statement attributes for a description of the other parameters.

      +
      + +
      +
      +class cassandra.query.PreparedStatement
      +

      A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

      +

      A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

      +

      A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

      +
      +
      +bind(values)
      +

      Creates and returns a BoundStatement instance using values.

      +

      See BoundStatement.bind() for rules on input values.

      +
      + +
      + +
      +
      +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
      +

      A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

      +

      prepared_statement should be an instance of PreparedStatement.

      +

      See Statement attributes for a description of the other parameters.

      +
      +
      +bind(values)
      +

      Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

      +
        +
      • a sequence, even if you are only binding one value, or

      • +
      • a dict that relates 1-to-1 between dict keys and columns

      • +
      +
      +

      Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

      +
        +
      • short sequences will be extended to match bind parameters with UNSET_VALUE

      • +
      • names may be omitted from a dict with UNSET_VALUE implied.

      • +
      +
      +
      +

      Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

      +
      +
      + +
      +
      +property routing_key
      +

      The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

      +

      If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

      +
      + +
      + +
      +
      +class cassandra.query.Statement
      +

      An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

      +
      +
      +property routing_key
      +

      The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

      +

      If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

      +
      + +
      +
      +property serial_consistency_level
      +

      The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

      +

      The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

      +

      The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

      +

      Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

      +

      See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

      +
      +

      New in version 2.0.0.

      +
      +
      + +
      + +
      +
      +cassandra.query.UNSET_VALUE
      +

      The base class of the class hierarchy.

      +

      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

      +
      + +
      +
      +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
      +

      A protocol-level batch of operations which are applied atomically +by default.

      +
      +

      New in version 2.0.0.

      +
      +

      batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

      +

      retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

      +

      consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

      +

      custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

      +

      Example usage:

      +
      insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
      +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
      +
      +for (name, age) in users_to_insert:
      +    batch.add(insert_user, (name, age))
      +
      +session.execute(batch)
      +
      +
      +

      You can also mix different types of operations within a batch:

      +
      batch = BatchStatement()
      +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
      +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
      +session.execute(batch)
      +
      +
      +
      +

      New in version 2.0.0.

      +
      +
      +

      Changed in version 2.1.0: Added serial_consistency_level as a parameter

      +
      +
      +

      Changed in version 2.6.0: Added custom_payload as a parameter

      +
      +
      +
      +add(statement, parameters=None)
      +

      Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

      +

      Like with other statements, parameters must be a sequence, even +if there is only one item.

      +
      + +
      +
      +add_all(statements, parameters)
      +

      Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

      +
      + +
      +
      +clear()
      +

      This is a convenience method to clear a batch statement for reuse.

      +

      Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

      +
      + +
      +
      +serial_consistency_level = None
      +
      + +
      + +
      +
      +class cassandra.query.BatchType
      +

      A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

      +
      +

      New in version 2.0.0.

      +
      +
      +
      +LOGGED = BatchType.LOGGED
      +
      + +
      +
      +UNLOGGED = BatchType.UNLOGGED
      +
      + +
      +
      +COUNTER = BatchType.COUNTER
      +
      + +
      + +
      +
      +class cassandra.query.ValueSequence(iterable=(), /)
      +

      A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

      +

      This is typically needed when supplying a list of keys to select. +For example:

      +
      >>> my_user_ids = ('alice', 'bob', 'charles')
      +>>> query = "SELECT * FROM users WHERE user_id IN %s"
      +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
      +
      +
      +
      + +
      +
      +class cassandra.query.QueryTrace
      +

      A trace of the duration and events that occurred when executing +an operation.

      +
      +
      +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
      +

      Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

      +

      wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

      +

      query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

      +
      + +
      + +
      +
      +class cassandra.query.TraceEvent
      +

      Representation of a single event within a query trace.

      +
      + +
      +
      +exception cassandra.query.TraceUnavailable
      +

      Raised when complete trace details cannot be fetched from Cassandra.

      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/timestamps.html b/3.21.0-scylla/api/cassandra/timestamps.html new file mode 100644 index 0000000000..3ff7970d0d --- /dev/null +++ b/3.21.0-scylla/api/cassandra/timestamps.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.timestamps - Timestamp Generation

      +
      +
      +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
      +

      An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

      +
      +

      New in version 3.8.0.

      +
      +
      +
      +warn_on_drift = True
      +

      If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

      +
      + +
      +
      +warning_threshold = 1
      +

      This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

      +
      + +
      +
      +warning_interval = 1
      +

      This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

      +
      + +
      +
      +_next_timestamp(now, last)
      +

      Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

      +
      +
      Parameters:
      +
        +
      • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

      • +
      • last (int) – an integer representing the last timestamp returned by +this object

      • +
      +
      +
      +
      + +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/cassandra/util.html b/3.21.0-scylla/api/cassandra/util.html new file mode 100644 index 0000000000..8b69ef3a8f --- /dev/null +++ b/3.21.0-scylla/api/cassandra/util.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      cassandra.util - Utilities

      +
      +
      +class cassandra.util.Date(value)
      +

      Idealized date: year, month, day

      +

      Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

      +

      Initializer value can be:

      +
        +
      • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

      • +
      • datetime.date: built-in date

      • +
      • string_type: a string time of the form “yyyy-mm-dd”

      • +
      +
      +
      +date()
      +

      Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

      +

      ValueError is raised for Dates outside this range.

      +
      + +
      +
      +property seconds
      +

      Absolute seconds from epoch (can be negative)

      +
      + +
      + +
      +
      +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
      +

      DSE DateRange Type

      +
      +
      +lower_bound
      +

      DateRangeBound representing the lower bound of a bounded range.

      +
      + +
      +
      +upper_bound
      +

      DateRangeBound representing the upper bound of a bounded range.

      +
      + +
      +
      +value
      +

      DateRangeBound representing the value of a single-value range.

      +
      + +

      As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

      +
      +
      Parameters:
      +
      +
      +
      +
      + +
      +
      +class cassandra.util.DateRangeBound(value, precision)
      +

      Represents a single date value and its precision for DateRange.

      +
      +
      +milliseconds
      +

      Integer representing milliseconds since the UNIX epoch. May be negative.

      +
      + +
      +
      +precision
      +

      String representing the precision of a bound. Must be a valid +DateRangePrecision member.

      +
      + +

      DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

      +
      +
      Parameters:
      +
        +
      • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

      • +
      • precision – a string representing precision

      • +
      +
      +
      +
      +
      +datetime()
      +

      Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

      +
      + +
      +
      +classmethod from_value(value)
      +

      Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

      +
      +
      Parameters:
      +

      value – a dictlike or iterable object

      +
      +
      +
      + +
      + +
      +
      +class cassandra.util.DateRangePrecision
      +

      An “enum” representing the valid values for DateRange.precision.

      +
      + +
      +
      +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
      +

      Represents a Distance geometry for DSE

      +
      +
      +static from_wkt(s)
      +

      Parse a Distance geometry from a wkt string and return a new Distance object.

      +
      + +
      + +
      +
      +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
      +

      Cassandra Duration Type

      +
      + +
      +
      +class cassandra.util.LineString(coords=())
      +

      Represents a linestring geometry for DSE

      +

      ‘coords`: a sequence of (x, y) coordinates of points in the linestring

      +
      +
      +static from_wkt(s)
      +

      Parse a LineString geometry from a wkt string and return a new LineString object.

      +
      + +
      + +
      +
      +class cassandra.util.OrderedMap(*args, **kwargs)
      +

      An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

      +
      >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
      +...                  ({'three': 3, 'four': 4}, 'value2')])
      +>>> list(od.keys())
      +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
      +>>> list(od.values())
      +['value', 'value2']
      +
      +
      +

      These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

      +
      CREATE TABLE example (
      +    ...
      +    value map<frozen<map<int, int>>, double>
      +    ...
      +)
      +
      +
      +

      This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

      +
      + +
      +
      +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
      +
      + +
      +
      +class cassandra.util.Point(x=nan, y=nan)
      +

      Represents a point geometry for DSE

      +
      +
      +static from_wkt(s)
      +

      Parse a Point geometry from a wkt string and return a new Point object.

      +
      + +
      + +
      +
      +class cassandra.util.Polygon(exterior=(), interiors=None)
      +

      Represents a polygon geometry for DSE

      +

      ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

      +
      +
      +static from_wkt(s)
      +

      Parse a Polygon geometry from a wkt string and return a new Polygon object.

      +
      + +
      + +
      +
      +class cassandra.util.SortedSet(iterable=())
      +

      A sorted set based on sorted list

      +

      A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

      +

      #Not implemented: update functions, inplace operators

      +
      + +
      +
      +class cassandra.util.Time(value)
      +

      Idealized time, independent of day.

      +

      Up to nanosecond resolution

      +

      Initializer value can be:

      +
        +
      • integer_type: absolute nanoseconds in the day

      • +
      • datetime.time: built-in time

      • +
      • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

      • +
      +
      +
      +property hour
      +

      The hour component of this time (0-23)

      +
      + +
      +
      +property minute
      +

      The minute component of this time (0-59)

      +
      + +
      +
      +property nanosecond
      +

      The fractional seconds component of the time, in nanoseconds

      +
      + +
      +
      +property second
      +

      The second component of this time (0-59)

      +
      + +
      +
      +time()
      +

      Return a built-in datetime.time (nanosecond precision truncated to micros).

      +
      + +
      + +
      +
      +class cassandra.util.Version(version)
      +

      Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

      +

      TODO: when python2 support is removed, use packaging.version.

      +
      + +
      +
      +cassandra.util.datetime_from_timestamp(timestamp)
      +

      Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

      +
      +
      Parameters:
      +

      timestamp – a unix timestamp, in seconds

      +
      +
      +
      + +
      +
      +cassandra.util.datetime_from_uuid1(uuid_arg)
      +

      Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

      +
      +
      Parameters:
      +

      uuid_arg – a version 1 UUID

      +
      +
      +
      + +
      +
      +cassandra.util.max_uuid_from_time(timestamp)
      +

      Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

      +

      See uuid_from_time() for argument and return types.

      +
      + +
      +
      +cassandra.util.min_uuid_from_time(timestamp)
      +

      Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

      +

      See uuid_from_time() for argument and return types.

      +
      + +
      +
      +cassandra.util.ms_timestamp_from_datetime(dt)
      +

      Converts a datetime to a timestamp expressed in milliseconds.

      +
      +
      Parameters:
      +

      dt – a datetime.datetime

      +
      +
      +
      + +
      +
      +cassandra.util.sortedset
      +

      alias of SortedSet

      +
      + +
      +
      +cassandra.util.unix_time_from_uuid1(uuid_arg)
      +

      Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

      +
      +
      Parameters:
      +

      uuid_arg – a version 1 UUID

      +
      +
      +
      + +
      +
      +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
      +

      Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

      +

      Raises an OverflowError if the timestamp is out of range for +datetime.

      +
      +
      Parameters:
      +

      timestamp – timestamp, in milliseconds

      +
      +
      +
      + +
      +
      +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
      +

      Converts a datetime or timestamp to a type 1 uuid.UUID.

      +
      +
      Parameters:
      +
        +
      • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

      • +
      • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

      • +
      • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

      • +
      +
      +
      Return type:
      +

      uuid.UUID

      +
      +
      +
      + +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/api/index.html b/3.21.0-scylla/api/index.html new file mode 100644 index 0000000000..675181c2a4 --- /dev/null +++ b/3.21.0-scylla/api/index.html @@ -0,0 +1,860 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      API Documentation

      +
      +

      Core Driver

      +
      + +
      +
      +
      +

      Object Mapper

      + +
      +
      +

      DataStax Graph

      + +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/batches.html b/3.21.0-scylla/cqlengine/batches.html new file mode 100644 index 0000000000..8c7eee0100 --- /dev/null +++ b/3.21.0-scylla/cqlengine/batches.html @@ -0,0 +1,729 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + + + +
      +

      Batch Queries

      +

      cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

      +
      +

      Batch Query General Use Pattern

      +

      You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

      +
      from cassandra.cqlengine.query import BatchQuery
      +
      +#using a context manager
      +with BatchQuery() as b:
      +    now = datetime.now()
      +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
      +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
      +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
      +
      +# -- or --
      +
      +#manually
      +b = BatchQuery()
      +now = datetime.now()
      +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
      +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
      +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
      +b.execute()
      +
      +# updating in a batch
      +
      +b = BatchQuery()
      +em1.description = "new description"
      +em1.batch(b).save()
      +em2.description = "another new description"
      +em2.batch(b).save()
      +b.execute()
      +
      +# deleting in a batch
      +b = BatchQuery()
      +ExampleModel.objects(id=some_id).batch(b).delete()
      +ExampleModel.objects(id=some_id2).batch(b).delete()
      +b.execute()
      +
      +
      +

      Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

      +
      with BatchQuery(execute_on_exception=True) as b:
      +    LogEntry.batch(b).create(k=1, v=1)
      +    mystery_function() # exception thrown in here
      +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
      +
      +
      +

      If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

      +
      +
      +

      Batch Query Execution Callbacks

      +

      In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

      +

      Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

      +

      The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

      +
      def my_callback(*args, **kwargs):
      +    pass
      +
      +batch = BatchQuery()
      +
      +batch.add_callback(my_callback)
      +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
      +
      +# if you need reference to the batch within the callback,
      +# just trap it in the arguments to be passed to the callback:
      +batch.add_callback(my_callback, cqlengine_batch=batch)
      +
      +# once the batch executes...
      +batch.execute()
      +
      +# the effect of the above scheduled callbacks will be similar to
      +my_callback()
      +my_callback('positional arg', named_arg='named arg value')
      +my_callback(cqlengine_batch=batch)
      +
      +
      +

      Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

      +
      +

      Logged vs Unlogged Batches

      +

      By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

      +
      from cassandra.cqlengine.query import BatchType
      +with BatchQuery(batch_type=BatchType.Unlogged) as b:
      +    LogEntry.batch(b).create(k=1, v=1)
      +    LogEntry.batch(b).create(k=1, v=2)
      +
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/connections.html b/3.21.0-scylla/cqlengine/connections.html new file mode 100644 index 0000000000..b7b7f6f13f --- /dev/null +++ b/3.21.0-scylla/cqlengine/connections.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + + + +
      +

      Connections

      +

      Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

      +
      +

      Register a new connection

      +

      To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

      +
      from cassandra.cqlengine import connection
      +
      +connection.setup(['127.0.0.1')
      +connection.register_connection('cluster2', ['127.0.0.2'])
      +
      +
      +

      register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

      +
      from cassandra.cqlengine import connection
      +from cassandra.cluster import Cluster
      +
      +session = Cluster(['127.0.0.1']).connect()
      +connection.register_connection('cluster3', session=session)
      +
      +
      +
      +
      +

      Change the default connection

      +

      You can change the default cqlengine connection on registration:

      +
      from cassandra.cqlengine import connection
      +
      +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
      +
      +
      +

      or on the fly using set_default_connection()

      +
      connection.set_default_connection('cluster2')
      +
      +
      +
      +
      +

      Unregister a connection

      +

      You can unregister a connection using unregister_connection():

      +
      connection.unregister_connection('cluster2')
      +
      +
      +
      +
      +

      Management

      +

      When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

      +
      from cassandra.cqlengine import management
      +
      +keyspaces = ['ks1', 'ks2']
      +conns = ['cluster1', 'cluster2']
      +
      +# registers your connections
      +# ...
      +
      +# create all keyspaces on all connections
      +for ks in keyspaces:
      +    management.create_simple_keyspace(ks, connections=conns)
      +
      +# define your Automobile model
      +# ...
      +
      +# sync your models
      +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
      +
      +
      +
      +
      +

      Connection Selection

      +

      cqlengine will select the default connection, unless your specify a connection using one of the following methods.

      +
      +

      Default Model Connection

      +

      You can specify a default connection per model:

      +
      class Automobile(Model):
      +    __keyspace__ = 'test'
      +    __connection__ = 'cluster2'
      +    manufacturer = columns.Text(primary_key=True)
      +    year = columns.Integer(primary_key=True)
      +    model = columns.Text(primary_key=True)
      +
      +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
      +
      +
      +
      +
      +

      QuerySet and model instance

      +

      You can use the using() method to select a connection (or keyspace):

      +
      Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
      +q = Automobile.objects.filter(manufacturer='Tesla')
      +autos = q.using(keyspace='ks2', connection='cluster2').all()
      +
      +for auto in autos:
      +    auto.using(connection='cluster1').save()
      +
      +
      +
      +
      +

      Context Manager

      +

      You can use the ContextQuery as well to select a connection:

      +
      with ContextQuery(Automobile, connection='cluster1') as A:
      +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
      +
      +
      +
      +
      +

      BatchQuery

      +

      With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

      +
      with BatchQuery(connection='cluster1') as b:
      +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
      +
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/faq.html b/3.21.0-scylla/cqlengine/faq.html new file mode 100644 index 0000000000..0231341e6a --- /dev/null +++ b/3.21.0-scylla/cqlengine/faq.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Frequently Asked Questions

      +
      +

      Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

      +

      The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

      +
      +
      +

      How to preserve ordering in batch query?

      +

      Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

      +
        +
      • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

      • +
      • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

      • +
      • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

      • +
      +

      Below is an example to show this scenario.

      +
      class MyMode(Model):
      +    id    = columns.Integer(primary_key=True)
      +    count = columns.Integer()
      +    text  = columns.Text()
      +
      +with BatchQuery() as b:
      +   MyModel.batch(b).create(id=1, count=2, text='123')
      +   MyModel.batch(b).create(id=1, count=3, text='111')
      +
      +assert MyModel.objects(id=1).first().count == 3
      +assert MyModel.objects(id=1).first().text  == '123'
      +
      +
      +

      The largest value of count is 3, and the largest value of text would be ‘123’.

      +

      The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

      +
      with BatchQuery() as b:
      +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
      +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
      +
      +assert MyModel.objects(id=1).first().count == 3
      +assert MyModel.objects(id=1).first().text  == '111'
      +
      +
      +
      +
      +

      How can I delete individual values from a row?

      +

      When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

      +
      class MyModel(Model):
      +    id    = columns.Integer(primary_key=True)
      +    text  = columns.Text()
      +
      +m = MyModel.create(id=1, text='We can delete this with None')
      +assert MyModel.objects(id=1).first().text is not None
      +
      +m.update(text=None)
      +assert MyModel.objects(id=1).first().text is None
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/models.html b/3.21.0-scylla/cqlengine/models.html new file mode 100644 index 0000000000..d07a3c0bbd --- /dev/null +++ b/3.21.0-scylla/cqlengine/models.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + + + +
      +

      Models

      +

      A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

      +

      Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

      +

      Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

      +
      +

      Example Definitions

      +

      This example defines a Person table, with the columns first_name and last_name

      +
      from cassandra.cqlengine import columns
      +from cassandra.cqlengine.models import Model
      +
      + class Person(Model):
      +     id = columns.UUID(primary_key=True)
      +     first_name  = columns.Text()
      +     last_name = columns.Text()
      +
      +
      +

      The Person model would create this CQL table:

      +
      CREATE TABLE cqlengine.person (
      +    id uuid,
      +    first_name text,
      +    last_name text,
      +    PRIMARY KEY (id)
      +);
      +
      +
      +

      Here’s an example of a comment table created with clustering keys, in descending order:

      +
      from cassandra.cqlengine import columns
      +from cassandra.cqlengine.models import Model
      +
      +class Comment(Model):
      +    photo_id = columns.UUID(primary_key=True)
      +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
      +    comment = columns.Text()
      +
      +
      +

      The Comment model’s create table would look like the following:

      +
      CREATE TABLE comment (
      +  photo_id uuid,
      +  comment_id timeuuid,
      +  comment text,
      +  PRIMARY KEY (photo_id, comment_id)
      +) WITH CLUSTERING ORDER BY (comment_id DESC);
      +
      +
      +

      To sync the models to the database, you may do the following*:

      +
      from cassandra.cqlengine.management import sync_table
      +sync_table(Person)
      +sync_table(Comment)
      +
      +
      +

      *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

      +

      For examples on manipulating data and creating queries, see Making Queries

      +
      +
      +

      Manipulating model instances as dictionaries

      +

      Model instances can be accessed like dictionaries.

      +
      class Person(Model):
      +    first_name  = columns.Text()
      +    last_name = columns.Text()
      +
      +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
      +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
      +kevin['first_name']  # returns 'Kevin'
      +kevin.keys()  # returns ['first_name', 'last_name']
      +kevin.values()  # returns ['Kevin', 'Deldycke']
      +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
      +
      +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
      +
      +
      +
      +
      +

      Extending Model Validation

      +

      Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

      +

      However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

      +
      class Member(Model):
      +    person_id = UUID(primary_key=True)
      +    name = Text(required=True)
      +
      +    def validate(self):
      +        super(Member, self).validate()
      +        if self.name == 'jon':
      +            raise ValidationError('no jon\'s allowed')
      +
      +
      +

      Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

      +
      +
      +

      Model Inheritance

      +

      It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

      +

      For instance, suppose you want a table that stores rows of pets owned by an owner:

      +
      class Pet(Model):
      +    __table_name__ = 'pet'
      +    owner_id = UUID(primary_key=True)
      +    pet_id = UUID(primary_key=True)
      +    pet_type = Text(discriminator_column=True)
      +    name = Text()
      +
      +    def eat(self, food):
      +        pass
      +
      +    def sleep(self, time):
      +        pass
      +
      +class Cat(Pet):
      +    __discriminator_value__ = 'cat'
      +    cuteness = Float()
      +
      +    def tear_up_couch(self):
      +        pass
      +
      +class Dog(Pet):
      +    __discriminator_value__ = 'dog'
      +    fierceness = Float()
      +
      +    def bark_all_night(self):
      +        pass
      +
      +
      +

      After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

      +

      To setup a model structure with inheritance, follow these steps

      +
        +
      1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

      2. +
      3. Create subclass models, and define a unique __discriminator_value__ value on each

      4. +
      5. Run sync_table on each of the sub tables

      6. +
      +

      About the discriminator value

      +

      The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

      +
      +
      +

      User Defined Types

      +

      cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

      +
      from cassandra.cqlengine.columns import *
      +from cassandra.cqlengine.models import Model
      +from cassandra.cqlengine.usertype import UserType
      +
      +class address(UserType):
      +    street = Text()
      +    zipcode = Integer()
      +
      +class users(Model):
      +    __keyspace__ = 'account'
      +    name = Text(primary_key=True)
      +    addr = UserDefinedType(address)
      +
      +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
      +user = users.objects(name="Joe")[0]
      +print user.name, user.addr
      +# Joe address(street=u'Easy St.', zipcode=99999)
      +
      +
      +

      UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

      +

      sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

      +

      Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

      +

      *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/queryset.html b/3.21.0-scylla/cqlengine/queryset.html new file mode 100644 index 0000000000..e7bab6481a --- /dev/null +++ b/3.21.0-scylla/cqlengine/queryset.html @@ -0,0 +1,994 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Making Queries

      +
      +

      Retrieving objects

      +

      Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

      +
      +

      Retrieving all objects

      +

      The simplest query you can make is to return all objects from a table.

      +

      This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

      +

      Using the Person example model, we would get all Person objects like this:

      +
      all_objects = Person.objects.all()
      +
      +
      +
      +
      +

      Retrieving objects with filters

      +

      Typically, you’ll want to query only a subset of the records in your database.

      +

      That can be accomplished with the QuerySet’s .filter(\*\*) method.

      +

      For example, given the model definition:

      +
      class Automobile(Model):
      +    manufacturer = columns.Text(primary_key=True)
      +    year = columns.Integer(primary_key=True)
      +    model = columns.Text()
      +    price = columns.Decimal()
      +    options = columns.Set(columns.Text)
      +
      +
      +

      …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +
      +
      +

      You can also use the more convenient syntax:

      +
      q = Automobile.objects(Automobile.manufacturer == 'Tesla')
      +
      +
      +

      We can then further filter our query with another call to .filter

      +
      q = q.filter(year=2012)
      +
      +
      +

      Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

      +
      +
      +
      +

      Accessing objects in a QuerySet

      +

      There are several methods for getting objects out of a queryset

      +
        +
      • +
        iterating over the queryset
        for car in Automobile.objects.all():
        +    #...do something to the car instance
        +    pass
        +
        +
        +
        +
        +
      • +
      • +
        list index
        q = Automobile.objects.all()
        +q[0] #returns the first result
        +q[1] #returns the second result
        +
        +
        +
        +

        Note

        +
          +
        • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

        • +
        • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

        • +
        +
        +
        +
        +
      • +
      • +
        list slicing
        q = Automobile.objects.all()
        +q[1:] #returns all results except the first
        +q[1:9] #returns a slice of the results
        +
        +
        +
        +

        Note

        +
          +
        • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

        • +
        • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

        • +
        +
        +
        +
        +
      • +
      • +
        calling get() on the queryset
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year=2012)
        +car = q.get()
        +
        +
        +

        this returns the object matching the queryset

        +
        +
        +
      • +
      • +
        calling first() on the queryset
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year=2012)
        +car = q.first()
        +
        +
        +

        this returns the first value in the queryset

        +
        +
        +
      • +
      +
      +
      +

      Filtering Operators

      +

      Equal To

      +

      The default filtering operator.

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q = q.filter(year=2012)  #year == 2012
      +
      +
      +

      In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

      +

      in (__in)

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q = q.filter(year__in=[2011, 2012])
      +
      +
      +

      > (__gt)

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q = q.filter(year__gt=2010)  # year > 2010
      +
      +# or the nicer syntax
      +
      +q.filter(Automobile.year > 2010)
      +
      +
      +

      >= (__gte)

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q = q.filter(year__gte=2010)  # year >= 2010
      +
      +# or the nicer syntax
      +
      +q.filter(Automobile.year >= 2010)
      +
      +
      +

      < (__lt)

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q = q.filter(year__lt=2012)  # year < 2012
      +
      +# or...
      +
      +q.filter(Automobile.year < 2012)
      +
      +
      +

      <= (__lte)

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q = q.filter(year__lte=2012)  # year <= 2012
      +
      +q.filter(Automobile.year <= 2012)
      +
      +
      +

      CONTAINS (__contains)

      +

      The CONTAINS operator is available for all collection types (List, Set, Map).

      +
      q = Automobile.objects.filter(manufacturer='Tesla')
      +q.filter(options__contains='backup camera').allow_filtering()
      +
      +
      +

      Note that we need to use allow_filtering() since the options column has no secondary index.

      +

      LIKE (__like)

      +

      The LIKE operator is available for text columns that have a SASI secondary index.

      +
      q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
      +
      +
      +

      IS NOT NULL (IsNotNull(column_name))

      +

      The IS NOT NULL operator is not yet supported for C*.

      +
      q = Automobile.objects.filter(IsNotNull('model'))
      +
      +
      +

      Limitations:

      +
        +
      • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

      • +
      • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

      • +
      +
      +
      +

      TimeUUID Functions

      +

      In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

      +
      +
      +class cqlengine.queryset.MinTimeUUID(datetime)
      +

      returns the minimum time uuid value possible for the given datetime

      +
      + +
      +
      +class cqlengine.queryset.MaxTimeUUID(datetime)
      +

      returns the maximum time uuid value possible for the given datetime

      +
      + +

      Example

      +
      class DataStream(Model):
      +    id      = columns.UUID(partition_key=True)
      +    time    = columns.TimeUUID(primary_key=True)
      +    data    = columns.Bytes()
      +
      +min_time = datetime(1982, 1, 1)
      +max_time = datetime(1982, 3, 9)
      +
      +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
      +
      +
      +
      +
      +

      Token Function

      +

      Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

      +

      See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

      +

      Example

      +
      class Items(Model):
      +    id      = columns.Text(primary_key=True)
      +    data    = columns.Bytes()
      +
      +query = Items.objects.all().limit(10)
      +
      +first_page = list(query);
      +last = first_page[-1]
      +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
      +
      +
      +
      +
      +

      QuerySets are immutable

      +

      When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

      +

      Example

      +
      #this produces 3 different querysets
      +#q does not change after it's initial definition
      +q = Automobiles.objects.filter(year=2012)
      +tesla2012 = q.filter(manufacturer='Tesla')
      +honda2012 = q.filter(manufacturer='Honda')
      +
      +
      +
      +
      +

      Ordering QuerySets

      +

      Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

      +

      However, you can set a column to order on with the .order_by(column_name) method.

      +

      Example

      +
      #sort ascending
      +q = Automobiles.objects.all().order_by('year')
      +#sort descending
      +q = Automobiles.objects.all().order_by('-year')
      +
      +
      +

      Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

      +

      For instance, given our Automobile model, year is the only column we can order on.

      +
      +
      +

      Values Lists

      +

      There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

      +
      items = list(range(20))
      +random.shuffle(items)
      +for i in items:
      +    TestModel.create(id=1, clustering_key=i)
      +
      +values = list(TestModel.objects.values_list('clustering_key', flat=True))
      +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
      +
      +
      +
      +
      +

      Per Query Timeouts

      +

      By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

      +
      class Row(Model):
      +    id = columns.Integer(primary_key=True)
      +    name = columns.Text()
      +
      +
      +

      Fetch all objects with a timeout of 5 seconds

      +
      Row.objects().timeout(5).all()
      +
      +
      +

      Create a single row with a 50ms timeout

      +
      Row(id=1, name='Jon').timeout(0.05).create()
      +
      +
      +

      Delete a single row with no timeout

      +
      Row(id=1).timeout(None).delete()
      +
      +
      +

      Update a single row with no timeout

      +
      Row(id=1).timeout(None).update(name='Blake')
      +
      +
      +

      Batch query timeouts

      +
      with BatchQuery(timeout=10) as b:
      +    Row(id=1, name='Jon').create()
      +
      +
      +

      NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

      +
      +
      +

      Default TTL and Per Query TTL

      +

      Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

      +

      Example:

      +
      class User(Model):
      +    __options__ = {'default_time_to_live': 20}
      +
      +    user_id = columns.UUID(primary_key=True)
      +    ...
      +
      +
      +

      You can set TTL per-query if needed. Here are a some examples:

      +

      Example:

      +
      class User(Model):
      +    __options__ = {'default_time_to_live': 20}
      +
      +    user_id = columns.UUID(primary_key=True)
      +    ...
      +
      +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
      +
      +user.ttl(30).update(age=21)            # Update the TTL to 30
      +User.objects.ttl(10).create(user_id=1)  # TTL 10
      +User(user_id=1, age=21).ttl(10).save()  # TTL 10
      +
      +
      +
      +
      +

      Named Tables

      +

      Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

      +
      from cassandra.cqlengine.connection import setup
      +setup("127.0.0.1", "cqlengine_test")
      +
      +from cassandra.cqlengine.named import NamedTable
      +user = NamedTable("cqlengine_test", "user")
      +user.objects()
      +user.objects()[0]
      +
      +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/third_party.html b/3.21.0-scylla/cqlengine/third_party.html new file mode 100644 index 0000000000..3e475864fe --- /dev/null +++ b/3.21.0-scylla/cqlengine/third_party.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Third party integrations

      +
      +

      Celery

      +

      Here’s how, in substance, CQLengine can be plugged to Celery:

      +
      from celery import Celery
      +from celery.signals import worker_process_init, beat_init
      +from cassandra.cqlengine import connection
      +from cassandra.cqlengine.connection import (
      +    cluster as cql_cluster, session as cql_session)
      +
      +def cassandra_init(**kwargs):
      +    """ Initialize a clean Cassandra connection. """
      +    if cql_cluster is not None:
      +        cql_cluster.shutdown()
      +    if cql_session is not None:
      +        cql_session.shutdown()
      +    connection.setup()
      +
      +# Initialize worker context for both standard and periodic tasks.
      +worker_process_init.connect(cassandra_init)
      +beat_init.connect(cassandra_init)
      +
      +app = Celery()
      +
      +
      +
      +
      +

      uWSGI

      +

      This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

      +
      from cassandra.cqlengine import connection
      +from cassandra.cqlengine.connection import (
      +    cluster as cql_cluster, session as cql_session)
      +
      +try:
      +    from uwsgidecorators import postfork
      +except ImportError:
      +    # We're not in a uWSGI context, no need to hook Cassandra session
      +    # initialization to the postfork event.
      +    pass
      +else:
      +    @postfork
      +    def cassandra_init(**kwargs):
      +        """ Initialize a new Cassandra session in the context.
      +
      +        Ensures that a new session is returned for every new request.
      +        """
      +        if cql_cluster is not None:
      +            cql_cluster.shutdown()
      +        if cql_session is not None:
      +            cql_session.shutdown()
      +        connection.setup()
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/cqlengine/upgrade_guide.html b/3.21.0-scylla/cqlengine/upgrade_guide.html new file mode 100644 index 0000000000..95ad1057d2 --- /dev/null +++ b/3.21.0-scylla/cqlengine/upgrade_guide.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + + + +
      +

      Upgrade Guide

      +

      This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

      +

      THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

      +
      +

      Functional Changes

      +
      +

      List Prepend Reversing

      +

      Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

      +
      +
      +

      Date Column Type

      +

      The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

      +
      +
      +
      +

      Remove cqlengine

      +

      To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

      +

      The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

      +
      +
      +

      Organization

      +
      +

      Imports

      +

      cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

      +
      from cassandra.cqlengine import columns
      +
      +
      +

      is now:

      +
      from cassandra.cqlengine import columns
      +
      +
      +
      +
      +

      Package-Level Aliases

      +

      Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

      +

      Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

      +

      These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

      +
      +
      +

      Exceptions

      +

      The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

      + + + + + + + + + + + + + + + + + + + + + + + + + + +

      Exception class

      New module

      CQLEngineException

      cassandra.cqlengine

      ModelException

      cassandra.cqlengine.models

      ValidationError

      cassandra.cqlengine

      UndefinedKeyspaceException

      cassandra.cqlengine.connection

      LWTException

      cassandra.cqlengine.query

      IfNotExistsWithCounterColumn

      cassandra.cqlengine.query

      +
      +
      +

      UnicodeMixin Consolidation

      +

      class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

      +
      +
      +
      +

      API Deprecations

      +

      This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

      +
      +

      Float/Double Overload

      +

      Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

      +
      +
      +

      Schema Management

      +

      cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

      + +

      cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

      +
      +
      +

      Model Inheritance

      +

      The names for class attributes controlling model inheritance are changing. Changes are as follows:

      + +

      The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

      +

      The example below shows a simple translation:

      +

      Before:

      +
      class Pet(Model):
      +    __table_name__ = 'pet'
      +    owner_id = UUID(primary_key=True)
      +    pet_id = UUID(primary_key=True)
      +    pet_type = Text(polymorphic_key=True)
      +    name = Text()
      +
      +class Cat(Pet):
      +    __polymorphic_key__ = 'cat'
      +
      +class Dog(Pet):
      +    __polymorphic_key__ = 'dog'
      +
      +
      +

      After:

      +
      class Pet(models.Model):
      +    __table_name__ = 'pet'
      +    owner_id = UUID(primary_key=True)
      +    pet_id = UUID(primary_key=True)
      +    pet_type = Text(discriminator_column=True)
      +    name = Text()
      +
      +class Cat(Pet):
      +    __discriminator_value__ = 'cat'
      +
      +class Dog(Pet):
      +    __discriminator_value__ = 'dog'
      +
      +
      +
      +
      +

      TimeUUID.from_datetime

      +

      This function is deprecated in favor of the core utility function uuid_from_time().

      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/dates_and_times.html b/3.21.0-scylla/dates_and_times.html new file mode 100644 index 0000000000..d6a0a06899 --- /dev/null +++ b/3.21.0-scylla/dates_and_times.html @@ -0,0 +1,714 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Working with Dates and Times

      +

      This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

      +
      +

      timestamps (Cassandra DateType)

      +

      Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

      +
      +

      Write Path

      +

      When inserting timestamps, the driver handles serialization for the write path as follows:

      +

      If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

      +
        +
      • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

      • +
      • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

      • +
      +

      Note the second point above applies even to “local” times created using now():

      +
      >>> d = datetime.now()
      +
      +>>> print(d.tzinfo)
      +None
      +
      +
      +

      These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

      +

      If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

      +
      +
      +

      Read Path

      +

      The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

      +

      The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

      +
      import pytz
      +user_tz = pytz.timezone('US/Central')
      +timestamp_naive = row.ts
      +timestamp_utc = pytz.utc.localize(timestamp_naive)
      +timestamp_presented = timestamp_utc.astimezone(user_tz)
      +
      +
      +

      This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

      +
      +
      +
      +

      date, time (Cassandra DateType)

      +

      Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

      +
      +

      Write Path

      +

      For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

      +

      For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

      +
      +
      +

      Read Path

      +

      The driver always returns custom types for date and time.

      +

      The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

      +

      The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/execution_profiles.html b/3.21.0-scylla/execution_profiles.html new file mode 100644 index 0000000000..59b4ea6018 --- /dev/null +++ b/3.21.0-scylla/execution_profiles.html @@ -0,0 +1,758 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Execution Profiles

      +

      Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

      +

      The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

      +

      An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

      +

      This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

      +
      +

      Mapping Legacy Parameters to Profiles

      +

      Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

      + +

      When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

      +
      +
      +

      Using Execution Profiles

      +
      +

      Default

      +
      from cassandra.cluster import Cluster
      +cluster = Cluster()
      +session = cluster.connect()
      +local_query = 'SELECT rpc_address FROM system.local'
      +for _ in cluster.metadata.all_hosts():
      +    print session.execute(local_query)[0]
      +
      +
      +
      Row(rpc_address='127.0.0.2')
      +Row(rpc_address='127.0.0.1')
      +
      +
      +

      The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

      +
      +
      +

      Initializing cluster with profiles

      +
      from cassandra.cluster import ExecutionProfile
      +from cassandra.policies import WhiteListRoundRobinPolicy
      +
      +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
      +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
      +
      +profiles = {'node1': node1_profile, 'node2': node2_profile}
      +session = Cluster(execution_profiles=profiles).connect()
      +for _ in cluster.metadata.all_hosts():
      +    print session.execute(local_query, execution_profile='node1')[0]
      +
      +
      +
      Row(rpc_address='127.0.0.1')
      +Row(rpc_address='127.0.0.1')
      +
      +
      +
      for _ in cluster.metadata.all_hosts():
      +    print session.execute(local_query, execution_profile='node2')[0]
      +
      +
      +
      Row(rpc_address='127.0.0.2')
      +Row(rpc_address='127.0.0.2')
      +
      +
      +
      for _ in cluster.metadata.all_hosts():
      +    print session.execute(local_query)[0]
      +
      +
      +
      Row(rpc_address='127.0.0.2')
      +Row(rpc_address='127.0.0.1')
      +
      +
      +

      Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

      +
      from cassandra.cluster import EXEC_PROFILE_DEFAULT
      +profile = ExecutionProfile(request_timeout=30)
      +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
      +
      +
      +
      +
      +

      Adding named profiles

      +

      New profiles can be added constructing from scratch, or deriving from default:

      +
      locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
      +node1_profile = 'node1_whitelist'
      +cluster.add_execution_profile(node1_profile, locked_execution)
      +
      +for _ in cluster.metadata.all_hosts():
      +    print session.execute(local_query, execution_profile=node1_profile)[0]
      +
      +
      +
      Row(rpc_address='127.0.0.1')
      +Row(rpc_address='127.0.0.1')
      +
      +
      +

      See Cluster.add_execution_profile() for details and optional parameters.

      +
      +
      +

      Passing a profile instance without mapping

      +

      We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

      +
      from cassandra.query import tuple_factory
      +
      +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
      +
      +print session.execute(local_query, execution_profile=tmp)[0]
      +print session.execute(local_query, execution_profile='node1')[0]
      +
      +
      +
      ('127.0.0.1',)
      +Row(rpc_address='127.0.0.1')
      +
      +
      +

      The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/faq.html b/3.21.0-scylla/faq.html new file mode 100644 index 0000000000..5afbf8b901 --- /dev/null +++ b/3.21.0-scylla/faq.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Frequently Asked Questions

      +

      See also cqlengine FAQ

      +
      +

      Why do connections or IO operations timeout in my WSGI application?

      +

      Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

      +

      To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

      +
      from flask import Flask
      +from uwsgidecorators import postfork
      +from cassandra.cluster import Cluster
      +
      +session = None
      +prepared = None
      +
      +@postfork
      +def connect():
      +    global session, prepared
      +    session = Cluster().connect()
      +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
      +
      +app = Flask(__name__)
      +
      +@app.route('/')
      +def server_version():
      +    row = session.execute(prepared, ('local',))[0]
      +    return row.release_version
      +
      +
      +

      uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

      +
      +
      +

      How do I trace a request?

      +

      Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

      +
      >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
      +>>> result = future.result()
      +>>> trace = future.get_query_trace()
      +>>> for e in trace.events:
      +>>>     print e.source_elapsed, e.description
      +
      +0:00:00.000077 Parsing select * from system.local
      +0:00:00.000153 Preparing statement
      +0:00:00.000309 Computing ranges to query
      +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
      +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
      +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
      +0:00:00.000669 Read 1 live and 0 tombstone cells
      +0:00:00.000755 Scanned 1 rows and matched 1
      +
      +
      +

      trace is a QueryTrace object.

      +
      +
      +

      How do I determine the replicas for a query?

      +

      With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

      +
      >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
      +>>> bound = prepared.bind((1,))
      +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
      +>>> for h in replicas:
      +>>>   print h.address
      +127.0.0.1
      +127.0.0.2
      +
      +
      +

      replicas is a list of Host objects.

      +
      +
      +

      How does the driver manage request retries?

      +

      By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

      +

      Retries are presently attempted on the same coordinator, but this may change in the future.

      +

      Please see policies.RetryPolicy for further details.

      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/getting_started.html b/3.21.0-scylla/getting_started.html new file mode 100644 index 0000000000..6d6e8c1664 --- /dev/null +++ b/3.21.0-scylla/getting_started.html @@ -0,0 +1,1095 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Getting Started

      +

      First, make sure you have the driver properly installed.

      +
      +

      Connecting to Cassandra

      +

      Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

      +

      The simplest way to create a Cluster is like this: +First, make sure you have the Cassandra driver properly installed.

      +
      from cassandra.cluster import Cluster
      +
      +cluster = Cluster()
      +
      +
      +

      This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

      +
      from cassandra.cluster import Cluster
      +
      +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
      +
      +
      +

      The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

      +

      If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

      +
      from cassandra.cluster import Cluster
      +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
      +
      +
      +

      Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

      +
      cluster = Cluster()
      +session = cluster.connect()
      +
      +
      +

      The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

      +
      cluster = Cluster()
      +session = cluster.connect('mykeyspace')
      +
      +
      +

      You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

      +
      session.set_keyspace('users')
      +# or you can do this instead
      +session.execute('USE users')
      +
      +
      +

      Profiles are passed in by execution_profiles dict.

      +

      In this case we can construct the base ExecutionProfile passing all attributes:

      +
      from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
      +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
      +from cassandra.query import tuple_factory
      +
      +profile = ExecutionProfile(
      +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
      +    retry_policy=DowngradingConsistencyRetryPolicy(),
      +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
      +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
      +    request_timeout=15,
      +    row_factory=tuple_factory
      +)
      +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
      +session = cluster.connect()
      +
      +print(session.execute("SELECT release_version FROM system.local").one())
      +
      +
      +

      Users are free to setup additional profiles to be used by name:

      +
      profile_long = ExecutionProfile(request_timeout=30)
      +cluster = Cluster(execution_profiles={'long': profile_long})
      +session = cluster.connect()
      +session.execute(statement, execution_profile='long')
      +
      +
      +

      Also, parameters passed to Session.execute or attached to Statements are still honored as before.

      +
      +
      +

      Executing Queries

      +

      Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

      +
      rows = session.execute('SELECT name, age, email FROM users')
      +for user_row in rows:
      +    print user_row.name, user_row.age, user_row.email
      +
      +
      +

      This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

      +

      By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

      +
      rows = session.execute('SELECT name, age, email FROM users')
      +for row in rows:
      +    print row.name, row.age, row.email
      +
      +
      +
      rows = session.execute('SELECT name, age, email FROM users')
      +for (name, age, email) in rows:
      +    print name, age, email
      +
      +
      +
      rows = session.execute('SELECT name, age, email FROM users')
      +for row in rows:
      +    print row[0], row[1], row[2]
      +
      +
      +

      If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

      +

      As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

      +
      +
      +

      Prepared Statements

      +

      Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

      +

      To prepare a query, use Session.prepare():

      +
      user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
      +
      +users = []
      +for user_id in user_ids_to_query:
      +    user = session.execute(user_lookup_stmt, [user_id])
      +    users.append(user)
      +
      +
      +

      prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

      +

      Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

      +
      +

      Passing Parameters to CQL Queries

      +

      Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

      +

      Positional parameters are used with a %s placeholder. For example, +when you execute:

      +
      session.execute(
      +    """
      +    INSERT INTO users (name, credits, user_id)
      +    VALUES (%s, %s, %s)
      +    """,
      +    ("John O'Reilly", 42, uuid.uuid1())
      +)
      +
      +
      +

      It is translated to the following CQL query:

      +
      INSERT INTO users (name, credits, user_id)
      +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
      +
      +
      +

      Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

      +
      session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
      +
      +
      +

      Instead, use %s for the age placeholder.

      +

      If you need to use a literal % character, use %%.

      +

      Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

      +
      session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
      +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
      +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
      +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
      +
      +
      +

      Note that the second line is incorrect because in Python, single-element tuples +require a comma.

      +

      Named place-holders use the %(name)s form:

      +
      session.execute(
      +    """
      +    INSERT INTO users (name, credits, user_id, username)
      +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
      +    """,
      +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
      +)
      +
      +
      +

      Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

      +

      Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

      +
      +
      +

      Type Conversions

      +

      For non-prepared statements, Python types are cast to CQL literals in the +following way:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      Python Type

      CQL Literal Type

      None

      NULL

      bool

      boolean

      float

      +
      float
      +
      double
      +
      +
      +
      int
      +
      long
      +
      +
      +
      int
      +
      bigint
      +
      varint
      +
      smallint
      +
      tinyint
      +
      counter
      +
      +

      decimal.Decimal

      decimal

      +
      str
      +
      unicode
      +
      +
      +
      ascii
      +
      varchar
      +
      text
      +
      +
      +
      buffer
      +
      bytearray
      +
      +

      blob

      date

      date

      datetime

      timestamp

      time

      time

      +
      list
      +
      tuple
      +
      generator
      +
      +

      list

      +
      set
      +
      frozenset
      +
      +

      set

      +
      dict
      +
      OrderedDict
      +
      +

      map

      uuid.UUID

      +
      timeuuid
      +
      uuid
      +
      +
      +
      +
      +

      Asynchronous Queries

      +

      The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

      +

      The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

      +
      from cassandra import ReadTimeout
      +
      +query = "SELECT * FROM users WHERE user_id=%s"
      +future = session.execute_async(query, [user_id])
      +
      +# ... do some other work
      +
      +try:
      +    rows = future.result()
      +    user = rows[0]
      +    print user.name, user.age
      +except ReadTimeout:
      +    log.exception("Query timed out:")
      +
      +
      +

      This works well for executing many queries concurrently:

      +
      # build a list of futures
      +futures = []
      +query = "SELECT * FROM users WHERE user_id=%s"
      +for user_id in ids_to_fetch:
      +    futures.append(session.execute_async(query, [user_id])
      +
      +# wait for them to complete and use the results
      +for future in futures:
      +    rows = future.result()
      +    print rows[0].name
      +
      +
      +

      Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

      +
      def handle_success(rows):
      +    user = rows[0]
      +    try:
      +        process_user(user.name, user.age, user.id)
      +    except Exception:
      +        log.error("Failed to process user %s", user.id)
      +        # don't re-raise errors in the callback
      +
      +def handle_error(exception):
      +    log.error("Failed to fetch user info: %s", exception)
      +
      +
      +future = session.execute_async(query)
      +future.add_callbacks(handle_success, handle_error)
      +
      +
      +
      +
      There are a few important things to remember when working with callbacks:
        +
      • Exceptions that are raised inside the callback functions will be logged and then ignored.

      • +
      • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

      • +
      +
      +
      +
      +
      +
      +

      Setting a Consistency Level

      +

      The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

      +

      By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

      +
      from cassandra import ConsistencyLevel
      +from cassandra.query import SimpleStatement
      +
      +query = SimpleStatement(
      +    "INSERT INTO users (name, age) VALUES (%s, %s)",
      +    consistency_level=ConsistencyLevel.QUORUM)
      +session.execute(query, ('John', 42))
      +
      +
      +
      +

      Setting a Consistency Level with Prepared Statements

      +

      To specify a consistency level for prepared statements, you have two options.

      +

      The first is to set a default consistency level for every execution of the +prepared statement:

      +
      from cassandra import ConsistencyLevel
      +
      +cluster = Cluster()
      +session = cluster.connect("mykeyspace")
      +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
      +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
      +
      +# these will both use QUORUM
      +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
      +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
      +
      +
      +

      The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

      +
      # override the QUORUM default
      +user3_lookup = user_lookup_stmt.bind([user_id3])
      +user3_lookup.consistency_level = ConsistencyLevel.ALL
      +user3 = session.execute(user3_lookup)
      +
      +
      +
      +
      +

      Speculative Execution

      +

      Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

      +

      To enable speculative execution:

      +
        +
      • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

      • +
      • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

      • +
      +

      Example:

      +
      from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
      +from cassandra.policies import ConstantSpeculativeExecutionPolicy
      +from cassandra.query import SimpleStatement
      +
      +# Configure the speculative execution policy
      +ep = ExecutionProfile(
      +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
      +)
      +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
      +session = cluster.connect()
      +
      +# Mark the query idempotent
      +query = SimpleStatement(
      +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
      +    is_idempotent=True
      +)
      +
      +# Execute. A new query will be sent to the server every 0.5 second
      +# until we receive a response, for a max number attempts of 10.
      +session.execute(query)
      +
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/index.html b/3.21.0-scylla/index.html new file mode 100644 index 0000000000..032e86446f --- /dev/null +++ b/3.21.0-scylla/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + DataStax Python Driver for Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      DataStax Python Driver for Apache Cassandra®

      +

      A Python client driver for Apache Cassandra®. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol. Cassandra 2.1+ is supported, including DSE 4.7+.

      +

      The driver supports Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8.

      +

      This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

      +

      Note: DataStax products do not support big-endian systems.

      +
      +

      Contents

      +
      +
      Installation

      How to install the driver.

      +
      +
      Getting Started

      A guide through the first steps of connecting to Cassandra and executing queries

      +
      +
      Execution Profiles

      An introduction to a more flexible way of configuring request execution

      +
      +
      Lightweight Transactions (Compare-and-set)

      Working with results of conditional requests

      +
      +
      Object Mapper

      Introduction to the integrated object mapper, cqlengine

      +
      +
      Performance Notes

      Tips for getting good performance.

      +
      +
      Paging Large Queries

      Notes on paging large query results

      +
      +
      Security

      An overview of the security features of the driver

      +
      +
      Upgrading

      A guide to upgrading versions of the driver

      +
      +
      User Defined Types

      Working with Cassandra 2.1’s user-defined types

      +
      +
      Working with Dates and Times

      Some discussion on the driver’s approach to working with timestamp, date, time types

      +
      +
      cloud

      A guide to connecting to Datastax Apollo

      +
      +
      geo_types

      Working with DSE geometry types

      +
      +
      graph

      Graph queries with DSE Graph

      +
      +
      graph_fluent

      DataStax Graph Fluent API

      +
      +
      CHANGELOG

      Log of changes to the driver, organized by version.

      +
      +
      Frequently Asked Questions

      A collection of Frequently Asked Questions

      +
      +
      API Documentation

      The API documentation.

      +
      +
      +
      +
      +
      +
      +

      Getting Help

      +

      Visit the FAQ section in this documentation.

      +

      Please send questions to the mailing list.

      +

      Alternatively, you can use the DataStax Community.

      +
      +
      +

      Reporting Issues

      +

      Please report any bugs and make any feature requests on the +JIRA issue tracker.

      +

      If you would like to contribute, please feel free to open a pull request.

      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/installation.html b/3.21.0-scylla/installation.html new file mode 100644 index 0000000000..048dc67961 --- /dev/null +++ b/3.21.0-scylla/installation.html @@ -0,0 +1,858 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Installation

      +
      +

      Supported Platforms

      +

      Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

      +

      Linux, OSX, and Windows are supported.

      +
      +
      +

      Installation through pip

      +

      pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

      +
      pip install scylla-driver
      +
      +
      +

      You can use pip install --pre scylla-driver if you need to install a beta version.

      +

      *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

      +
      +
      +

      Verifying your Installation

      +

      To check if the installation was successful, you can run:

      +
      python -c 'import cassandra; print cassandra.__version__'
      +
      +
      +

      It should print something like “3.21.0”.

      +
      +
      +

      (Optional) DataStax Graph

      +

      The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

      +
      pip install scylla-driver[graph]
      +
      +
      +

      See graph_fluent for more details about this API.

      +
      +
      +

      (Optional) Compression Support

      +

      Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

      +

      For lz4 support:

      +
      pip install lz4
      +
      +
      +

      For snappy support:

      +
      pip install python-snappy
      +
      +
      +

      (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

      +
      +
      +

      (Optional) Metrics Support

      +

      The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

      +
      pip install scales
      +
      +
      +
      +

      Speeding Up Installation

      +

      By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

      +

      In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

      +
      $ # installing from source
      +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
      +$ # installing from pip
      +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
      +
      +
      +
      +
      +

      OSX Installation Error

      +

      If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

      +
      clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
      +
      +
      +

      To fix this, re-run the installation with an extra compilation flag:

      +
      ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
      +
      +
      +
      +
      +
      +

      Windows Installation Notes

      +

      Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

      +

      Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

      +

      It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

      +
      +
      +

      Manual Installation

      +

      You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

      +

      Once the dependencies are installed, simply run:

      +
      python setup.py install
      +
      +
      +
      +
      +

      (Optional) Non-python Dependencies

      +

      The driver has several optional features that have non-Python dependencies.

      +
      +

      C Extensions

      +

      By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

      +

      When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

      +

      To compile the extensions, ensure that GCC and the Python headers are available.

      +

      On Ubuntu and Debian, this can be accomplished by running:

      +
      $ sudo apt-get install gcc python-dev
      +
      +
      +

      On RedHat and RedHat-based systems like CentOS and Fedora:

      +
      $ sudo yum install gcc python-devel
      +
      +
      +

      On OS X, homebrew installations of Python should provide the necessary headers.

      +

      See Windows Installation Notes for notes on configuring the build environment on Windows.

      +
      +

      Cython-based Extensions

      +

      By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

      +

      This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

      +
      python setup.py install --no-cython
      +
      +
      +

      Alternatively, an environment variable can be used to switch this option regardless of +context:

      +
      CASS_DRIVER_NO_CYTHON=1 <your script here>
      +- or, to disable all extensions:
      +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
      +
      +
      +

      This method is required when using pip, which provides no other way of injecting user options in a single command:

      +
      CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
      +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
      +
      +
      +

      The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

      +

      If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

      +
      sudo pip install six futures
      +sudo pip install --install-option="--no-cython"
      +
      +
      +
      +
      +
      +

      libev support

      +

      The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

      +

      If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

      +
      $ sudo apt-get install libev4 libev-dev
      +
      +
      +

      On RHEL/CentOS/Fedora:

      +
      $ sudo yum install libev libev-devel
      +
      +
      +

      If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

      +
      $ brew install libev
      +
      +
      +

      The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

      +

      If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

      +
      >>> from cassandra.io.libevreactor import LibevConnection
      +>>> from cassandra.cluster import Cluster
      +
      +>>> cluster = Cluster()
      +>>> cluster.connection_class = LibevConnection
      +>>> session = cluster.connect()
      +
      +
      +
      +
      +
      +

      (Optional) Configuring SSL

      +

      Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/lwt.html b/3.21.0-scylla/lwt.html new file mode 100644 index 0000000000..8f24f41d9d --- /dev/null +++ b/3.21.0-scylla/lwt.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Lightweight Transactions (Compare-and-set)

      +

      Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

      +

      For pertinent execution parameters, see Statement.serial_consistency_level.

      +

      This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

      +
      +

      Specialized Results

      +

      The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

      +

      The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

      +
        +
      • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

      • +
      • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

      • +
      • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

      • +
      +

      How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

      +
      CREATE TABLE test.t (
      +    k int PRIMARY KEY,
      +    v int,
      +    x int
      +)
      +
      +
      +

      … the following sections show the expected result for a number of example statements, using the three base row factories.

      +
      +

      named_tuple_factory (default)

      +

      The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

      +
      >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
      +Row(applied=True)
      +
      +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
      +Row(applied=False, k=0, v=0, x=None)
      +
      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
      +Row(applied=True)
      +
      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
      +Row(applied=False, v=1, x=2)
      +
      +
      +
      +
      +

      tuple_factory

      +

      This return type does not refer to names, but the boolean value applied is always present in position 0:

      +
      >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
      +(True,)
      +
      +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
      +(False, 0, 0, None)
      +
      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
      +(True,)
      +
      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
      +(False, 1, 2)
      +
      +
      +
      +
      +

      dict_factory

      +

      The retuned dict contains the [applied] key:

      +
      >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
      +{u'[applied]': True}
      +
      +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
      +{u'x': 2, u'[applied]': False, u'v': 1}
      +
      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
      +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
      +
      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
      +{u'[applied]': True}
      +
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/object_mapper.html b/3.21.0-scylla/object_mapper.html new file mode 100644 index 0000000000..453004aa60 --- /dev/null +++ b/3.21.0-scylla/object_mapper.html @@ -0,0 +1,714 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Object Mapper

      +

      cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

      +

      Jump to Getting Started

      +
      +

      Contents

      +
      +
      Upgrade Guide

      For migrating projects from legacy cqlengine, to the integrated product

      +
      +
      Models

      Examples defining models, and mapping them to tables

      +
      +
      Making Queries

      Overview of query sets and filtering

      +
      +
      Batch Queries

      Working with batch mutations

      +
      +
      Connections

      Working with multiple sessions

      +
      +
      API Documentation

      Index of API documentation

      +
      +
      Third party integrations

      High-level examples in Celery and uWSGI

      +
      +
      +

      Frequently Asked Questions

      +
      +
      +
      +
      +

      Getting Started

      +
      import uuid
      +from cassandra.cqlengine import columns
      +from cassandra.cqlengine import connection
      +from datetime import datetime
      +from cassandra.cqlengine.management import sync_table
      +from cassandra.cqlengine.models import Model
      +
      +#first, define a model
      +class ExampleModel(Model):
      +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
      +    example_type    = columns.Integer(index=True)
      +    created_at      = columns.DateTime()
      +    description     = columns.Text(required=False)
      +
      +#next, setup the connection to your cassandra server(s)...
      +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
      +# the list of hosts will be passed to create a Cluster() instance
      +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
      +
      +#...and create your CQL table
      +>>> sync_table(ExampleModel)
      +
      +#now we can create some rows:
      +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
      +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
      +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
      +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
      +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
      +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
      +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
      +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
      +
      +#and now we can run some queries against our table
      +>>> ExampleModel.objects.count()
      +8
      +>>> q = ExampleModel.objects(example_type=1)
      +>>> q.count()
      +4
      +>>> for instance in q:
      +>>>     print instance.description
      +example5
      +example6
      +example7
      +example8
      +
      +#here we are applying additional filtering to an existing query
      +#query objects are immutable, so calling filter returns a new
      +#query object
      +>>> q2 = q.filter(example_id=em5.example_id)
      +
      +>>> q2.count()
      +1
      +>>> for instance in q2:
      +>>>     print instance.description
      +example5
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/objects.inv b/3.21.0-scylla/objects.inv new file mode 100644 index 0000000000..c3f36be682 Binary files /dev/null and b/3.21.0-scylla/objects.inv differ diff --git a/3.21.0-scylla/performance.html b/3.21.0-scylla/performance.html new file mode 100644 index 0000000000..3fac829705 --- /dev/null +++ b/3.21.0-scylla/performance.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Performance Notes

      +

      The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

      +

      Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

      +

      The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

      +

      Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

      +
      +

      PyPy

      +

      PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

      +
      +
      +

      Cython Extensions

      +

      Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

      +

      See Installation for details on controlling this build.

      +
      +
      +

      multiprocessing

      +

      All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

      +

      Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

      +

      For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/py-modindex.html b/3.21.0-scylla/py-modindex.html new file mode 100644 index 0000000000..fb3a56339b --- /dev/null +++ b/3.21.0-scylla/py-modindex.html @@ -0,0 +1,599 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + + + +
      + + + + + +
      + + +
      +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/query_paging.html b/3.21.0-scylla/query_paging.html new file mode 100644 index 0000000000..54d64822f1 --- /dev/null +++ b/3.21.0-scylla/query_paging.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Paging Large Queries

      +

      Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

      +
      +

      Controlling the Page Size

      +

      By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

      +
      +
      +

      Handling Paged Results

      +

      Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

      +
      from cassandra.query import SimpleStatement
      +query = "SELECT * FROM users"  # users contains 100 rows
      +statement = SimpleStatement(query, fetch_size=10)
      +for user_row in session.execute(statement):
      +    process_user(user_row)
      +
      +
      +

      Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

      +

      If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

      +
      +
      +

      Handling Paged Results with Callbacks

      +

      If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

      +

      Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

      +
      class PagedResultHandler(object):
      +
      +    def __init__(self, future):
      +        self.error = None
      +        self.finished_event = Event()
      +        self.future = future
      +        self.future.add_callbacks(
      +            callback=self.handle_page,
      +            errback=self.handle_err)
      +
      +    def handle_page(self, rows):
      +        for row in rows:
      +            process_row(row)
      +
      +        if self.future.has_more_pages:
      +            self.future.start_fetching_next_page()
      +        else:
      +            self.finished_event.set()
      +
      +    def handle_error(self, exc):
      +        self.error = exc
      +        self.finished_event.set()
      +
      +future = session.execute_async("SELECT * FROM users")
      +handler = PagedResultHandler(future)
      +handler.finished_event.wait()
      +if handler.error:
      +    raise handler.error
      +
      +
      +
      +
      +

      Resume Paged Results

      +

      You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

      +
      from cassandra.query import SimpleStatement
      +query = "SELECT * FROM users"
      +statement = SimpleStatement(query, fetch_size=10)
      +results = session.execute(statement)
      +
      +# save the paging_state somewhere and return current results
      +web_session['paging_stage'] = results.paging_state
      +
      +
      +# resume the pagination sometime later...
      +statement = SimpleStatement(query, fetch_size=10)
      +ps = web_session['paging_state']
      +results = session.execute(statement, paging_state=ps)
      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/search.html b/3.21.0-scylla/search.html new file mode 100644 index 0000000000..9aa24bd1fa --- /dev/null +++ b/3.21.0-scylla/search.html @@ -0,0 +1,602 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + + + + + +
      + + + + + +
      + + +
      +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/searchindex.js b/3.21.0-scylla/searchindex.js new file mode 100644 index 0000000000..b3a55c6044 --- /dev/null +++ b/3.21.0-scylla/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third_party", "cqlengine/upgrade_guide", "dates_and_times", "execution_profiles", "faq", "getting_started", "index", "installation", "lwt", "object_mapper", "performance", "query_paging", "security", "upgrading", "user_defined_types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third_party.rst", "cqlengine/upgrade_guide.rst", "dates_and_times.rst", "execution_profiles.rst", "faq.rst", "getting_started.rst", "index.rst", "installation.rst", "lwt.rst", "object_mapper.rst", "performance.rst", "query_paging.rst", "security.rst", "upgrading.rst", "user_defined_types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "DataStax Python Driver for Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "Security", "Upgrading", "User Defined Types"], "terms": {"unreleas": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 52, 53], "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 51, 52], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 51, 52], "resultset": [0, 3, 33, 50, 52], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 51], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 52, 53], "1203": 0, "januari": 0, "2020": 0, "unifi": [0, 52], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 53], "core": [0, 3, 4, 38, 40, 46, 49], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32, 45], "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 52], "packag": [0, 2, 32, 41, 46, 48, 51, 52], "1130": 0, "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 51, 52, 53], "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 51, 52, 53], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 51, 52, 53], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 51], "twist": [0, 33, 44], "1161": 0, "cloud": [0, 3, 27, 45], "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "system": [0, 5, 25, 38, 42, 43, 44, 45, 46, 52], "schema": [0, 3, 9, 30, 33, 37, 44, 52], "pars": [0, 15, 18, 29, 32, 43, 44], "1048": 0, "flexibl": [0, 45], "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 52, 53], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "collect": [0, 3, 8, 10, 25, 26, 30, 32, 38, 45, 52], "deseri": [0, 15, 18, 33, 41], "1123": 0, "graph": [0, 3, 45], "abil": [0, 27, 42, 52], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 53], "fluent": [0, 33, 45, 46, 52], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 53], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "prepar": [0, 3, 4, 27, 33, 41, 43, 51, 53], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 51, 53], "mismatch": 0, "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 51, 52, 53], "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "re": [0, 27, 30, 37, 38, 39, 44, 46, 51, 53], "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 52], "cqlengineexcept": [0, 40], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "1166": 0, "asyncio": [0, 33], "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53], "process": [0, 3, 4, 20, 43, 44, 46, 49, 51, 52], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 52], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 51], "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "peer": [0, 5, 25], "1181": 0, "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53], "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 51], "certif": [0, 51], "hostnam": [0, 27, 51], "sslcontext": [0, 51], "check_hostnam": [0, 51], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 53], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 51, 52], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 52], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 51], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 51, 52, 53], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 51, 52, 53], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 51, 52, 53], "depend": [0, 2, 41, 43, 47, 49], "geomet": 0, "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 51], "come": 0, "unif": 0, "geo": [0, 13], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "read_repair_ch": 0, "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 52, 53], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 51, 52, 53], "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "warn": [0, 1, 3, 31, 40, 52], "about": [0, 3, 25, 30, 37, 41, 44, 46, 51, 52], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 51, 52], "balanc": [0, 3, 33, 42, 52], "polici": [0, 3, 33, 42, 43, 44, 52], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 44, 46, 48, 49, 51, 53], "1177": 0, "cql": [0, 1, 6, 9, 10, 11, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 52, 53], "keyword": [0, 3, 6, 7, 9, 10], "1122": 0, "publish": [0, 46, 51], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 52], "next": [0, 3, 21, 27, 42, 48, 50, 51], "major": [0, 27, 42, 51, 52], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 51, 52], "defaultloadbalancingpolici": [0, 27, 52], "integr": [0, 29, 40, 41, 45, 46, 48, 52], "1047": 0, "profil": [0, 3, 4, 12, 14, 44, 45], "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 51, 52], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 15, 18], "graph_opt": 0, "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43], "799": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 51, 52, 53], "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 52], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 51], "unknown": [0, 15, 18, 46, 52], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 51, 53], "819": 0, "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45], "contin": 0, "page": [0, 1, 3, 45], "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 53], "payload": [0, 1, 3, 30, 33], "graphson": [0, 12, 14, 15, 18], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 51, 53], "773": 0, "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 51, 52, 53], "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 51, 52, 53], "authprovid": [0, 2, 3, 33, 51], "transit": 0, "mode": 0, "831": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 51, 52], "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 51], "778": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 51, 52], "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 52], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 52], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 52], "dsegssapiauthprovid": [0, 51], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 51], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 26, 27, 29, 30, 34, 37, 40, 44, 47, 53], "574": 0, "config": [0, 51], "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 52], "568": 0, "distinct": [0, 10, 15, 18], "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 51], "477": 0, "known": [0, 15, 18, 25, 40, 52], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 51], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "cl": [0, 10, 21], "509": 0, "target": [0, 13, 15, 18, 27, 46], "analyt": [0, 15, 18], "spark": 0, "master": 0, "avail": [0, 3, 10, 30, 38, 46, 52], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53], "runtimeerror": 0, "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 46, 47, 48, 50, 51], "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 52], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 51, 53], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 51], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 51, 52], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 51, 52], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 51, 52], "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 51], "caus": [0, 3, 10, 26, 37, 47], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 52], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 51, 52], "cython": [0, 29], "900": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 47], "date": [0, 6, 17, 32, 33, 44, 45, 52], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 52, 53], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 51, 52], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "unexpectedli": 0, "709": 0, "socket": [0, 5, 51], "associ": [0, 3, 52], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46], "clean": [0, 39, 46, 52], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 51, 52], "shutdown": [0, 3, 39], "673": 0, "resolv": [0, 5, 27, 36, 51], "fqdn": [0, 51], "ip": [0, 3, 5, 27, 28, 44, 51], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 51, 52, 53], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 51, 52], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 53], "t": [0, 9, 10, 31, 37, 38, 41, 43, 44, 47, 49, 51, 52, 53], "empti": [0, 2, 3, 25, 47], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "around": [0, 9, 32, 40, 41, 52], "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 52], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 51, 52], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 53], "789": 0, "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 51, 52], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53], "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 51, 52, 53], "v5": [0, 1], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 51], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 51, 52], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 51, 52, 53], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 51], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 52], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 48, 51, 52], "apollo": [0, 45], "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 51], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44], "1009": 0, "deadlock": [0, 4], "drop": [0, 6, 8, 29], "heartbeat": 0, "whilst": 0, "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 51, 52], "flight": [0, 5], "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 52], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 51], "1044": 0, "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 51], "pk__token__gt": [0, 38], "filter": [0, 6, 9, 27, 33, 35, 48], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 51, 52], "1121": 0, "august": 0, "26": [0, 38], "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 52], "proof": 0, "map": [0, 1, 3, 8, 10, 15, 17, 18, 29, 30, 32, 33, 37, 38, 44, 48, 52], "1023": 0, "param": [0, 4, 13], "log": [0, 3, 8, 27, 30, 31, 44, 45, 52], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 27, 33, 43, 46], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 53], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 51, 52], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 53], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 52], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 52, 53], "1093": 0, "incorrect": [0, 44], "compact": [0, 9], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 51], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 51], "1117": 0, "built": [0, 32, 42, 46, 49, 52], "sourc": [0, 3, 15, 18, 45, 46], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 52], "doesn": [0, 31, 52], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45], "port": [0, 3, 5, 25, 44], "1127": 0, "invalid": [0, 1, 26, 30], "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 51, 53], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 51], "1104": 0, "proper": [0, 39, 46], "row_factori": [0, 3, 7, 29, 30, 42, 44], "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41], "1079": 0, "improv": [0, 1, 35, 49, 52], "non": [0, 3, 6, 10, 32, 33, 37, 44], "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 51], "1091": 0, "expos": [0, 31, 52], "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 51, 52], "column": [0, 8, 9, 10, 11, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 52, 53], "1082": 0, "let": [0, 3, 52], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 51, 52], "sortedset": [0, 32, 33, 52], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "februari": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 52], "1068": 0, "ssl_context": [0, 3, 44, 51], "enabl": [0, 3, 10, 44, 51, 52], "995": 0, "encrypt": [0, 51], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 51, 53], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 51, 52], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 52, 53], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 46, 52, 53], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 51], "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "bump": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 51], "releas": [0, 9, 27, 40, 42, 51, 52], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 51, 52, 53], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 46, 52], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 51, 52, 53], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 51], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 51, 52], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 52], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 51, 53], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 51, 52], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 52], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 52], "1015": 0, "septemb": 0, "c": [0, 6, 12, 27, 38, 51], "logic": [0, 37], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 44, 52], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43], "978": 0, "more": [0, 3, 4, 6, 9, 10, 25, 27, 29, 31, 38, 40, 42, 44, 45, 46, 49, 50, 51, 52], "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 51], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 51, 52], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 51, 52], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "asyncor": [0, 33, 46], "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 51], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 51], "loop": [0, 3, 4, 21, 33, 44, 46, 51], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 51, 52], "subclass": [0, 1, 2, 3, 27, 30, 37, 51], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "april": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 52], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 51, 52], "647": 0, "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 53], "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 51, 52, 53], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 52], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 52], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 51], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 51, 52], "cassandra_vers": 0, "910": 0, "refactor": [0, 41], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 51, 52, 53], "kind": [0, 27, 52], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 52, 53], "915": 0, "authent": [0, 1, 3, 33], "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 51], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 53], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 45, 46, 50, 51, 53], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 51, 53], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 52, 53], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 53], "865": 0, "deprecationwarn": [0, 52], "846": 0, "example_mapp": 0, "py": [0, 46], "python3": 0, "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 51, 52], "execute_concurr": [0, 4, 33, 49], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "metric": [0, 3, 33], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 51], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": 0, "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 51], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 52], "chang": [0, 3, 6, 9, 10, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 52], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 52, 53], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 52], "810": 0, "833": 0, "juli": 0, "24": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 51, 52], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 52], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 27, 35, 44, 46, 51], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 51], "772": 0, "pool": [0, 1, 3, 33, 52], "739": 0, "murmur3": [0, 3, 46], "big": [0, 45], "endian": [0, 45], "653": 0, "ensur": [0, 3, 4, 9, 27, 39, 46, 51], "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 52], "785": 0, "25": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 51], "464": 0, "inupt": 0, "microsecond": [0, 31, 52], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "durat": [0, 30, 32, 33], "750": 0, "commun": [0, 5, 45, 46], "pr": 0, "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 53], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 46, 47, 51, 52], "705": 0, "get_query_trac": [0, 3, 43, 52], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 52], "747": 0, "udt": [0, 3, 12, 37], "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44], "drain": 0, "734": 0, "resulset": 0, "trace": [0, 3, 33], "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 52], "grow": 0, "720": 0, "size": [0, 3, 10, 52], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 51, 52, 53], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 51], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "race": 0, "callback": [0, 3, 10, 44, 49, 51], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 52], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 51], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "march": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 52], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46], "631": 0, "tokenawarepolici": [0, 3, 27, 42], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 52], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 52], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 52], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 52], "mark": [0, 3, 5, 33, 44], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 52], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 51, 52, 53], "lead": [0, 34, 49, 52], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "unabl": [0, 27, 46], "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 52, 53], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 51, 52], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": 0, "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 51, 52], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 51], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 52], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "replic": [0, 3, 8, 25, 40], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "nativ": [0, 1, 15, 18, 29, 37, 45], "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 52], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 53], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 52], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 52], "stat": [0, 26], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 52], "561": 0, "mock": 0, "unit": [0, 13, 27], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 51, 52], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 51, 52], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 34, 37, 52], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "alias": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 52], "automat": [0, 1, 35, 37, 38, 44, 46, 50], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "condit": [0, 1, 3, 8, 10, 30, 45], "580": 0, "contain": [0, 3, 6, 9, 10, 17, 27, 32, 37, 38, 41, 47, 50], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "june": 0, "569": 0, "control": [0, 3, 4, 27, 30, 40, 49, 51], "583": 0, "593": 0, "fork": [0, 20, 43, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 51], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 52, 53], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 52, 53], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 51, 53], "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "compat": [0, 3, 18, 25, 33, 52], "434": 0, "unicodedecodeerror": 0, "unicod": [0, 17, 44], "bop": 0, "559": 0, "565": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 45, 46, 51, 52, 53], "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 52], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 51, 52], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 51, 52], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 51, 52], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 26, 27, 37, 38, 44, 52], "int": [0, 3, 6, 7, 8, 25, 31, 32, 38, 44, 47, 52, 53], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 51], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 52], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 51], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 52, 53], "306": 0, "IF": [0, 10, 27, 30, 47, 52], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 52], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 52], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 51], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": 0, "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 51], "489": 0, "typo": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": 0, "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 52, 53], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 52], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 45, 46, 49, 50, 51, 52, 53], "might": [0, 3, 30, 50, 51], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 51, 53], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 51, 52], "access": [0, 3, 9, 26, 30, 37, 44, 52], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 52], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 51, 52], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 51, 52, 53], "215": 0, "evict": 0, "cach": 0, "226": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51], "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 51, 52], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28], "dc": [0, 3, 27, 52], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 52], "408": [0, 52], "400": [0, 52], "422": [0, 52], "292": [0, 52], "318": [0, 52], "368": [0, 52], "371": 0, "blist": 0, "soft": 0, "385": [0, 52], "local_quorum": [0, 1, 44], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44], "178": [0, 30, 52], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "well": [0, 27, 35, 44, 51], "pagedresult": [0, 50, 52], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "runtim": [0, 46, 49], "397": 0, "398": 0, "extens": [0, 3, 27, 41], "file": [0, 40, 49, 51], "manifest": [0, 43, 47], "optim": [0, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 53], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 52], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 32, 44, 49, 52], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 52], "round": [0, 27, 32], "341": 0, "sizeti": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53], "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 52], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 51], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 52], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 51], "patch": [0, 21, 22, 41, 51], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 51], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "23": [0, 32], "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 52], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 52], "243": 0, "kerbero": [0, 51], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 52], "192": [0, 3, 44], "stream": [0, 29], "set_keyspac": [0, 3, 27, 44, 53], "195": 0, "implicit": [0, 10, 52], "numer": [0, 41], "204": 0, "collis": 0, "sasl": [0, 2, 51], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 52], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 52], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 52], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27], "contact_point": [0, 3, 7, 27, 51], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 52], "88": 0, "constructor": [0, 3, 6, 38], "basi": [0, 52], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52], "use_client_timestamp": [0, 1, 3, 52], "overrid": [0, 3, 9, 15, 18, 42, 44, 52], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 53], "refer": [0, 10, 34, 40, 42, 47, 52], "xrang": 0, "go": [0, 40], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 52, 53], "six": [0, 46, 52], "libevreactor": [0, 3, 33, 46], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 52], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 51, 52, 53], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 52], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 51, 52, 53], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 51], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 51, 52, 53], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 51, 52], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 52], "help": [0, 38, 52], "done": [0, 3, 37, 41, 43, 51, 52], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 45, 46, 47, 50, 51, 52], "guarante": [0, 27, 30, 52], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 52, 53], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 51], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 51, 52, 53], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 51, 52, 53], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 52], "left": [0, 3, 4, 9, 41, 52], "place": [0, 40, 44, 52], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 52], "dict_factori": [0, 3, 7, 16, 30, 33, 52], "ordered_dict_factori": [0, 3, 16, 30, 33, 52], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 51, 52, 53], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 52], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 52], "executor": 0, "becom": [0, 3, 8, 49, 52], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 51, 52], "lowercas": 0, "boolean": [0, 1, 6, 25, 27, 44, 47], "liter": [0, 15, 17, 18, 30, 41, 44, 52, 53], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 52], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 52, 53], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 51, 52], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 45, 51, 52], "never": [0, 27, 34, 47, 49, 52], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 52], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": [0, 52], "plan": [0, 8, 27], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 51, 52], "main": [0, 3, 51, 53], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 46, 49, 51, 52], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 51, 52], "strong": 0, "garbag": [0, 52], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 52], "twice": 0, "had": [0, 40, 52], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 53], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": 0, "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30], "parallel": 0, "sesssion": 0, "effort": [0, 40, 51], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 51], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 52], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 51], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "blob": [0, 6, 17, 44], "syntax": [0, 10, 34, 38], "cql_version": [0, 3], "successfulli": 0, "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 51], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 51], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 52, 53], "constant": [0, 51], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 52], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 51, 52], "ONE": [1, 3, 10, 40, 52], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 53], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 45, 46, 47, 48, 51, 53], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 51, 53], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 53], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 45, 46, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 51], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 52, 53], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 46, 47, 48, 50, 51, 53], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 51], "signatur": 1, "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 52], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 52], "higher": [1, 3, 4, 30, 51, 52], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 52], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 51], "author": [1, 51], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 52], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "mechan": [2, 3, 27, 51], "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 51], "plaintextauthprovid": [2, 3, 33, 51, 52], "usernam": [2, 44, 51], "password": [2, 51], "passwordauthent": [2, 51], "auth_provid": [2, 3, 51], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 51], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 46, 51, 52, 53], "servic": [2, 51], "someth": [2, 27, 37, 38, 46, 51], "qop": [2, 51], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 51], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 51], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "mutabl": 3, "load_balancing_polici": [3, 27, 42, 44], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 51, 52], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 51], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 51, 53], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 52], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50], "purpos": [3, 6], "register_user_typ": [3, 52, 53], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 51, 52], "whose": 3, "mykeyspac": [3, 30, 44, 52, 53], "street": [3, 11, 37, 52, 53], "zipcod": [3, 11, 37, 52, 53], "locat": [3, 40, 51, 53], "def": [3, 27, 34, 37, 39, 43, 44, 50, 51, 52, 53], "self": [3, 15, 18, 37, 50, 52, 53], "INTO": [3, 4, 30, 44, 47, 53], "st": [3, 37, 53], "78723": [3, 53], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 53], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 52], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 52], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 51], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": 3, "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 51], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 52], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 52], "exec_profile_default": [3, 33, 42, 44], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 52], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 51], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 45, 46, 49, 51], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 51, 52], "placehold": [3, 15, 18, 30, 44, 53], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 51], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 52], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "g": [3, 12, 15, 18, 27, 30], "deliveri": 3, "definit": [3, 6, 29, 38, 40], "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 53], "execute_graph": [3, 15, 18], "gremlin": [3, 12, 14, 15, 18, 46], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 51], "expir": 3, "exceed": [3, 4], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 52], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 51], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 51, 52], "backward": [3, 18, 25, 52], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 51], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 52, 53], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 52], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "b": [4, 12, 14, 15, 18, 34, 35, 36, 38], "1000": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 51], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 51], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 51], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 51], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50], "www": 6, "com": [6, 10, 51], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25], "durable_writ": 8, "simplestrategi": [8, 25], "caution": [8, 37], "product": [8, 45, 48, 51, 52], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 51, 52], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 53], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 52], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 51], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 52], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 17, 52], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 52], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "graph_protocol": [12, 14], "dse_graph_query_protocol": 12, "query_from_travers": 12, "travers": [12, 14, 15, 18, 46], "graphson3": [12, 15, 18], "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 51], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 51], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 51], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "geometri": [13, 32, 45], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphprotocol": [14, 15, 18, 33], "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "graph_object_row_factori": [15, 18, 33], "vertex": [15, 18, 33], "edg": [15, 18, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 52], "graphson_1_0": [15, 18], "graphson1": [15, 18], "graphson_3_0": [15, 18], "choos": [15, 18, 27, 52], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 52], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 51], "handle_fork": 20, "eventletconnect": [21, 33, 51], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 52], "twistedconnect": [24, 33, 51], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 52], "indexmetadata": 25, "materializedviewmetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "options_map": 25, "replicationfactor": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 51], "pmfstat": 26, "latenc": [26, 44], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 51], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": 27, "evenli": 27, "what": [27, 30, 37, 41, 51, 52, 53], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 51], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "wrapper": [27, 30], "truthi": 27, "predic": [27, 33], "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 51], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 52], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 51, 52], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 51, 52], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 51], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 51], "silent": 27, "idea": 27, "best": [27, 44, 51], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 51], "extend": 30, "impli": 30, "portion": [30, 32], "paxo": 30, "learn": [30, 51], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 52], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 51], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "asyncioreactor": 33, "eventletreactor": 33, "twistedreactor": [33, 51], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 51], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "shown": [35, 37, 53], "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": 37, "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41, 52], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 51], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "appropri": [37, 46, 51], "much": [37, 41, 51, 52], "presist": 37, "pattern": [37, 49], "joe": [37, 51], "99999": 37, "ll": [38, 51], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 51], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 52], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": 38, "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 52], "scylla": [38, 40, 46, 52], "21": [38, 46, 52], "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "17": [38, 51], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45, 52], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 52], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 52], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 52], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "robust": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": 42, "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": [44, 45], "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 52, 53], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 51], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 53], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49], "handle_success": 44, "rememb": 44, "user1": [44, 51], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "secur": [45, 52], "upgrad": [45, 48, 51], "geo_typ": 45, "graph_fluent": [45, 46], "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "mail": 45, "jira": 45, "tracker": 45, "contribut": 45, "feel": 45, "pull": 45, "linux": 46, "tool": 46, "itself": [46, 52], "reinstal": 46, "gremlinpython": 46, "abl": 46, "snappi": 46, "ubuntu": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 51], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": 46, "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 51], "mussei": [46, 51], "thorough": [46, 51], "mostli": 47, "outcom": 47, "pertin": 47, "appear": 47, "reject": 47, "statu": 47, "squar": 47, "bracket": 47, "AND": 47, "retun": 47, "jump": 48, "migrat": [48, 52], "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 51], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "paging_stag": 50, "p": 50, "get_credenti": 51, "host_address": 51, "1234": 51, "wrap_socket": 51, "create_default_context": 51, "server_hostnam": 51, "keystor": 51, "intruct": 51, "cert": 51, "understand": 51, "demonstr": 51, "deploy": 51, "client_encryption_opt": 51, "keystore_password": 51, "mystorepass": 51, "require_client_auth": 51, "protocol_tlsv1": 51, "veri": 51, "verify_mod": 51, "cert_requir": 51, "load_verify_loc": 51, "rootca": 51, "crt": 51, "truststor": 51, "jk": 51, "truststore_password": 51, "pem": 51, "conf": 51, "gen_client_cert": 51, "eof": 51, "req": 51, "distinguished_nam": 51, "req_distinguished_nam": 51, "output_password": 51, "root_cert_pass": 51, "default_bit": 51, "2048": 51, "cert_countri": 51, "cert_org_nam": 51, "ou": 51, "cert_ou": 51, "cn": 51, "root": 51, "Then": 51, "openssl": 51, "newkei": 51, "rsa": 51, "keyout": 51, "csr": 51, "x509": 51, "root_ca_base_nam": 51, "cakei": 51, "passin": 51, "crt_sign": 51, "cert_valid": 51, "cacreateseri": 51, "load_cert_chain": 51, "certfil": 51, "keyfil": 51, "crypto": 51, "tlsv1_method": 51, "set_verifi": 51, "verify_p": 51, "lambda": 51, "_1": 51, "_2": 51, "_3": 51, "_4": 51, "use_certificate_fil": 51, "use_privatekey_fil": 51, "ca_cert": 51, "ssl_version": 51, "ssl_opt": 51, "my": 51, "cert_req": 51, "risen": 51, "advanc": 51, "dseplaintextauthprovid": 51, "act": 51, "permiss": 51, "grant": 51, "role": 51, "plain": 51, "authorization_id": 51, "ticket": 51, "kinit": 51, "offici": [51, 52], "fulli": 52, "benefit": 52, "dse_graph": 52, "swap": 52, "rework": 52, "mesh": 52, "afterward": 52, "got": 52, "row_list": 52, "first_result": 52, "variant": 52, "brought": 52, "overhaul": 52, "highlight": 52, "nomenclatur": 52, "keyspace_nam": 52, "031ebb0": 52, "refresh_": 52, "_metadata": 52, "419fcdf": 52, "submit_schema_refresh": 52, "574266d": 52, "cqltype": 52, "bb984ee": 52, "e16a073": 52, "cc94073": 52, "from_datetim": 52, "96489cc": 52, "a2d3a98": 52, "4bd5909": 52, "__polymorphic_": 52, "__discrimin": 52, "9d98c8e": 52, "79efe97": 52, "citi": 52, "zip": [52, 53], "though": 52, "notabl": 52, "simpler": 52, "unclean": 52, "tell": 53, "insert_stat": 53, "otherstuff": 53, "first_row": 53, "fine": 53, "unprepar": 53, "parameter": 53, "interpol": 53}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph": [[15, 3, 1, "", "Edge"], [15, 3, 1, "", "GraphOptions"], [15, 3, 1, "", "GraphProtocol"], [15, 3, 1, "", "GraphSON1Deserializer"], [15, 3, 1, "", "GraphSON1Serializer"], [15, 3, 1, "", "GraphSON2Reader"], [15, 3, 1, "", "Path"], [15, 3, 1, "", "Result"], [15, 3, 1, "", "SimpleGraphStatement"], [15, 3, 1, "", "Vertex"], [15, 3, 1, "", "VertexProperty"], [12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphProtocol": [[15, 2, 1, "", "GRAPHSON_1_0"], [15, 2, 1, "", "GRAPHSON_2_0"], [15, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph.GraphSON2Reader": [[15, 4, 1, "", "deserialize"], [15, 4, 1, "", "read"]], "cassandra.datastax.graph.Path": [[15, 2, 1, "", "labels"], [15, 2, 1, "", "objects"]], "cassandra.datastax.graph.Result": [[15, 4, 1, "", "as_edge"], [15, 4, 1, "", "as_path"], [15, 4, 1, "", "as_vertex"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.VertexProperty": [[15, 2, 1, "", "label"], [15, 2, 1, "", "properties"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 51, 52], "22": 0, "0": [0, 51, 52], "featur": [0, 29, 52], "21": 0, "bug": 0, "fix": 0, "other": 0, "deprec": [0, 40, 52], "20": 0, "2": [0, 52], "1": [0, 52], "19": 0, "18": 0, "17": 0, "16": [0, 51], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 52], "x": [0, 52], "upgrad": [0, 40, 52], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 52], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 51, 52], "cluster": [3, 42, 52], "session": [3, 52], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 52], "execut": [4, 34, 42, 44, 51, 52], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 52], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 52, 53], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 53], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 52], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 53], "user": [11, 37, 52, 53], "defin": [11, 37, 52, 53], "datastax": [12, 13, 14, 15, 33, 45, 46], "graph": [12, 13, 14, 15, 18, 33, 46, 52], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 52], "format": 16, "encod": [17, 52], "non": [17, 46, 52], "prepar": [17, 30, 44, 52], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 51], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 51], "metadata": [25, 52], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 51], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 51, 52], "custom": [29, 51, 52], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 52], "trace": [30, 43, 52], "timestamp": [31, 41, 52], "gener": [31, 34], "api": [33, 40, 52], "document": 33, "core": 33, "driver": [33, 43, 45, 52], "mapper": [33, 48], "us": [34, 42, 52, 53], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 53], "new": 35, "chang": [35, 40, 52], "default": [35, 38, 42, 47, 52], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 52], "work": [36, 41, 52], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 52], "delet": 36, "individu": 36, "exampl": [37, 51], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 52], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 52], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 52], "organ": 40, "import": [40, 52], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": 42, "legaci": 42, "paramet": [42, 44, 52], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 53], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 52], "specul": 44, "python": [45, 46], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "instal": [46, 52], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 51], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": 46, "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 52], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 52], "configur": [46, 51], "ssl": [46, 51], "lightweight": [47, 52], "transact": [47, 52], "compar": 47, "special": 47, "result": [47, 50, 52], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 52], "larg": 50, "control": 50, "size": 50, "resum": 50, "secur": 51, "v1": 51, "No": 51, "ident": 51, "verif": 51, "client": [51, 52], "version": 51, "lower": 51, "dse": [51, 52], "unifi": 51, "proxi": 51, "login": 51, "modul": 52, "execute_async": 52, "now": 52, "local_on": 52, "normal": 52, "inform": 52, "attach": 52, "bind": 52, "ignor": 52, "extra": 52, "blist": 52, "soft": 52, "sever": 52, "v3": 52, "nativ": 52, "side": 52, "v2": 52, "automat": 52, "sasl": 52, "call": 52, "shutdown": 52, "udt": 53, "dict": 53, "them": 53}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Frequently Asked Questions": [[43, "frequently-asked-questions"], [36, "frequently-asked-questions"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "Model Inheritance": [[40, "model-inheritance"], [37, "model-inheritance"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Execution Profiles": [[42, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "User Defined Types": [[37, "user-defined-types"], [53, "user-defined-types"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Registering a UDT": [[53, "registering-a-udt"]], "Map a Class to a UDT": [[53, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[53, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[53, "using-udts-without-registering-them"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Contents": [[48, "contents"], [45, "contents"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Security": [[51, "security"]], "Authentication": [[51, "authentication"]], "Custom Authenticators": [[51, "custom-authenticators"]], "Protocol v1 Authentication": [[51, "protocol-v1-authentication"]], "SSL": [[51, "ssl"]], "SSL with Twisted or Eventlet": [[51, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[51, "ssl-configuration-examples"]], "No identity verification": [[51, "no-identity-verification"]], "Client verifies server": [[51, "client-verifies-server"]], "Server verifies client": [[51, "server-verifies-client"]], "Server verifies client and client verifies server": [[51, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[51, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[51, "ssl-with-twisted"]], "DSE Authentication": [[51, "dse-authentication"]], "DSE Unified Authentication": [[51, "dse-unified-authentication"]], "Proxy Login": [[51, "proxy-login"]], "Proxy Execute": [[51, "proxy-execute"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "DataStax Python Driver for Apache Cassandra\u00ae": [[45, "datastax-python-driver-for-apache-cassandra"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Installation": [[46, "installation"], [52, "installation"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) DataStax Graph": [[46, "optional-datastax-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Upgrading": [[52, "upgrading"]], "Upgrading from dse-driver": [[52, "upgrading-from-dse-driver"]], "Import from the cassandra module": [[52, "import-from-the-cassandra-module"]], "dse-graph": [[52, "dse-graph"]], "Session.execute and Session.execute_async API": [[52, "session-execute-and-session-execute-async-api"]], "Deprecations": [[52, "deprecations"], [52, "id2"], [0, "deprecations"], [0, "id28"], [0, "id155"]], "Upgrading to 3.0": [[52, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[52, "default-consistency-is-now-local-one"]], "Execution API Updates": [[52, "execution-api-updates"]], "Result return normalization": [[52, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[52, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[52, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[52, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[52, "metadata-api-updates"]], "Several deprecated features are removed": [[52, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[52, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[52, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[52, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[52, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[52, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[52, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[52, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[52, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[52, "protocol-level-batch-statements"]], "SASL-based Authentication": [[52, "sasl-based-authentication"]], "Lightweight Transactions": [[52, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[52, "calling-cluster-shutdown"]], "Dependency Changes": [[52, "dependency-changes"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.timestamps - Timestamp Generation": [[31, "cassandra-timestamps-timestamp-generation"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "CHANGELOG": [[0, "changelog"]], "3.22.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id6"], [0, "id13"], [0, "id16"], [0, "id20"], [0, "id25"], [0, "id35"], [0, "id39"], [0, "id42"], [0, "id46"], [0, "id50"], [0, "id54"], [0, "id60"], [0, "id66"], [0, "id72"], [0, "id75"], [0, "id78"], [0, "id83"], [0, "id86"], [0, "id91"], [0, "id96"], [0, "id100"], [0, "id102"], [0, "id109"], [0, "id113"], [0, "id115"], [0, "id120"], [0, "id123"], [0, "id126"], [0, "id129"], [0, "id132"], [0, "id140"], [0, "id147"], [0, "id149"], [0, "id153"], [0, "id157"], [0, "id163"], [0, "id173"], [0, "id175"], [0, "id180"], [0, "id183"], [0, "id185"]], "3.21.0": [[0, "id2"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id7"], [0, "id9"], [0, "id11"], [0, "id14"], [0, "id17"], [0, "id21"], [0, "id23"], [0, "id26"], [0, "id30"], [0, "id33"], [0, "id36"], [0, "id43"], [0, "id47"], [0, "id51"], [0, "id55"], [0, "id61"], [0, "id64"], [0, "id67"], [0, "id70"], [0, "id73"], [0, "id76"], [0, "id79"], [0, "id81"], [0, "id84"], [0, "id87"], [0, "id92"], [0, "id94"], [0, "id97"], [0, "id101"], [0, "id103"], [0, "id105"], [0, "id107"], [0, "id110"], [0, "id112"], [0, "id114"], [0, "id116"], [0, "id118"], [0, "id121"], [0, "id124"], [0, "id127"], [0, "id130"], [0, "id133"], [0, "id136"], [0, "id138"], [0, "id141"], [0, "id143"], [0, "id145"], [0, "id148"], [0, "id150"], [0, "id154"], [0, "id158"], [0, "id161"], [0, "id164"], [0, "id167"], [0, "id170"], [0, "id172"], [0, "id176"], [0, "id178"], [0, "id181"], [0, "id184"], [0, "id186"], [0, "id188"]], "Others": [[0, "others"]], "Other": [[0, "other"], [0, "id18"], [0, "id27"], [0, "id31"], [0, "id37"], [0, "id40"], [0, "id44"], [0, "id48"], [0, "id52"], [0, "id56"], [0, "id62"], [0, "id68"], [0, "id98"], [0, "id134"], [0, "id139"], [0, "id151"], [0, "id159"], [0, "id165"], [0, "id168"], [0, "id171"], [0, "id174"], [0, "id177"], [0, "id179"], [0, "id182"], [0, "id187"]], "3.20.2": [[0, "id8"]], "3.20.1": [[0, "id10"]], "3.20.0": [[0, "id12"]], "3.19.0": [[0, "id15"]], "3.18.0": [[0, "id19"]], "3.17.1": [[0, "id22"]], "3.17.0": [[0, "id24"]], "3.16.0": [[0, "id29"]], "3.15.1": [[0, "id32"]], "3.15.0": [[0, "id34"]], "3.14.0": [[0, "id38"]], "3.13.0": [[0, "id41"]], "3.12.0": [[0, "id45"]], "3.11.0": [[0, "id49"]], "3.10.0": [[0, "id53"]], "3.9.0": [[0, "id59"]], "3.8.1": [[0, "id63"]], "3.8.0": [[0, "id65"]], "3.7.1": [[0, "id69"]], "3.7.0": [[0, "id71"]], "3.6.0": [[0, "id74"]], "3.5.0": [[0, "id77"]], "3.4.1": [[0, "id80"]], "3.4.0": [[0, "id82"]], "3.3.0": [[0, "id85"]], "3.2.2": [[0, "id88"]], "3.2.1": [[0, "id89"]], "3.2.0": [[0, "id90"]], "3.1.1": [[0, "id93"]], "3.1.0": [[0, "id95"]], "3.0.0": [[0, "id99"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id104"]], "2.7.1": [[0, "id106"]], "2.7.0": [[0, "id108"]], "2.6.0": [[0, "id111"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id117"]], "2.5.0": [[0, "id119"]], "2.1.4": [[0, "id122"]], "2.1.3": [[0, "id125"]], "2.1.2": [[0, "id128"]], "2.1.1": [[0, "id131"]], "2.1.0": [[0, "id135"]], "2.1.0c1": [[0, "id137"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id142"]], "2.0.1": [[0, "id144"]], "2.0.0": [[0, "id146"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id152"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id156"]], "1.1.1": [[0, "id160"]], "1.1.0": [[0, "id162"]], "1.0.2": [[0, "id166"]], "1.0.1": [[0, "id169"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "edge (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Edge"]], "graphson_1_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphOptions"]], "graphprotocol (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON2Reader"]], "path (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Path"]], "result (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Result"]], "simplegraphstatement (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.SimpleGraphStatement"]], "vertex (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Vertex"]], "vertexproperty (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.VertexProperty"]], "as_edge() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_edge"]], "as_path() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_path"]], "as_vertex() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_vertex"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize() (cassandra.datastax.graph.graphson2reader method)": [[15, "cassandra.datastax.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "label (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.label"]], "labels (cassandra.datastax.graph.path attribute)": [[15, "cassandra.datastax.graph.Path.labels"]], "objects (cassandra.datastax.graph.path attribute)": [[15, "cassandra.datastax.graph.Path.objects"]], "properties (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.properties"]], "read() (cassandra.datastax.graph.graphson2reader method)": [[15, "cassandra.datastax.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "value (cassandra.datastax.graph.result attribute)": [[15, "cassandra.datastax.graph.Result.value"]], "value (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.value"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/3.21.0-scylla/security.html b/3.21.0-scylla/security.html new file mode 100644 index 0000000000..e43c4047ed --- /dev/null +++ b/3.21.0-scylla/security.html @@ -0,0 +1,1012 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Security

      +

      The two main security components you will use with the +Python driver are Authentication and SSL.

      +
      +

      Authentication

      +

      Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

      +

      For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

      +
      from cassandra.cluster import Cluster
      +from cassandra.auth import PlainTextAuthProvider
      +
      +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
      +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
      +
      +
      +
      +

      Custom Authenticators

      +

      If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

      +
      +
      +

      Protocol v1 Authentication

      +

      When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

      +
      from cassandra.cluster import Cluster
      +
      +def get_credentials(host_address):
      +    return {'username': 'joe', 'password': '1234'}
      +
      +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
      +
      +
      +
      +
      +
      +

      SSL

      +

      SSL should be used when client encryption is enabled in Cassandra.

      +

      To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

      +

      To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

      +

      If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

      +

      The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

      + +

      It might be also useful to learn about the different levels of identity verification to understand the examples:

      + +
      +

      SSL with Twisted or Eventlet

      +

      Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

      +
      +
      +

      SSL Configuration Examples

      +

      Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

      +
      +

      No identity verification

      +

      No identity verification at all. Note that this is not recommended for for production deployments.

      +

      The Cassandra configuration:

      +
      client_encryption_options:
      +  enabled: true
      +  keystore: /path/to/127.0.0.1.keystore
      +  keystore_password: myStorePass
      +  require_client_auth: false
      +
      +
      +

      The driver configuration:

      +
      from cassandra.cluster import Cluster, Session
      +from ssl import SSLContext, PROTOCOL_TLSv1
      +
      +ssl_context = SSLContext(PROTOCOL_TLSv1)
      +
      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
      +session = cluster.connect()
      +
      +
      +
      +
      +

      Client verifies server

      +

      Ensure the python driver verifies the identity of the server.

      +

      The Cassandra configuration:

      +
      client_encryption_options:
      +  enabled: true
      +  keystore: /path/to/127.0.0.1.keystore
      +  keystore_password: myStorePass
      +  require_client_auth: false
      +
      +
      +

      For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

      +
      from cassandra.cluster import Cluster, Session
      +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
      +
      +ssl_context = SSLContext(PROTOCOL_TLSv1)
      +ssl_context.load_verify_locations('/path/to/rootca.crt')
      +ssl_context.verify_mode = CERT_REQUIRED
      +
      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
      +session = cluster.connect()
      +
      +
      +

      Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

      +
      from cassandra.cluster import Cluster, Session
      +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
      +
      +ssl_context = SSLContext(PROTOCOL_TLSv1)
      +ssl_context.load_verify_locations('/path/to/rootca.crt')
      +ssl_context.verify_mode = CERT_REQUIRED
      +ssl_context.check_hostname = True
      +ssl_options = {'server_hostname': '127.0.0.1'}
      +
      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
      +session = cluster.connect()
      +
      +
      +
      +
      +

      Server verifies client

      +

      If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

      +

      The cassandra configuration:

      +
      client_encryption_options:
      +  enabled: true
      +  keystore: /path/to/127.0.0.1.keystore
      +  keystore_password: myStorePass
      +  require_client_auth: true
      +  truststore: /path/to/dse-truststore.jks
      +  truststore_password: myStorePass
      +
      +
      +

      The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

      +
      cat > gen_client_cert.conf <<EOF
      +[ req ]
      +distinguished_name = req_distinguished_name
      +prompt = no
      +output_password = ${ROOT_CERT_PASS}
      +default_bits = 2048
      +
      +[ req_distinguished_name ]
      +C = ${CERT_COUNTRY}
      +O = ${CERT_ORG_NAME}
      +OU = ${CERT_OU}
      +CN = client
      +EOF
      +
      +
      +

      Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

      +
      openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
      +
      +
      +

      And generate the client signed certificate:

      +
      openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
      +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
      +
      +
      +

      Finally, you can use that configuration with the following driver code:

      +
      from cassandra.cluster import Cluster, Session
      +from ssl import SSLContext, PROTOCOL_TLSv1
      +
      +ssl_context = SSLContext(PROTOCOL_TLSv1)
      +ssl_context.load_cert_chain(
      +    certfile='/path/to/client.crt_signed',
      +    keyfile='/path/to/client.key')
      +
      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
      +session = cluster.connect()
      +
      +
      +
      +
      +

      Server verifies client and client verifies server

      +

      See the previous section for examples of Cassandra configuration and preparing +the client certificates.

      +

      The following driver code specifies that the connection should use two-way verification:

      +
      from cassandra.cluster import Cluster, Session
      +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
      +
      +ssl_context = SSLContext(PROTOCOL_TLSv1)
      +ssl_context.load_verify_locations('/path/to/rootca.crt')
      +ssl_context.verify_mode = CERT_REQUIRED
      +ssl_context.load_cert_chain(
      +    certfile='/path/to/client.crt_signed',
      +    keyfile='/path/to/client.key')
      +
      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
      +session = cluster.connect()
      +
      +
      +

      The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

      +

      Server verifies client and client verifies server using Twisted and pyOpenSSL

      +
      from OpenSSL import SSL, crypto
      +from cassandra.cluster import Cluster
      +from cassandra.io.twistedreactor import TwistedConnection
      +
      +ssl_context = SSL.Context(SSL.TLSv1_METHOD)
      +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
      +ssl_context.use_certificate_file('/path/to/client.crt_signed')
      +ssl_context.use_privatekey_file('/path/to/client.key')
      +ssl_context.load_verify_locations('/path/to/rootca.crt')
      +
      +cluster = Cluster(
      +    contact_points=['127.0.0.1'],
      +    connection_class=TwistedConnection,
      +    ssl_context=ssl_context,
      +    ssl_options={'check_hostname': True}
      +)
      +session = cluster.connect()
      +
      +
      +

      Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

      +
      +
      +
      +

      Versions 3.16.0 and lower

      +

      To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

      +

      By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLSv1 to match +Cassandra’s default protocol.

      +

      For example:

      +
      from cassandra.cluster import Cluster
      +from ssl import PROTOCOL_TLSv1, CERT_REQUIRED
      +
      +ssl_opts = {
      +    'ca_certs': '/path/to/my/ca.certs',
      +    'ssl_version': PROTOCOL_TLSv1,
      +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
      +}
      +cluster = Cluster(ssl_options=ssl_opts)
      +
      +
      +

      This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

      +
      +

      SSL with Twisted

      +

      In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

      +
      +
      +
      +
      +

      DSE Authentication

      +

      When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

      +
      from cassandra.auth import DSEGSSAPIAuthProvider
      +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
      +cluster = Cluster(auth_provider=auth_provider)
      +session = cluster.connect()
      +
      +
      +

      Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

      +
      +

      DSE Unified Authentication

      +

      With DSE (>=5.1), unified Authentication allows you to:

      +
        +
      • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

      • +
      • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

      • +
      +
      +

      Proxy Login

      +

      Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

      +
      GRANT PROXY.LOGIN on role user1 to server
      +
      +
      +

      then you can do the proxy authentication….

      +
      from cassandra.cluster import Cluster
      +from cassandra.auth import SaslAuthProvider
      +
      +sasl_kwargs = {
      +  "service": 'dse',
      +  "mechanism":"PLAIN",
      +  "username": 'server',
      +  'password': 'server',
      +  'authorization_id': 'user1'
      +}
      +
      +auth_provider = SaslAuthProvider(**sasl_kwargs)
      +c = Cluster(auth_provider=auth_provider)
      +s = c.connect()
      +s.execute(...)  # all requests will be executed as 'user1'
      +
      +
      +

      If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

      +
      from cassandra.cluster import Cluster
      +from cassandra.auth import DSEGSSAPIAuthProvider
      +
      +# Ensure the kerberos ticket of the server user is set with the kinit utility.
      +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
      +                                      authorization_id='user1@DATASTAX.COM')
      +c = Cluster(auth_provider=auth_provider)
      +s = c.connect()
      +s.execute(...)  # all requests will be executed as 'user1'
      +
      +
      +
      +
      +

      Proxy Execute

      +

      Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

      +
      GRANT PROXY.EXECUTE on role user1 to server
      +
      +
      +

      then you can do a proxy execute…

      +
      from cassandra.cluster import Cluster
      +from cassandra.auth import DSEPlainTextAuthProvider,
      +
      +auth_provider = DSEPlainTextAuthProvider('server', 'server')
      +
      +c = Cluster(auth_provider=auth_provider)
      +s = c.connect()
      +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
      +
      +
      +

      Please see the official documentation for more details on the feature and configuration process.

      +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/sitemap.xml b/3.21.0-scylla/sitemap.xml new file mode 100644 index 0000000000..af59ab90ed --- /dev/null +++ b/3.21.0-scylla/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/user_defined_types.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade_guide.htmlhttps://python-driver.docs.scylladb.com/stable/dates_and_times.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/execution_profiles.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/getting_started.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third_party.htmlhttps://python-driver.docs.scylladb.com/stable/object_mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query_paging.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/3.21.0-scylla/upgrading.html b/3.21.0-scylla/upgrading.html new file mode 100644 index 0000000000..696d702866 --- /dev/null +++ b/3.21.0-scylla/upgrading.html @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      Upgrading

      +
      +
      +
      +

      Upgrading from dse-driver

      +

      Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes.

      +
      +

      Installation

      +

      Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

      +
      pip install scylla-driver
      +
      +
      +

      If you need the Graph Fluent API (features provided by dse-graph):

      +
      pip install scylla-driver[graph]
      +
      +
      +

      See Installation for more details.

      +
      +
      +

      Import from the cassandra module

      +

      There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

      +
      from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
      +from dse.auth import PlainTextAuthProvider
      +from dse.policies import WhiteListRoundRobinPolicy
      +
      +# becomes
      +
      +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
      +from cassandra.auth import PlainTextAuthProvider
      +from cassandra.policies import WhiteListRoundRobinPolicy
      +
      +
      +

      Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

      +
      +
      +

      dse-graph

      +

      dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

      +
      from dse_graph import ..
      +from dse_graph.query import ..
      +
      +# becomes
      +
      +from cassandra.datastax.graph.fluent import ..
      +from cassandra.datastax.graph.fluent.query import ..
      +
      +
      +

      See fluent.

      +
      +
      +

      Session.execute and Session.execute_async API

      +

      Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

      +

      See Session.execute().

      +
      +
      +

      Deprecations

      +

      These changes are optional, but recommended:

      +
        +
      • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

      • +
      • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

      • +
      +
      +
      +
      +

      Upgrading to 3.0

      +

      Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

      +
      +

      Default consistency is now LOCAL_ONE

      +

      Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

      +
      +
      +

      Execution API Updates

      +
      +

      Result return normalization

      +

      PYTHON-368

      +

      Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

      +

      Now, all results are returned as an iterable ResultSet.

      +

      The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

      +
      results = session.execute("SELECT * FROM system.local")
      +for row in results:
      +    process(row)
      +
      +
      +

      If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

      +
      results = session.execute("SELECT * FROM system.local")
      +row_list = list(results)
      +
      +
      +

      For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

      +
      results = session.execute("SELECT * FROM system.local")
      +first_result = results[0]  # materializes results, fetching all pages
      +
      +
      +

      This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

      +
      +
      +

      Trace information is not attached to executed Statements

      +

      PYTHON-318

      +

      Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

      +

      Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

      +

      ResponseFuture.get_query_trace()

      +

      ResponseFuture.get_all_query_traces()

      +

      ResultSet.get_query_trace()

      +

      ResultSet.get_all_query_traces()

      +
      +
      +

      Binding named parameters now ignores extra names

      +

      PYTHON-178

      +

      Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

      +

      Behavior in 3.0+ is to ignore extra names.

      +
      +
      +
      +

      blist removed as soft dependency

      +

      PYTHON-385

      +

      Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

      +

      Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

      +
      +
      +

      Metadata API Updates

      +

      PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

      +

      Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

      +

      The present API is documented: cassandra.metadata. Changes highlighted below:

      +
        +
      • All types are now exposed as CQL types instead of types derived from the internal server implementation

      • +
      • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

      • +
      • Some metadata attributes removed

        +
          +
        • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

        • +
        • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

        • +
        +
      • +
      +
      +
      +

      Several deprecated features are removed

      +

      PYTHON-292

      +
        +
      • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

      • +
      • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

      • +
      • Cluster.submit_schema_refresh removed (574266d)

      • +
      • cqltypes time/date functions removed, use util entry points instead (bb984ee)

      • +
      • decoder module removed (e16a073)

      • +
      • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

      • +
      • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

      • +
      • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

      • +
      • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

      • +
      • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

      • +
      • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

      • +
      +
      +
      +
      +

      Upgrading to 2.1 from 2.0

      +

      Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

      +

      Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

      +
      +

      Using the v3 Native Protocol

      +

      By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

      +
      from cassandra.cluster import Cluster
      +
      +cluster = Cluster(protocol_version=3)
      +
      +
      +

      Note that protocol version 3 is only supported by Cassandra 2.1+.

      +

      In future releases, the driver may default to using protocol version +3.

      +
      +
      +

      Working with User-Defined Types

      +

      Cassandra 2.1 introduced the ability to define new types:

      +
      USE KEYSPACE mykeyspace;
      +
      +CREATE TYPE address (street text, city text, zip int);
      +
      +
      +

      The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

      +
      cluster = Cluster()
      +
      +class Address(object):
      +
      +    def __init__(self, street, city, zipcode):
      +        self.street = street
      +        self.city = text
      +        self.zipcode = zipcode
      +
      +cluster.register_user_type('mykeyspace', 'address', Address)
      +
      +
      +

      When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

      +

      If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

      +

      See User Defined Types for more details.

      +
      +
      +

      Customizing Encoders for Non-prepared Statements

      +

      Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

      +
      cluster = Cluster()
      +session = cluster.connect()
      +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
      +
      +
      +

      See Type Conversions for the table of default CQL literal conversions.

      +
      +
      +

      Using Client-Side Protocol-Level Timestamps

      +

      With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

      +

      When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

      +
      +
      +
      +

      Upgrading to 2.0 from 1.x

      +

      Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

      +
      +

      Using the v2 Native Protocol

      +

      By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

      +
      from cassandra.cluster import Cluster
      +
      +cluster = Cluster(protocol_version=2)
      +
      +
      +

      When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

      +
      from cassandra.cluster import Cluster
      +
      +cluster = Cluster(protocol_version=1)
      +
      +
      +
      +
      +

      Automatic Query Paging

      +

      Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

      +

      See Paging Large Queries for full details.

      +
      +
      +

      Protocol-Level Batch Statements

      +

      With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

      +

      See BatchStatement for details and usage examples.

      +
      +
      +

      SASL-based Authentication

      +

      Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

      +
      +
      +

      Lightweight Transactions

      +

      Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

      +
      +
      +

      Calling Cluster.shutdown()

      +

      In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

      +
      +
      +

      Deprecations

      +

      The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

      + +
      +
      +

      Dependency Changes

      +

      The following dependencies have officially been made optional:

      +
        +
      • scales

      • +
      • blist

      • +
      +

      And one new dependency has been added (to enable Python 3 support):

      +
        +
      • six

      • +
      +
      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.21.0-scylla/user_defined_types.html b/3.21.0-scylla/user_defined_types.html new file mode 100644 index 0000000000..1e27eaa59d --- /dev/null +++ b/3.21.0-scylla/user_defined_types.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      User Defined Types

      +

      Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

      +
      CREATE TYPE address (street text, zip int);
      +
      +
      +

      Version 2.1 of the Python driver adds support for user-defined types.

      +
      +

      Registering a UDT

      +

      You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

      +
      +

      Map a Class to a UDT

      +
      cluster = Cluster(protocol_version=3)
      +session = cluster.connect()
      +session.set_keyspace('mykeyspace')
      +session.execute("CREATE TYPE address (street text, zipcode int)")
      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
      +
      +# create a class to map to the "address" UDT
      +class Address(object):
      +
      +    def __init__(self, street, zipcode):
      +        self.street = street
      +        self.zipcode = zipcode
      +
      +cluster.register_user_type('mykeyspace', 'address', Address)
      +
      +# insert a row using an instance of Address
      +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
      +                (0, Address("123 Main St.", 78723)))
      +
      +# results will include Address instances
      +results = session.execute("SELECT * FROM users")
      +row = results[0]
      +print(row.id, row.location.street, row.location.zipcode)
      +
      +
      +
      +
      +

      Map a dict to a UDT

      +
      cluster = Cluster(protocol_version=3)
      +session = cluster.connect()
      +session.set_keyspace('mykeyspace')
      +session.execute("CREATE TYPE address (street text, zipcode int)")
      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
      +
      +cluster.register_user_type('mykeyspace', 'address', dict)
      +
      +# insert a row using a prepared statement and a tuple
      +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
      +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
      +
      +# results will include dict instances
      +results = session.execute("SELECT * FROM users")
      +row = results[0]
      +print(row.id, row.location['street'], row.location['zipcode'])
      +
      +
      +
      +
      +
      +

      Using UDTs Without Registering Them

      +

      Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

      +

      When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

      +
      cluster = Cluster(protocol_version=3)
      +session = cluster.connect()
      +session.set_keyspace('mykeyspace')
      +session.execute("CREATE TYPE address (street text, zipcode int)")
      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
      +
      +class Foo(object):
      +
      +    def __init__(self, street, zipcode, otherstuff):
      +        self.street = street
      +        self.zipcode = zipcode
      +        self.otherstuff = otherstuff
      +
      +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
      +
      +# since we're using a prepared statement, we don't *have* to register
      +# a class to map to the UDT to insert data.  The object just needs to have
      +# "street" and "zipcode" attributes (which Foo does):
      +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
      +
      +# when we query data, UDT columns that don't have a class registered
      +# will be returned as namedtuples:
      +results = session.execute("SELECT * FROM users")
      +first_row = results[0]
      +address = first_row.location
      +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
      +street = address.street
      +zipcode = address.street
      +
      +
      +

      As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

      +

      * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

      +
      +
      + + +
      + + + + + + +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/.buildinfo b/3.22.3-scylla/.buildinfo new file mode 100644 index 0000000000..c979e98ec0 --- /dev/null +++ b/3.22.3-scylla/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: b55d80dc9fd0315b4474c56166a451be +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/3.22.3-scylla/.doctrees/CHANGELOG.doctree b/3.22.3-scylla/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..03cee028d9 Binary files /dev/null and b/3.22.3-scylla/.doctrees/CHANGELOG.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra.doctree b/3.22.3-scylla/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..6e602a824b Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/auth.doctree b/3.22.3-scylla/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..f426004ba1 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/auth.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cluster.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..241300898d Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cluster.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/concurrent.doctree b/3.22.3-scylla/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..e6de39641a Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/connection.doctree b/3.22.3-scylla/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..b56636f6a6 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/connection.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..d4e2c6f206 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..e5fa47d0a5 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/management.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..00ba578c33 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/models.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..66400de1b1 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/query.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..5f345f2db0 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..abe56d1e43 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..8657be40fc Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..230c411a80 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..cab277bd9d Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..74a7adac3c Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/decoder.doctree b/3.22.3-scylla/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..580e56a167 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/decoder.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/encoder.doctree b/3.22.3-scylla/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..1fcd4a9c59 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/encoder.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/graph.doctree b/3.22.3-scylla/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..e1aa65493a Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/graph.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree b/3.22.3-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..69c9ebc6d1 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree b/3.22.3-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..9b7a4563b2 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree b/3.22.3-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..a895922fed Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/io/geventreactor.doctree b/3.22.3-scylla/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..0bb444faff Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/io/libevreactor.doctree b/3.22.3-scylla/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..9b0d26cd94 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree b/3.22.3-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..25a0ab6bad Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/metadata.doctree b/3.22.3-scylla/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..95e823e4b3 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/metadata.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/metrics.doctree b/3.22.3-scylla/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..54380755bb Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/metrics.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/policies.doctree b/3.22.3-scylla/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..a0068d3086 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/policies.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/pool.doctree b/3.22.3-scylla/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..64b898524a Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/pool.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/protocol.doctree b/3.22.3-scylla/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..b3fbd6dc71 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/protocol.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/query.doctree b/3.22.3-scylla/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..c7cbb3f910 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/query.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/timestamps.doctree b/3.22.3-scylla/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..0fee799021 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/cassandra/util.doctree b/3.22.3-scylla/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..d55e334253 Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/cassandra/util.doctree differ diff --git a/3.22.3-scylla/.doctrees/api/index.doctree b/3.22.3-scylla/.doctrees/api/index.doctree new file mode 100644 index 0000000000..2dc92f742b Binary files /dev/null and b/3.22.3-scylla/.doctrees/api/index.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/batches.doctree b/3.22.3-scylla/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..c749f988e3 Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/batches.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/connections.doctree b/3.22.3-scylla/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..f3bfbd6238 Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/connections.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/faq.doctree b/3.22.3-scylla/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..e8186793c4 Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/faq.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/models.doctree b/3.22.3-scylla/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..4b9e37756b Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/models.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/queryset.doctree b/3.22.3-scylla/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..11f3fe04d3 Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/queryset.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/third_party.doctree b/3.22.3-scylla/.doctrees/cqlengine/third_party.doctree new file mode 100644 index 0000000000..4cfbd70c21 Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/third_party.doctree differ diff --git a/3.22.3-scylla/.doctrees/cqlengine/upgrade_guide.doctree b/3.22.3-scylla/.doctrees/cqlengine/upgrade_guide.doctree new file mode 100644 index 0000000000..a47cbb93a4 Binary files /dev/null and b/3.22.3-scylla/.doctrees/cqlengine/upgrade_guide.doctree differ diff --git a/3.22.3-scylla/.doctrees/dates_and_times.doctree b/3.22.3-scylla/.doctrees/dates_and_times.doctree new file mode 100644 index 0000000000..dc7a680c85 Binary files /dev/null and b/3.22.3-scylla/.doctrees/dates_and_times.doctree differ diff --git a/3.22.3-scylla/.doctrees/environment.pickle b/3.22.3-scylla/.doctrees/environment.pickle new file mode 100644 index 0000000000..e2e3ae7851 Binary files /dev/null and b/3.22.3-scylla/.doctrees/environment.pickle differ diff --git a/3.22.3-scylla/.doctrees/execution_profiles.doctree b/3.22.3-scylla/.doctrees/execution_profiles.doctree new file mode 100644 index 0000000000..6cefff16c6 Binary files /dev/null and b/3.22.3-scylla/.doctrees/execution_profiles.doctree differ diff --git a/3.22.3-scylla/.doctrees/faq.doctree b/3.22.3-scylla/.doctrees/faq.doctree new file mode 100644 index 0000000000..d28ffb096b Binary files /dev/null and b/3.22.3-scylla/.doctrees/faq.doctree differ diff --git a/3.22.3-scylla/.doctrees/getting_started.doctree b/3.22.3-scylla/.doctrees/getting_started.doctree new file mode 100644 index 0000000000..5d5fedd8a2 Binary files /dev/null and b/3.22.3-scylla/.doctrees/getting_started.doctree differ diff --git a/3.22.3-scylla/.doctrees/index.doctree b/3.22.3-scylla/.doctrees/index.doctree new file mode 100644 index 0000000000..d52646ddb2 Binary files /dev/null and b/3.22.3-scylla/.doctrees/index.doctree differ diff --git a/3.22.3-scylla/.doctrees/installation.doctree b/3.22.3-scylla/.doctrees/installation.doctree new file mode 100644 index 0000000000..b969e0591b Binary files /dev/null and b/3.22.3-scylla/.doctrees/installation.doctree differ diff --git a/3.22.3-scylla/.doctrees/lwt.doctree b/3.22.3-scylla/.doctrees/lwt.doctree new file mode 100644 index 0000000000..ad9b31bfb2 Binary files /dev/null and b/3.22.3-scylla/.doctrees/lwt.doctree differ diff --git a/3.22.3-scylla/.doctrees/object_mapper.doctree b/3.22.3-scylla/.doctrees/object_mapper.doctree new file mode 100644 index 0000000000..8395b26726 Binary files /dev/null and b/3.22.3-scylla/.doctrees/object_mapper.doctree differ diff --git a/3.22.3-scylla/.doctrees/performance.doctree b/3.22.3-scylla/.doctrees/performance.doctree new file mode 100644 index 0000000000..c55978613f Binary files /dev/null and b/3.22.3-scylla/.doctrees/performance.doctree differ diff --git a/3.22.3-scylla/.doctrees/query_paging.doctree b/3.22.3-scylla/.doctrees/query_paging.doctree new file mode 100644 index 0000000000..fedc6b847e Binary files /dev/null and b/3.22.3-scylla/.doctrees/query_paging.doctree differ diff --git a/3.22.3-scylla/.doctrees/scylla_cloud.doctree b/3.22.3-scylla/.doctrees/scylla_cloud.doctree new file mode 100644 index 0000000000..29feda08f8 Binary files /dev/null and b/3.22.3-scylla/.doctrees/scylla_cloud.doctree differ diff --git a/3.22.3-scylla/.doctrees/scylla_specific.doctree b/3.22.3-scylla/.doctrees/scylla_specific.doctree new file mode 100644 index 0000000000..e81b7dcb05 Binary files /dev/null and b/3.22.3-scylla/.doctrees/scylla_specific.doctree differ diff --git a/3.22.3-scylla/.doctrees/security.doctree b/3.22.3-scylla/.doctrees/security.doctree new file mode 100644 index 0000000000..f94562b50d Binary files /dev/null and b/3.22.3-scylla/.doctrees/security.doctree differ diff --git a/3.22.3-scylla/.doctrees/upgrading.doctree b/3.22.3-scylla/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..294c76312c Binary files /dev/null and b/3.22.3-scylla/.doctrees/upgrading.doctree differ diff --git a/3.22.3-scylla/.doctrees/user_defined_types.doctree b/3.22.3-scylla/.doctrees/user_defined_types.doctree new file mode 100644 index 0000000000..1ddabc0947 Binary files /dev/null and b/3.22.3-scylla/.doctrees/user_defined_types.doctree differ diff --git a/3.22.3-scylla/.nojekyll b/3.22.3-scylla/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.22.3-scylla/404.html b/3.22.3-scylla/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/3.22.3-scylla/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
      +

      404

      +

      The ScyllaDB monster ate your page!

      +

      + Home +

      +
      + + + \ No newline at end of file diff --git a/3.22.3-scylla/CHANGELOG.html b/3.22.3-scylla/CHANGELOG.html new file mode 100644 index 0000000000..a2f9b9d551 --- /dev/null +++ b/3.22.3-scylla/CHANGELOG.html @@ -0,0 +1,2813 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +
      +

      CHANGELOG

      +
      +

      3.22.0

      +

      February 26, 2020

      +
      +

      Features

      +
        +
      • Add all() function to the ResultSet API (PYTHON-1203)

      • +
      • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

      • +
      • Add GraphSON3 support (PYTHON-788)

      • +
      • Use GraphSON3 as default for Native graphs (PYTHON-1004)

      • +
      • Add Tuple and UDT types for native graph (PYTHON-1005)

      • +
      • Add Duration type for native graph (PYTHON-1000)

      • +
      • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

      • +
      • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

      • +
      • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

      • +
      • Resolve the row_factory automatically for native graphs (PYTHON-1056)

      • +
      • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

      • +
      • Add g:BulkSet graph deserializers (PYTHON-1060)

      • +
      • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

      • +
      • Update Native to Core Graph Engine

      • +
      • Add graphson3 and native graph support (PYTHON-1039)

      • +
      • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

      • +
      • Expose filter predicates for cql collections (PYTHON-1019)

      • +
      • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

      • +
      • Make graph metadata handling more robust (PYTHON-1204)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

      • +
      +
      +
      +
      +

      3.21.0

      +

      January 15, 2020

      +
      +

      Features

      +
        +
      • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

      • +
      • Add Python 3.8 support (PYTHON-1189)

      • +
      • Allow passing ssl context for Twisted (PYTHON-1161)

      • +
      • Ssl context and cloud support for Eventlet (PYTHON-1162)

      • +
      • Cloud Twisted support (PYTHON-1163)

      • +
      • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

      • +
      • Flexible version parsing (PYTHON-1174)

      • +
      • Support NULL in collection deserializer (PYTHON-1123)

      • +
      • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

      • +
      • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

      • +
      • asyncio message chunks can be processed discontinuously (PYTHON-1185)

      • +
      • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

      • +
      • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

      • +
      • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

      • +
      • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

      • +
      +
      +
      +

      Others

      +
        +
      • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

      • +
      • Remove *read_repair_chance table options (PYTHON-1140)

      • +
      • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

      • +
      • Add new DSE CQL keywords (PYTHON-1122)

      • +
      • Publish binary wheel distributions (PYTHON-1013)

      • +
      +
      +
      +

      Deprecations

      +
        +
      • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

      • +
      +

      Merged from dse-driver:

      +
      +
      +

      Features

      +
        +
      • Insights integration (PYTHON-1047)

      • +
      • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

      • +
      • Add NodeSync metadata (PYTHON-799)

      • +
      • Add new NodeSync failure values (PYTHON-934)

      • +
      • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

      • +
      • GraphOptions should show a warning for unknown parameters (PYTHON-819)

      • +
      • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

      • +
      • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

      • +
      • Add graph-results payload option for GraphSON format (PYTHON-773)

      • +
      • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

      • +
      • Implement serializers for the Graph String API (PYTHON-778)

      • +
      • Provide deserializers for GraphSON types (PYTHON-782)

      • +
      • Add Graph DurationType support (PYTHON-607)

      • +
      • Support DSE DateRange type (PYTHON-668)

      • +
      • RLAC CQL output for materialized views (PYTHON-682)

      • +
      • Add Geom Types wkt deserializer

      • +
      • DSE Graph Client timeouts in custom payload (PYTHON-589)

      • +
      • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

      • +
      • Add config profiles to DSE graph execution (PYTHON-570)

      • +
      • DSE Driver version checking (PYTHON-568)

      • +
      • Distinct default timeout for graph queries (PYTHON-477)

      • +
      • Graph result parsing for known types (PYTHON-479,487)

      • +
      • Distinct read/write CL for graph execution (PYTHON-509)

      • +
      • Target graph analytics query to spark master when available (PYTHON-510)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

      • +
      • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

      • +
      • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

      • +
      • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

      • +
      • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

      • +
      • Update date serialization to isoformat in graph (PYTHON-805)

      • +
      • DateRange Parse Error (PYTHON-729)

      • +
      • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

      • +
      • metadata.get_host returning None unexpectedly (PYTHON-709)

      • +
      • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

      • +
      • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

      • +
      • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

      • +
      • Correctly handle other types in geo type equality (PYTHON-508)

      • +
      +
      +
      +

      Other

      +
        +
      • Add tests around cqlengine and continuous paging (PYTHON-872)

      • +
      • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

      • +
      • Write documentation examples for DSE 2.0 features (PYTHON-732)

      • +
      • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

      • +
      +
      +
      +
      +

      3.20.2

      +

      November 19, 2019

      +
      +

      Bug Fixes

      +
        +
      • Fix import error for old python installation without SSLContext (PYTHON-1183)

      • +
      +
      +
      +
      +

      3.20.1

      +

      November 6, 2019

      +
      +

      Bug Fixes

      +
        +
      • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

      • +
      +
      +
      +
      +

      3.20.0

      +

      October 28, 2019

      +
      +

      Features

      +
        +
      • DataStax Apollo Support (PYTHON-1074)

      • +
      • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

      • +
      • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

      • +
      • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

      • +
      +
      +
      +
      +

      3.19.0

      +

      August 26, 2019

      +
      +

      Features

      +
        +
      • Add Python 3.7 support (PYTHON-1016)

      • +
      • Future-proof Mapping imports (PYTHON-1023)

      • +
      • Include param values in cqlengine logging (PYTHON-1105)

      • +
      • NTS Token Replica Map Generation is slow (PYTHON-622)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

      • +
      • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

      • +
      • Fix incorrect metadata for compact counter tables (PYTHON-1100)

      • +
      • Call ConnectionException with correct kwargs (PYTHON-1117)

      • +
      • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

      • +
      • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

      • +
      • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

      • +
      +
      +
      +

      Other

      +
        +
      • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

      • +
      • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

      • +
      +
      +
      +
      +

      3.18.0

      +

      May 27, 2019

      +
      +

      Features

      +
        +
      • Abstract Host Connection information (PYTHON-1079)

      • +
      • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

      • +
      • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

      • +
      • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

      • +
      • Accept legacy empty strings as column names (PYTHON-1082)

      • +
      • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

      • +
      +
      +
      +
      +

      3.17.1

      +

      May 2, 2019

      +
      +

      Bug Fixes

      +
        +
      • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

      • +
      +
      +
      +
      +

      3.17.0

      +

      February 19, 2019

      +
      +

      Features

      +
        +
      • Send driver name and version in startup message (PYTHON-1068)

      • +
      • Add Cluster ssl_context option to enable SSL (PYTHON-995)

      • +
      • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

      • +
      • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

      • +
      • Add Session.get_execution_profile (PYTHON-932)

      • +
      • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

      • +
      • Serial consistency level is not used (PYTHON-1007)

      • +
      +
      +
      +

      Other

      +
        +
      • Fail faster on incorrect lz4 import (PYTHON-1042)

      • +
      • Bump Cython dependency version to 0.29 (PYTHON-1036)

      • +
      • Expand Driver SSL Documentation (PYTHON-740)

      • +
      +
      +
      +

      Deprecations

      +
        +
      • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

      • +
      • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

      • +
      +
      +
      +
      +

      3.16.0

      +

      November 12, 2018

      +
      +

      Bug Fixes

      +
        +
      • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

      • +
      • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

      • +
      • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

      • +
      • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

      • +
      • Log profile name on attempt to create existing profile (PYTHON-944)

      • +
      • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

      • +
      +
      +
      +

      Other

      +
        +
      • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

      • +
      • Fix wrong use of ResultSet indexing (PYTHON-1015)

      • +
      +
      +
      +
      +

      3.15.1

      +

      September 6, 2018

      +
      +

      Bug Fixes

      +
        +
      • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

      • +
      +
      +
      +
      +

      3.15.0

      +

      August 30, 2018

      +
      +

      Features

      +
        +
      • Parse Virtual Keyspace Metadata (PYTHON-992)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

      • +
      • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

      • +
      • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

      • +
      • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

      • +
      +
      +
      +

      Other

      +
        +
      • Use global variable for libev loops so it can be subclassed (PYTHON-973)

      • +
      • Update SchemaParser for V4 (PYTHON-1006)

      • +
      • Bump Cython dependency version to 0.28 (PYTHON-1012)

      • +
      +
      +
      +
      +

      3.14.0

      +

      April 17, 2018

      +
      +

      Features

      +
        +
      • Add one() function to the ResultSet API (PYTHON-947)

      • +
      • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

      • +
      • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

      • +
      • Twisted SSL Support (PYTHON-343)

      • +
      • Support IS NOT NULL operator in cqlengine (PYTHON-968)

      • +
      +
      +
      +

      Other

      +
        +
      • Fix Broken Links in Docs (PYTHON-916)

      • +
      • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

      • +
      • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

      • +
      • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

      • +
      • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

      • +
      • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

      • +
      • Add DSE smoke test to OSS driver tests (PYTHON-894)

      • +
      • Document long compilation times and workarounds (PYTHON-868)

      • +
      • Improve error for batch WriteTimeouts (PYTHON-941)

      • +
      • Deprecate ResultSet indexing (PYTHON-945)

      • +
      +
      +
      +
      +

      3.13.0

      +

      January 30, 2018

      +
      +

      Features

      +
        +
      • cqlengine: LIKE filter operator (PYTHON-512)

      • +
      • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

      • +
      • Support retry_policy in PreparedStatement (PYTHON-861)

      • +
      • __del__ method in Session is throwing an exception (PYTHON-813)

      • +
      • LZ4 import issue with recent versions (PYTHON-897)

      • +
      • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

      • +
      • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

      • +
      +
      +
      +

      Other

      +
        +
      • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

      • +
      • Fix DeprecationWarning of log.warn (PYTHON-846)

      • +
      • Fix example_mapper.py for python3 (PYTHON-860)

      • +
      • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

      • +
      • Add some known deprecated warnings for 4.x (PYTHON-877)

      • +
      • Remove copyright dates from copyright notices (PYTHON-863)

      • +
      • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

      • +
      • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

      • +
      • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

      • +
      • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

      • +
      +
      +
      +
      +

      3.12.0

      +

      November 6, 2017

      +
      +

      Features

      +
        +
      • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

      • +
      • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

      • +
      • WriteType.CDC and VIEW missing (PYTHON-794)

      • +
      • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

      • +
      • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

      • +
      • Include hash of result set metadata in prepared stmt id (PYTHON-808)

      • +
      • Add NO_COMPACT startup option (PYTHON-839)

      • +
      • Add new exception type for CDC (PYTHON-837)

      • +
      • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

      • +
      • Add asyncio reactor (PYTHON-507)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

      • +
      • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

      • +
      • Not create two sessions by default in CQLEngine (PYTHON-814)

      • +
      • Bug when subclassing AyncoreConnection (PYTHON-827)

      • +
      • Error at cleanup when closing the asyncore connections (PYTHON-829)

      • +
      • Fix sites where sessions can change during iteration (PYTHON-793)

      • +
      • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

      • +
      • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

      • +
      • Dont set the session keyspace when preparing statements (PYTHON-843)

      • +
      • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

      • +
      +
      +
      +

      Other

      +
        +
      • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

      • +
      • Bump Cython dependency version to 0.27 (PYTHON-833)

      • +
      +
      +
      +
      +

      3.11.0

      +

      July 24, 2017

      +
      +

      Features

      +
        +
      • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

      • +
      • Add HostFilterPolicy (PYTHON-761)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

      • +
      • Fix asyncore hang on exit (PYTHON-767)

      • +
      • Driver takes several minutes to remove a bad host from session (PYTHON-762)

      • +
      • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

      • +
      • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

      • +
      • request_ids may not be returned to the pool (PYTHON-739)

      • +
      • Fix murmur3 on big-endian systems (PYTHON-653)

      • +
      • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

      • +
      • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

      • +
      +
      +
      +

      Other

      +
        +
      • Bump Cython dependency version to 0.25.2 (PYTHON-754)

      • +
      • Fix DeprecationWarning when using lz4 (PYTHON-769)

      • +
      • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

      • +
      • Improve upgrade guide for materializing pages (PYTHON-464)

      • +
      • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

      • +
      • Point to DSA Slack, not IRC, in docs index

      • +
      +
      +
      +
      +

      3.10.0

      +

      May 24, 2017

      +
      +

      Features

      +
        +
      • Add Duration type to cqlengine (PYTHON-750)

      • +
      • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

      • +
      • get_query_trace() contract is ambiguous (PYTHON-196)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Queries using speculative execution policy timeout prematurely (PYTHON-755)

      • +
      • Fix map where results are not consumed (PYTHON-749)

      • +
      • Driver fails to encode Duration’s with large values (PYTHON-747)

      • +
      • UDT values are not updated correctly in CQLEngine (PYTHON-743)

      • +
      • UDT types are not validated in CQLEngine (PYTHON-742)

      • +
      • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

      • +
      • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

      • +
      • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

      • +
      • Memory grows and doesn’t get removed (PYTHON-720)

      • +
      • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

      • +
      • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

      • +
      • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

      • +
      +
      +
      +

      Other

      +
        +
      • Update README (PYTHON-746)

      • +
      • Test python versions 3.5 and 3.6 (PYTHON-737)

      • +
      • Docs Warning About Prepare select * (PYTHON-626)

      • +
      • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

      • +
      • Example SSL connection code does not verify server certificates (PYTHON-469)

      • +
      +
      +
      +
      +

      3.9.0

      +
      +

      Features

      +
        +
      • cqlengine: remove elements by key from a map (PYTHON-688)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • improve error handling when connecting to non-existent keyspace (PYTHON-665)

      • +
      • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

      • +
      • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

      • +
      • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

      • +
      • race where callback or errback for request may not be called (PYTHON-733)

      • +
      • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

      • +
      • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

      • +
      +
      +
      +

      Other

      +
        +
      • Connection not closed in example_mapper (PYTHON-723)

      • +
      • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

      • +
      +
      +
      +
      +

      3.8.1

      +

      March 16, 2017

      +
      +

      Bug Fixes

      +
        +
      • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

      • +
      • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

      • +
      • Fix DecimalType regression (PYTHON-724)

      • +
      +
      +
      +
      +

      3.8.0

      +
      +

      Features

      +
        +
      • Quote index names in metadata CQL generation (PYTHON-616)

      • +
      • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

      • +
      • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

      • +
      • Added cql types to result set (PYTHON-648)

      • +
      • Add __len__ to BatchStatement (PYTHON-650)

      • +
      • Duration Type for Cassandra (PYTHON-655)

      • +
      • Send flags with PREPARE message in v5 (PYTHON-684)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

      • +
      • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

      • +
      • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

      • +
      • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

      • +
      • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

      • +
      • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

      • +
      • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

      • +
      • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

      • +
      • Make client timestamps strictly monotonic (PYTHON-676)

      • +
      • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

      • +
      +
      +
      +

      Other

      +
        +
      • Create a cqlengine doc section explaining None semantics (PYTHON-623)

      • +
      • Resolve warnings in documentation generation (PYTHON-645)

      • +
      • Cython dependency (PYTHON-686)

      • +
      • Drop Support for Python 2.6 (PYTHON-690)

      • +
      +
      +
      +
      +

      3.7.1

      +

      October 26, 2016

      +
      +

      Bug Fixes

      +
        +
      • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

      • +
      +
      +
      +
      +

      3.7.0

      +

      September 13, 2016

      +
      +

      Features

      +
        +
      • Add v5 protocol failure map (PYTHON-619)

      • +
      • Don’t return from initial connect on first error (PYTHON-617)

      • +
      • Indicate failed column when deserialization fails (PYTHON-361)

      • +
      • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

      • +
      • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

      • +
      • EC2 Address Resolver (PYTHON-198)

      • +
      • Speculative query retries (PYTHON-218)

      • +
      • Expose paging state in API (PYTHON-200)

      • +
      • Don’t mark host down while one connection is active (PYTHON-498)

      • +
      • Query request size information (PYTHON-284)

      • +
      • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

      • +
      • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

      • +
      • Add beta version native protocol flag (PYTHON-614)

      • +
      • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Race when adding a pool while setting keyspace (PYTHON-628)

      • +
      • Update results_metadata when prepared statement is reprepared (PYTHON-621)

      • +
      • CQL Export for Thrift Tables (PYTHON-213)

      • +
      • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

      • +
      • cqlengine: columns are no longer hashable (PYTHON-618)

      • +
      • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

      • +
      +
      +
      +
      +

      3.6.0

      +

      August 1, 2016

      +
      +

      Features

      +
        +
      • Handle null values in NumpyProtocolHandler (PYTHON-553)

      • +
      • Collect greplin scales stats per cluster (PYTHON-561)

      • +
      • Update mock unit test dependency requirement (PYTHON-591)

      • +
      • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

      • +
      • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

      • +
      • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

      • +
      • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

      • +
      • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

      • +
      • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix geventreactor with SSL support (PYTHON-600)

      • +
      • Don’t downgrade protocol version if explicitly set (PYTHON-537)

      • +
      • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

      • +
      • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

      • +
      • Libev loop shutdown race (PYTHON-578)

      • +
      • Include aliases in DCT type string (PYTHON-579)

      • +
      • cqlengine: Comparison operators for Columns (PYTHON-595)

      • +
      • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

      • +
      • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

      • +
      • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

      • +
      • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

      • +
      • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

      • +
      • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

      • +
      +
      +
      +
      +

      3.5.0

      +

      June 27, 2016

      +
      +

      Features

      +
        +
      • Optional Execution Profiles for the core driver (PYTHON-569)

      • +
      • API to get the host metadata associated with the control connection node (PYTHON-583)

      • +
      • Expose CDC option in table metadata CQL (PYTHON-593)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Clean up Asyncore socket map when fork is detected (PYTHON-577)

      • +
      • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

      • +
      +
      +
      +
      +

      3.4.1

      +

      May 26, 2016

      +
      +

      Bug Fixes

      +
        +
      • Gevent connection closes on IO timeout (PYTHON-573)

      • +
      • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

      • +
      +
      +
      +
      +

      3.4.0

      +

      May 24, 2016

      +
      +

      Features

      +
        +
      • Include DSE version and workload in Host data (PYTHON-555)

      • +
      • Add a context manager to Cluster and Session (PYTHON-521)

      • +
      • Better Error Message for Unsupported Protocol Version (PYTHON-157)

      • +
      • Make the error message explicitly state when an error comes from the server (PYTHON-412)

      • +
      • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

      • +
      • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

      • +
      • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

      • +
      • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

      • +
      • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

      • +
      • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

      • +
      • Write docs around working with datetime and timezones (PYTHON-394)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • High CPU utilization when using asyncore event loop (PYTHON-239)

      • +
      • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

      • +
      • Make stress scripts Python 2.6 compatible (PYTHON-434)

      • +
      • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

      • +
      • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

      • +
      • Cluster and Session do not GC after leaving scope (PYTHON-135)

      • +
      • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

      • +
      • Reprepare on_up with many clients causes node overload (PYTHON-556)

      • +
      • None inserted into host map when control connection node is decommissioned (PYTHON-548)

      • +
      • weakref.ref does not accept keyword arguments (github #585)

      • +
      +
      +
      +
      +

      3.3.0

      +

      May 2, 2016

      +
      +

      Features

      +
        +
      • Add an AddressTranslator interface (PYTHON-69)

      • +
      • New Retry Policy Decision - try next host (PYTHON-285)

      • +
      • Don’t mark host down on timeout (PYTHON-286)

      • +
      • SSL hostname verification (PYTHON-296)

      • +
      • Add C* version to metadata or cluster objects (PYTHON-301)

      • +
      • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

      • +
      • Expose listen_address of node we get ring information from (PYTHON-332)

      • +
      • Use A-record with multiple IPs for contact points (PYTHON-415)

      • +
      • Custom consistency level for populating query traces (PYTHON-435)

      • +
      • Normalize Server Exception Types (PYTHON-443)

      • +
      • Propagate exception message when DDL schema agreement fails (PYTHON-444)

      • +
      • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

      • +
      • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

      • +
      • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

      • +
      • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

      • +
      • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

      • +
      • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

      • +
      +
      +
      +
      +

      3.2.2

      +

      April 19, 2016

      +
        +
      • Fix counter save-after-no-update (PYTHON-547)

      • +
      +
      +
      +

      3.2.1

      +

      April 13, 2016

      +
        +
      • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

      • +
      +
      +
      +

      3.2.0

      +

      April 12, 2016

      +
      +

      Features

      +
        +
      • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

      • +
      • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

      • +
      • cqlengine: support non-equal conditions for LWT (PYTHON-528)

      • +
      • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

      • +
      • cqlengine: token-aware routing for mapper statements (PYTHON-535)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

      • +
      • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

      • +
      • comparing models with datetime fields fail #79 (PYTHON-273)

      • +
      • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

      • +
      • db_field is not always respected with UpdateStatement (PYTHON-530)

      • +
      • Sync_table fails on column.Set with secondary index (PYTHON-533)

      • +
      +
      +
      +
      +

      3.1.1

      +

      March 14, 2016

      +
      +

      Bug Fixes

      +
        +
      • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

      • +
      +
      +
      +
      +

      3.1.0

      +

      March 10, 2016

      +
      +

      Features

      +
        +
      • Pass name of server auth class to AuthProvider (PYTHON-454)

      • +
      • Surface schema agreed flag for DDL statements (PYTHON-458)

      • +
      • Automatically convert float and int to Decimal on serialization (PYTHON-468)

      • +
      • Eventlet Reactor IO improvement (PYTHON-495)

      • +
      • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

      • +
      • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

      • +
      • Add Session.default_serial_consistency_level (github #510)

      • +
      • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

      • +
      • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

      • +
      • cqlengine: Add DISTINCT query operator (PYTHON-266)

      • +
      • cqlengine: Tuple cqlengine api (PYTHON-306)

      • +
      • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

      • +
      • cqlengine: Allow nested container types (PYTHON-478)

      • +
      • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

      • +
      • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

      • +
      • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

      • +
      • Overflow when decoding large collections (cython) (PYTHON-459)

      • +
      • Timer heap comparison issue with Python 3 (github #466)

      • +
      • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

      • +
      • Decode error encountered when cython deserializing large map results (PYTHON-459)

      • +
      • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

      • +
      • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

      • +
      • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

      • +
      • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

      • +
      • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

      • +
      • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

      • +
      • cqlengine: db_field breaks UserType (PYTHON-346)

      • +
      • cqlengine: UDT badly quoted (PYTHON-347)

      • +
      • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

      • +
      • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

      • +
      • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

      • +
      • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

      • +
      • cqlengine: Better error for management functions when no connection set (PYTHON-451)

      • +
      • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

      • +
      • cqlengine: Fix inserting None for model save (PYTHON-475)

      • +
      • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

      • +
      • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

      • +
      • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

      • +
      +
      +
      +

      Other

      +
        +
      • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

      • +
      • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

      • +
      +
      +
      +
      +

      3.0.0

      +

      November 24, 2015

      +
      +

      Features

      +
        +
      • Support datetime.date objects as a DateType (PYTHON-212)

      • +
      • Add Cluster.update_view_metadata (PYTHON-407)

      • +
      • QueryTrace option to populate partial trace sessions (PYTHON-438)

      • +
      • Attach column names to ResultSet (PYTHON-439)

      • +
      • Change default consistency level to LOCAL_ONE

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

      • +
      • Evict UDTs from UserType cache on change (PYTHON-226)

      • +
      • Make sure query strings are always encoded UTF-8 (PYTHON-334)

      • +
      • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

      • +
      • UDT CQL encoding does not work for unicode values (PYTHON-353)

      • +
      • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

      • +
      • Cython integer overflow on decimal type deserialization (PYTHON-433)

      • +
      • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

      • +
      +
      +
      +
      +

      3.0.0rc1

      +

      November 9, 2015

      +
      +

      Features

      +
        +
      • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

      • +
      • Remove deprecated features (PYTHON-292)

      • +
      • Don’t assign trace data to Statements (PYTHON-318)

      • +
      • Normalize results return (PYTHON-368)

      • +
      • Process Materialized View Metadata/Events (PYTHON-371)

      • +
      • Remove blist as soft dependency (PYTHON-385)

      • +
      • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

      • +
      • Normalize CQL query/export in metadata model (PYTHON-405)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Implementation of named arguments bind is non-pythonic (PYTHON-178)

      • +
      • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

      • +
      • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

      • +
      • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

      • +
      • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

      • +
      +
      +
      +
      +

      2.7.2

      +

      September 14, 2015

      +
      +

      Bug Fixes

      +
        +
      • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

      • +
      • Remove futures dep. for Python 3 (PYTHON-393)

      • +
      • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

      • +
      • Unit test runtime issues (PYTHON-397,398)

      • +
      +
      +
      +
      +

      2.7.1

      +

      August 25, 2015

      +
      +

      Bug Fixes

      +
        +
      • Explicitly include extension source files in Manifest

      • +
      +
      +
      +
      +

      2.7.0

      +

      August 25, 2015

      +

      Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

      +
      +

      Features

      +
        +
      • General Performance Improvements for Throughput (PYTHON-283)

      • +
      • Improve synchronous request performance with Timers (PYTHON-108)

      • +
      • Enable C Extensions for PyPy Runtime (PYTHON-357)

      • +
      • Refactor SerDes functionality for pluggable interface (PYTHON-313)

      • +
      • Cython SerDes Extension (PYTHON-377)

      • +
      • Accept iterators/generators for execute_concurrent() (PYTHON-123)

      • +
      • cythonize existing modules (PYTHON-342)

      • +
      • Pure Python murmur3 implementation (PYTHON-363)

      • +
      • Make driver tolerant of inconsistent metadata (PYTHON-370)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

      • +
      • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

      • +
      • Blocking connect does not use connect_timeout (PYTHON-381)

      • +
      • Properly protect partition key in CQL export (PYTHON-375)

      • +
      • Trigger error callbacks on timeout (PYTHON-294)

      • +
      +
      +
      +
      +

      2.6.0

      +

      July 20, 2015

      +
      +

      Bug Fixes

      +
        +
      • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

      • +
      +
      +
      +
      +

      2.6.0c2

      +

      June 24, 2015

      +
      +

      Features

      +
        +
      • Automatic Protocol Version Downgrade (PYTHON-240)

      • +
      • cqlengine Python 2.6 compatibility (PYTHON-288)

      • +
      • Double-dollar string quote UDF body (PYTHON-345)

      • +
      • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Avoid stall while connecting to mixed version cluster (PYTHON-303)

      • +
      • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

      • +
      • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

      • +
      • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

      • +
      • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

      • +
      +
      +
      +
      +

      2.6.0c1

      +

      June 4, 2015

      +

      This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

      +
      +

      Features

      +
        +
      • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

      • +
      • Configuration option for connection timeout (PYTHON-206)

      • +
      • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

      • +
      • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

      • +
      • Implement new request failure messages in protocol v4+ (PYTHON-238)

      • +
      • Metadata model now maps index meta by index name (PYTHON-241)

      • +
      • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

      • +
      • cqle: add Double column type and remove Float overload (PYTHON-246)

      • +
      • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

      • +
      • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

      • +
      • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

      • +
      • Save trace id even when trace complete times out (PYTHON-302)

      • +
      • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

      • +
      • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

      • +
      • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

      • +
      • Expose CQL keywords in API (PYTHON-324)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • IPv6 address support on Windows (PYTHON-20)

      • +
      • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

      • +
      • cqle: Quote keywords properly in table management functions (PYTHON-244)

      • +
      • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

      • +
      • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

      • +
      • Make protocol read_inet work for Windows (PYTHON-309)

      • +
      • cqle: Correct encoding for nested types (PYTHON-311)

      • +
      • Update list of CQL keywords used quoting identifiers (PYTHON-319)

      • +
      • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

      • +
      • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

      • +
      +
      +
      +
      +

      2.5.1

      +

      April 23, 2015

      +
      +

      Bug Fixes

      +
        +
      • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

      • +
      • Fix race condition in node/token rebuild (PYTHON-298)

      • +
      • Set and send serial consistency parameter (PYTHON-299)

      • +
      +
      +
      +
      +

      2.5.0

      +

      March 30, 2015

      +
      +

      Features

      +
        +
      • Integrated cqlengine object mapping package

      • +
      • Utility functions for converting timeuuids and datetime (PYTHON-99)

      • +
      • Schema metadata fetch window randomized, config options added (PYTHON-202)

      • +
      • Support for new Date and Time Cassandra types (PYTHON-190)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

      • +
      • Thread exception during GIL cleanup (PYTHON-229)

      • +
      • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

      • +
      • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

      • +
      • Support reading CompositeType data (PYTHON-234)

      • +
      • Preserve float precision in CQL encoding (PYTHON-243)

      • +
      +
      +
      +
      +

      2.1.4

      +

      January 26, 2015

      +
      +

      Features

      +
        +
      • SaslAuthenticator for Kerberos support (PYTHON-109)

      • +
      • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

      • +
      • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

      • +
      • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

      • +
      • Add eventlet connection support (PYTHON-194)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Schema meta fix for complex thrift tables (PYTHON-191)

      • +
      • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

      • +
      • Resolve stream ID leak on set_keyspace (PYTHON-195)

      • +
      • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

      • +
      • Resolve stream id collision when using SASL auth (PYTHON-210)

      • +
      • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

      • +
      +
      +
      +
      +

      2.1.3

      +

      December 16, 2014

      +
      +

      Features

      +
        +
      • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

      • +
      • Avoid connecting to peer with incomplete metadata (PYTHON-163)

      • +
      • Add SSL support to gevent reactor (PYTHON-174)

      • +
      • Use control connection timeout in wait for schema agreement (PYTHON-175)

      • +
      • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

      • +
      • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Support large negative timestamps on Windows (PYTHON-119)

      • +
      • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

      • +
      • Retain table metadata following keyspace meta refresh (PYTHON-173)

      • +
      • Use a timeout when preparing a statement for all nodes (PYTHON-179)

      • +
      • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

      • +
      • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

      • +
      • Correct routing key encoding for composite keys (PYTHON-184)

      • +
      • Include compression option in schema export string when disabled (PYTHON-187)

      • +
      +
      +
      +
      +

      2.1.2

      +

      October 16, 2014

      +
      +

      Features

      +
        +
      • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

      • +
      • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

      • +
      • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

      • +
      • Handle Unauthorized message on schema_triggers query (PYTHON-155)

      • +
      • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

      • +
      • Support CUSTOM index metadata and string export (PYTHON-165)

      • +
      +
      +
      +
      +

      2.1.1

      +

      September 11, 2014

      +
      +

      Features

      +
        +
      • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

      • +
      • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

      • +
      • Keep timeout for paged results (PYTHON-150)

      • +
      +
      +
      +

      Other

      +
        +
      • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

      • +
      +
      +
      +
      +

      2.1.0

      +

      August 7, 2014

      +
      +

      Bug Fixes

      +
        +
      • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

      • +
      • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

      • +
      +
      +
      +
      +

      2.1.0c1

      +

      July 25, 2014

      +
      +

      Bug Fixes

      +
        +
      • Properly specify UDTs for columns in CREATE TABLE statements

      • +
      • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

      • +
      • Don’t ignore fetch_size arguments to Statement constructors (github-151)

      • +
      • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

      • +
      • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

      • +
      • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

      • +
      • Raise TypeError when a string is used for contact_points (github #164)

      • +
      • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

      • +
      +
      +
      +

      Other

      +
        +
      • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

      • +
      +
      +
      +
      +

      2.1.0b1

      +

      July 11, 2014

      +

      This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

      +
      +

      Features

      +
        +
      • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

      • +
      • Support for user-defined types (Cassandra 2.1+)

      • +
      • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

      • +
      • Protocol-level client-side timestamps (see Session.use_client_timestamp)

      • +
      • Overridable type encoding for non-prepared statements (see Session.encoders)

      • +
      • Configurable serial consistency levels for batch statements

      • +
      • Use io.BytesIO for reduced CPU consumption (github #143)

      • +
      • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

      • +
      • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

      • +
      • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

      • +
      • Don’t share prepared statement lock across Cluster instances

      • +
      • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

      • +
      • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

      • +
      • Properly defunct connections after protocol errors

      • +
      • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

      • +
      • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

      • +
      • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

      • +
      • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

      • +
      • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

      • +
      • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

      • +
      • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

      • +
      +
      +
      +
      +

      2.0.2

      +

      June 10, 2014

      +
      +

      Bug Fixes

      +
        +
      • Add six to requirements.txt

      • +
      • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

      • +
      • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

      • +
      • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

      • +
      • Add python-six to debian dependencies, move python-blist to recommends

      • +
      • Fix memory leak when libev connections are created and +destroyed (github #93)

      • +
      • Ensure token map is rebuilt when hosts are removed from the cluster

      • +
      +
      +
      +
      +

      2.0.1

      +

      May 28, 2014

      +
      +

      Bug Fixes

      +
        +
      • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

      • +
      +
      +
      +
      +

      2.0.0

      +

      May 28, 2014

      +
      +

      Features

      +
        +
      • Make libev C extension Python3-compatible (PYTHON-70)

      • +
      • Support v2 protocol authentication (PYTHON-73, github #125)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix murmur3 C extension compilation under Python3.4 (github #124)

      • +
      +
      +
      +

      Merged From 1.x

      +
      +

      Features

      +
        +
      • Add Session.default_consistency_level (PYTHON-14)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

      • +
      • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

      • +
      • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

      • +
      • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

      • +
      • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

      • +
      • Avoid rebuilding token metadata when cluster topology has not +actually changed

      • +
      • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

      • +
      +
      +
      +

      Other

      +
        +
      • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

      • +
      +
      +
      +
      +
      +

      2.0.0b1

      +

      May 6, 2014

      +
      +

      Upgrading from 1.x

      +

      Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

      +

      If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

      +
      +

      cluster = Cluster(…, protocol_version=1)

      +
      +
      +
      +

      Features

      +
        +
      • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

      • +
      • Support for Python 3.3 and 3.4

      • +
      • Allow a default query timeout to be set per-Session

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

      • +
      +
      +
      +

      Deprecations

      +

      The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

      +
        +
      • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

      • +
      • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

      • +
      • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

      • +
      • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

      • +
      +

      Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

      +
      +
      +
      +

      1.1.2

      +

      May 8, 2014

      +
      +

      Features

      +
        +
      • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

      • +
      • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

      • +
      • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

      • +
      • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

      • +
      • Handle exhausted ReconnectionPolicy schedule correctly

      • +
      +
      +
      +

      Other

      +
        +
      • Don’t log at ERROR when a connection is closed during the startup +communications

      • +
      • Mke scales, blist optional dependencies

      • +
      +
      +
      +
      +

      1.1.1

      +

      April 16, 2014

      +
      +

      Bug Fixes

      +
        +
      • Fix unconditional import of nose in setup.py (github #111)

      • +
      +
      +
      +
      +

      1.1.0

      +

      April 16, 2014

      +
      +

      Features

      +
        +
      • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

      • +
      • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

      • +
      • Add debian packaging (github issue #101)

      • +
      • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

      • +
      • Lowercase boolean literals when generating schemas

      • +
      • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

      • +
      • Don’t reconnect the control connection every time Cluster.connect() is +called

      • +
      • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

      • +
      • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

      • +
      • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

      • +
      • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

      • +
      • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

      • +
      +
      +
      +

      Other

      +
        +
      • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

      • +
      • Better error message when libevwrapper is not found

      • +
      • Only try to import scales when metrics are enabled (github issue #92)

      • +
      • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

      • +
      • Issue warning log when schema versions do not match

      • +
      +
      +
      +
      +

      1.0.2

      +

      March 4, 2014

      +
      +

      Bug Fixes

      +
        +
      • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

      • +
      • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

      • +
      • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

      • +
      • Handle latest table options when parsing the schema and generating +CREATE statements.

      • +
      • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

      • +
      +
      +
      +

      Other

      +
        +
      • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

      • +
      • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

      • +
      • More consistent type checking for query parameters

      • +
      • Add option to a return special object for empty string values for non-string +columns

      • +
      +
      +
      +
      +

      1.0.1

      +

      Feb 19, 2014

      +
      +

      Bug Fixes

      +
        +
      • Include table indexes in KeyspaceMetadata.export_as_string()

      • +
      • Fix broken token awareness on ByteOrderedPartitioner

      • +
      • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

      • +
      • Handle “custom” types (such as the replaced DateType) correctly

      • +
      • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

      • +
      • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

      • +
      • Handle data that is already utf8-encoded for UTF8Type values

      • +
      • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

      • +
      • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

      • +
      +
      +
      +

      Other

      +
        +
      • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

      • +
      • Add details about errors and the last queried host to OperationTimedOut

      • +
      +
      +
      +
      +

      1.0.0 Final

      +

      Jan 29, 2014

      +
      +

      Bug Fixes

      +
        +
      • Prevent leak of Scheduler thread (even with proper shutdown)

      • +
      • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

      • +
      • Hold strong reference to prepared statement while executing it to avoid +garbage collection

      • +
      • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

      • +
      • Fix bad handling of nodes that have been removed from the cluster

      • +
      • Properly escape string types within cql collections

      • +
      • Handle setting the same keyspace twice in a row

      • +
      • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

      • +
      • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

      • +
      • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

      • +
      • Fix endless hanging of some requests when using the libev reactor

      • +
      • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

      • +
      • Generators map to CQL lists, not key sequences

      • +
      • Always defunct connections when an internal operation fails

      • +
      • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

      • +
      • Avoid potential double-erroring of callbacks when a connection +becomes defunct

      • +
      +
      +
      +

      Features

      +
        +
      • Add default query timeout to Session

      • +
      • Add timeout parameter to Session.execute()

      • +
      • Add WhiteListRoundRobinPolicy as a load balancing policy option

      • +
      • Support for consistency level LOCAL_ONE

      • +
      • Make the backoff for fetching traces exponentially increasing and +configurable

      • +
      +
      +
      +

      Other

      +
        +
      • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

      • +
      • Add encoder mapping for OrderedDict

      • +
      • Use timeouts on all control connection queries

      • +
      • Benchmark improvements, including command line options and eay +multithreading support

      • +
      • Reduced lock contention when using the asyncore reactor

      • +
      • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

      • +
      • Add requirements.txt and test-requirements.txt

      • +
      • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

      • +
      +
      +
      +
      +

      1.0.0b7

      +

      Nov 12, 2013

      +

      This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

      +
      +

      Features

      +
        +
      • Add timeout kwarg to ResponseFuture.result()

      • +
      • Create connection pools to all hosts in parallel when initializing +new Sesssions.

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Properly set exception on ResponseFuture when a query fails +against all hosts

      • +
      • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

      • +
      • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

      • +
      • Better error messages for failed Session.prepare() opertaions

      • +
      • Prepare new statements against all hosts in parallel (formerly +sequential)

      • +
      • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

      • +
      • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

      • +
      • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

      • +
      • Throttle trashing of underutilized connections to avoid trashing newly +created connections

      • +
      • Fix race condition which could result in trashed connections being closed +before the last operations had completed

      • +
      • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

      • +
      • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

      • +
      • Correctly handle large messages through libev

      • +
      • Add timeout to schema agreement check queries

      • +
      • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

      • +
      +
      +
      +

      Other

      +
        +
      • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

      • +
      • Better debug logging around connection management

      • +
      • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

      • +
      +
      +
      +
      +

      1.0.0b6

      +

      Oct 22, 2013

      +
      +

      Bug Fixes

      +
        +
      • Use lazy string formatting when logging

      • +
      • Avoid several deadlock scenarios, especially when nodes go down

      • +
      • Avoid trashing newly created connections due to insufficient traffic

      • +
      • Gracefully handle un-handled Exceptions when erroring callbacks

      • +
      +
      +
      +

      Other

      +
        +
      • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

      • +
      +
      +
      +
      +

      1.0.0b5

      +

      Oct 10, 2013

      +
      +

      Features

      +
        +
      • SSL support

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Avoid KeyError when building replica map for NetworkTopologyStrategy

      • +
      • Work around python bug which causes deadlock when a thread imports +the utf8 module

      • +
      • Handle no blist library, which is not compatible with pypy

      • +
      • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

      • +
      +
      +
      +

      Other

      +
        +
      • Switch packaging from Distribute to setuptools, improved C extension +support

      • +
      • Use PEP 386 compliant beta and post-release versions

      • +
      +
      +
      +
      +

      1.0.0-beta4

      +

      Sep 24, 2013

      +
      +

      Features

      +
        +
      • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

      • +
      • Add cql_version kwarg to Cluster.__init__

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

      • +
      • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

      • +
      +
      +
      +
      +

      1.0.0-beta3

      +

      Sep 20, 2013

      +
      +

      Features

      +
        +
      • Support for LZ4 compression (Cassandra 2.0+)

      • +
      • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

      • +
      +
      +
      +

      Bug Fixes

      +
        +
      • Fix libev include path for CentOS

      • +
      • Fix varint packing of the value 0

      • +
      • Correctly pack unicode values

      • +
      • Don’t attempt to return failed connections to the pool when a final result +is set

      • +
      • Fix bad iteration of connection credentials

      • +
      • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

      • +
      • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

      • +
      • Boolean constants shouldn’t be surrounded by single quotes

      • +
      • Avoid a potential loss of precision on float constants due to string +formatting

      • +
      • Actually utilize non-standard ports set on Cluster objects

      • +
      • Fix export of schema as a set of CQL queries

      • +
      +
      +
      +

      Other

      +
        +
      • Use cStringIO for connection buffer for better performance

      • +
      • Add __repr__ method for Statement classes

      • +
      • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

      • +
      • Make all tests compatible with Python 2.6

      • +
      • Add 1s timeout for opening new connections

      • +
      +
      +
      +
      +

      1.0.0-beta2

      +

      Aug 19, 2013

      +
      +

      Bug Fixes

      +
        +
      • Fix pip packaging

      • +
      +
      +
      +
      +

      1.0.0-beta

      +

      Aug 16, 2013

      +

      Initial release

      +
      +
      + + +
      + + + + + +
      + + +
      +
      +

      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

      +
      +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/CNAME b/3.22.3-scylla/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/3.22.3-scylla/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/3.22.3-scylla/_sources/CHANGELOG.rst.txt b/3.22.3-scylla/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/3.22.3-scylla/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/3.22.3-scylla/_sources/api/cassandra.rst.txt b/3.22.3-scylla/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/auth.rst.txt b/3.22.3-scylla/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/cluster.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..2b3d7828a8 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/3.22.3-scylla/_sources/api/cassandra/concurrent.rst.txt b/3.22.3-scylla/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/3.22.3-scylla/_sources/api/cassandra/connection.rst.txt b/3.22.3-scylla/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/3.22.3-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/3.22.3-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/3.22.3-scylla/_sources/api/cassandra/cqlengine/management.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/3.22.3-scylla/_sources/api/cassandra/cqlengine/models.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/3.22.3-scylla/_sources/api/cassandra/cqlengine/query.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/3.22.3-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt b/3.22.3-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..18a0e7c511 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,118 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/decoder.rst.txt b/3.22.3-scylla/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/3.22.3-scylla/_sources/api/cassandra/encoder.rst.txt b/3.22.3-scylla/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/3.22.3-scylla/_sources/api/cassandra/graph.rst.txt b/3.22.3-scylla/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt b/3.22.3-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt b/3.22.3-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt b/3.22.3-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/io/geventreactor.rst.txt b/3.22.3-scylla/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/io/libevreactor.rst.txt b/3.22.3-scylla/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/3.22.3-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt b/3.22.3-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/3.22.3-scylla/_sources/api/cassandra/metadata.rst.txt b/3.22.3-scylla/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..602b767722 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,89 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/3.22.3-scylla/_sources/api/cassandra/metrics.rst.txt b/3.22.3-scylla/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/policies.rst.txt b/3.22.3-scylla/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/pool.rst.txt b/3.22.3-scylla/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/3.22.3-scylla/_sources/api/cassandra/protocol.rst.txt b/3.22.3-scylla/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/3.22.3-scylla/_sources/api/cassandra/query.rst.txt b/3.22.3-scylla/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/3.22.3-scylla/_sources/api/cassandra/timestamps.rst.txt b/3.22.3-scylla/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/3.22.3-scylla/_sources/api/cassandra/util.rst.txt b/3.22.3-scylla/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/3.22.3-scylla/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/3.22.3-scylla/_sources/api/index.rst.txt b/3.22.3-scylla/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/3.22.3-scylla/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/3.22.3-scylla/_sources/cqlengine/batches.rst.txt b/3.22.3-scylla/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/3.22.3-scylla/_sources/cqlengine/connections.rst.txt b/3.22.3-scylla/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/3.22.3-scylla/_sources/cqlengine/faq.rst.txt b/3.22.3-scylla/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/3.22.3-scylla/_sources/cqlengine/models.rst.txt b/3.22.3-scylla/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/3.22.3-scylla/_sources/cqlengine/queryset.rst.txt b/3.22.3-scylla/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/3.22.3-scylla/_sources/cqlengine/third_party.rst.txt b/3.22.3-scylla/_sources/cqlengine/third_party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/third_party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/3.22.3-scylla/_sources/cqlengine/upgrade_guide.rst.txt b/3.22.3-scylla/_sources/cqlengine/upgrade_guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/3.22.3-scylla/_sources/cqlengine/upgrade_guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/3.22.3-scylla/_sources/dates_and_times.rst.txt b/3.22.3-scylla/_sources/dates_and_times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/3.22.3-scylla/_sources/dates_and_times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/3.22.3-scylla/_sources/execution_profiles.rst.txt b/3.22.3-scylla/_sources/execution_profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/3.22.3-scylla/_sources/execution_profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/3.22.3-scylla/_sources/faq.rst.txt b/3.22.3-scylla/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/3.22.3-scylla/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/3.22.3-scylla/_sources/getting_started.rst.txt b/3.22.3-scylla/_sources/getting_started.rst.txt new file mode 100644 index 0000000000..8cb86a5504 --- /dev/null +++ b/3.22.3-scylla/_sources/getting_started.rst.txt @@ -0,0 +1,473 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to Cassandra +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +The simplest way to create a :class:`~.Cluster` is like this: +First, make sure you have the Cassandra driver properly :doc:`installed `. + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +^^^^^^^^^^^^^^^^ +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +^^^^^^^^^^^^^^^^^^^^ +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +^^^^^^^^^^^^^^^^^^^^^ + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/3.22.3-scylla/_sources/index.rst.txt b/3.22.3-scylla/_sources/index.rst.txt new file mode 100644 index 0000000000..371a79c987 --- /dev/null +++ b/3.22.3-scylla/_sources/index.rst.txt @@ -0,0 +1,105 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting_started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla_specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution_profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object_mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query_paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user_defined_types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates_and_times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla_cloud` + Connect to Scylla Cloud + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting_started + scylla_specific + upgrading + execution_profiles + performance + query_paging + lwt + security + user_defined_types + object_mapper + dates_and_times + scylla_cloud + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. + + diff --git a/3.22.3-scylla/_sources/installation.rst.txt b/3.22.3-scylla/_sources/installation.rst.txt new file mode 100644 index 0000000000..c67b9e7909 --- /dev/null +++ b/3.22.3-scylla/_sources/installation.rst.txt @@ -0,0 +1,236 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) DataStax Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +See :doc:`graph_fluent` for more details about this API. + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/3.22.3-scylla/_sources/lwt.rst.txt b/3.22.3-scylla/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/3.22.3-scylla/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/3.22.3-scylla/_sources/object_mapper.rst.txt b/3.22.3-scylla/_sources/object_mapper.rst.txt new file mode 100644 index 0000000000..50d3cbf320 --- /dev/null +++ b/3.22.3-scylla/_sources/object_mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade_guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third_party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade_guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third_party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/3.22.3-scylla/_sources/performance.rst.txt b/3.22.3-scylla/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/3.22.3-scylla/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/3.22.3-scylla/_sources/query_paging.rst.txt b/3.22.3-scylla/_sources/query_paging.rst.txt new file mode 100644 index 0000000000..2c4a4995ca --- /dev/null +++ b/3.22.3-scylla/_sources/query_paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_stage'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/3.22.3-scylla/_sources/scylla_cloud.rst.txt b/3.22.3-scylla/_sources/scylla_cloud.rst.txt new file mode 100644 index 0000000000..62aaf76433 --- /dev/null +++ b/3.22.3-scylla/_sources/scylla_cloud.rst.txt @@ -0,0 +1,5 @@ +Scylla Cloud +------------ + +To connect to a `Scylla Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/3.22.3-scylla/_sources/scylla_specific.rst.txt b/3.22.3-scylla/_sources/scylla_specific.rst.txt new file mode 100644 index 0000000000..966f87336b --- /dev/null +++ b/3.22.3-scylla/_sources/scylla_specific.rst.txt @@ -0,0 +1,84 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/protocol-extensions.md + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Table Attributes +-------------------- + +* ``in_memory`` flag + + New flag available on ``TableMetadata.options`` to indicate that it is an `In Memory `_ table + +.. note:: in memory tables is a feature existing only in Scylla Enterprise + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; + """) + + session.execute(""" + CREATE TABLE IF NOT EXISTS keyspace1.standard1 ( + key blob PRIMARY KEY, + "C0" blob + ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'} + """) + + cluster.refresh_table_metadata("keyspace1", "standard1") + assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True diff --git a/3.22.3-scylla/_sources/security.rst.txt b/3.22.3-scylla/_sources/security.rst.txt new file mode 100644 index 0000000000..0276f6fc51 --- /dev/null +++ b/3.22.3-scylla/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1 + + ssl_context = SSLContext(PROTOCOL_TLSv1) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLSv1) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLSv1) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLSv1`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLSv1, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/3.22.3-scylla/_sources/upgrading.rst.txt b/3.22.3-scylla/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..9559fa3579 --- /dev/null +++ b/3.22.3-scylla/_sources/upgrading.rst.txt @@ -0,0 +1,388 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Upgrading from dse-driver +------------------------- + +Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes. + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/3.22.3-scylla/_sources/user_defined_types.rst.txt b/3.22.3-scylla/_sources/user_defined_types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/3.22.3-scylla/_sources/user_defined_types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
      )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
      )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
      )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/3.22.3-scylla/_static/basic.css b/3.22.3-scylla/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/3.22.3-scylla/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/3.22.3-scylla/_static/check-solid.svg b/3.22.3-scylla/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/3.22.3-scylla/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.22.3-scylla/_static/clipboard.min.js b/3.22.3-scylla/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/3.22.3-scylla/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/3.22.3-scylla/_static/copybutton.css b/3.22.3-scylla/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/3.22.3-scylla/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

      Short

      + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/3.22.3-scylla/_static/copybutton.js b/3.22.3-scylla/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/3.22.3-scylla/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/3.22.3-scylla/_static/copybutton_funcs.js b/3.22.3-scylla/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/3.22.3-scylla/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/3.22.3-scylla/_static/css/main.css b/3.22.3-scylla/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/3.22.3-scylla/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/3.22.3-scylla/_static/doctools.js b/3.22.3-scylla/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/3.22.3-scylla/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/3.22.3-scylla/_static/documentation_options.js b/3.22.3-scylla/_static/documentation_options.js new file mode 100644 index 0000000000..0483cd7e3e --- /dev/null +++ b/3.22.3-scylla/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.22.3', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/3.22.3-scylla/_static/file.png b/3.22.3-scylla/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/3.22.3-scylla/_static/file.png differ diff --git a/3.22.3-scylla/_static/img/banner-background.svg b/3.22.3-scylla/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/3.22.3-scylla/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/favicon-228x228.png b/3.22.3-scylla/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/3.22.3-scylla/_static/img/favicon-228x228.png differ diff --git a/3.22.3-scylla/_static/img/favicon-32x32.png b/3.22.3-scylla/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/3.22.3-scylla/_static/img/favicon-32x32.png differ diff --git a/3.22.3-scylla/_static/img/favicon.ico b/3.22.3-scylla/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/3.22.3-scylla/_static/img/favicon.ico differ diff --git a/3.22.3-scylla/_static/img/icons/icon-about-team.svg b/3.22.3-scylla/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/3.22.3-scylla/_static/img/icons/icon-about-us-m.svg b/3.22.3-scylla/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-about-us.svg b/3.22.3-scylla/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-alternator.svg b/3.22.3-scylla/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-apps.svg b/3.22.3-scylla/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-architecture.svg b/3.22.3-scylla/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/3.22.3-scylla/_static/img/icons/icon-benchmarks.svg b/3.22.3-scylla/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/3.22.3-scylla/_static/img/icons/icon-blog.svg b/3.22.3-scylla/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/3.22.3-scylla/_static/img/icons/icon-careers.svg b/3.22.3-scylla/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/3.22.3-scylla/_static/img/icons/icon-chevron-left.svg b/3.22.3-scylla/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-chevron-right.svg b/3.22.3-scylla/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-circe.svg b/3.22.3-scylla/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-clock.svg b/3.22.3-scylla/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-close.svg b/3.22.3-scylla/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-cloud-docs.svg b/3.22.3-scylla/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-cloud.svg b/3.22.3-scylla/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-comparison.svg b/3.22.3-scylla/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/3.22.3-scylla/_static/img/icons/icon-contact-us.svg b/3.22.3-scylla/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/3.22.3-scylla/_static/img/icons/icon-developers-blog.svg b/3.22.3-scylla/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/3.22.3-scylla/_static/img/icons/icon-docs.svg b/3.22.3-scylla/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/3.22.3-scylla/_static/img/icons/icon-enterprise-m.svg b/3.22.3-scylla/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-enterprise.svg b/3.22.3-scylla/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-events.svg b/3.22.3-scylla/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/3.22.3-scylla/_static/img/icons/icon-exclamation.svg b/3.22.3-scylla/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-expand.svg b/3.22.3-scylla/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-forum.svg b/3.22.3-scylla/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-getting-started.svg b/3.22.3-scylla/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-glossary.svg b/3.22.3-scylla/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-home.svg b/3.22.3-scylla/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-infoworld.svg b/3.22.3-scylla/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/3.22.3-scylla/_static/img/icons/icon-integrations.svg b/3.22.3-scylla/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-knowledge-base.svg b/3.22.3-scylla/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-less.svg b/3.22.3-scylla/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-live-test.svg b/3.22.3-scylla/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/3.22.3-scylla/_static/img/icons/icon-mail-list.svg b/3.22.3-scylla/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-manager.svg b/3.22.3-scylla/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/3.22.3-scylla/_static/img/icons/icon-memory-management.svg b/3.22.3-scylla/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/3.22.3-scylla/_static/img/icons/icon-modeling.svg b/3.22.3-scylla/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-monitoring.svg b/3.22.3-scylla/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/3.22.3-scylla/_static/img/icons/icon-networking.svg b/3.22.3-scylla/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/3.22.3-scylla/_static/img/icons/icon-news.svg b/3.22.3-scylla/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/3.22.3-scylla/_static/img/icons/icon-newsletter.svg b/3.22.3-scylla/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/3.22.3-scylla/_static/img/icons/icon-nsql-guides.svg b/3.22.3-scylla/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/3.22.3-scylla/_static/img/icons/icon-open-source.svg b/3.22.3-scylla/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/3.22.3-scylla/_static/img/icons/icon-operator.svg b/3.22.3-scylla/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-overview.svg b/3.22.3-scylla/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/3.22.3-scylla/_static/img/icons/icon-partners.svg b/3.22.3-scylla/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/3.22.3-scylla/_static/img/icons/icon-plus.svg b/3.22.3-scylla/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-pricing.svg b/3.22.3-scylla/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/3.22.3-scylla/_static/img/icons/icon-release-notes.svg b/3.22.3-scylla/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/3.22.3-scylla/_static/img/icons/icon-resource-center.svg b/3.22.3-scylla/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/3.22.3-scylla/_static/img/icons/icon-roadmap.svg b/3.22.3-scylla/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/3.22.3-scylla/_static/img/icons/icon-search.svg b/3.22.3-scylla/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-slack.svg b/3.22.3-scylla/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-stack-overflow.svg b/3.22.3-scylla/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-summit.svg b/3.22.3-scylla/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/icons/icon-support.svg b/3.22.3-scylla/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/3.22.3-scylla/_static/img/icons/icon-tech-talks.svg b/3.22.3-scylla/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/3.22.3-scylla/_static/img/icons/icon-testing.svg b/3.22.3-scylla/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/3.22.3-scylla/_static/img/icons/icon-thumbs-down.svg b/3.22.3-scylla/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-thumbs-up.svg b/3.22.3-scylla/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.22.3-scylla/_static/img/icons/icon-tip.svg b/3.22.3-scylla/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-training.svg b/3.22.3-scylla/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/3.22.3-scylla/_static/img/icons/icon-triangle-down.svg b/3.22.3-scylla/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-university.svg b/3.22.3-scylla/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/3.22.3-scylla/_static/img/icons/icon-users-blog.svg b/3.22.3-scylla/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/3.22.3-scylla/_static/img/icons/icon-warning.svg b/3.22.3-scylla/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/icons/icon-webinars.svg b/3.22.3-scylla/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/3.22.3-scylla/_static/img/icons/icon-whitepapers.svg b/3.22.3-scylla/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/3.22.3-scylla/_static/img/icons/icon-workshop.svg b/3.22.3-scylla/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/3.22.3-scylla/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/3.22.3-scylla/_static/img/logo-docs.svg b/3.22.3-scylla/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/3.22.3-scylla/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/logo-scylla-horizontal-RGB.svg b/3.22.3-scylla/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/3.22.3-scylla/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.22.3-scylla/_static/img/mascots/404.jpg b/3.22.3-scylla/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/404.jpg differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-3monsters.png b/3.22.3-scylla/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-3monsters.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-advisor-crystal.png b/3.22.3-scylla/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-alternator.svg b/3.22.3-scylla/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/3.22.3-scylla/_static/img/mascots/scylla-cloud.svg b/3.22.3-scylla/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/3.22.3-scylla/_static/img/mascots/scylla-computer-3-monsters.png b/3.22.3-scylla/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-computer-headset.png b/3.22.3-scylla/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-computer-headset.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-cup-number-one.png b/3.22.3-scylla/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-docs.svg b/3.22.3-scylla/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/3.22.3-scylla/_static/img/mascots/scylla-drivers.svg b/3.22.3-scylla/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/3.22.3-scylla/_static/img/mascots/scylla-enterprise.svg b/3.22.3-scylla/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/3.22.3-scylla/_static/img/mascots/scylla-forklift-boxes.png b/3.22.3-scylla/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-forklift-migration.png b/3.22.3-scylla/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-gear.png b/3.22.3-scylla/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-gear.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-hardhat.png b/3.22.3-scylla/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-hardhat.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-headband.png b/3.22.3-scylla/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-headband.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-headset.png b/3.22.3-scylla/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-headset.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-hearts.png b/3.22.3-scylla/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-hearts.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-looking-down.png b/3.22.3-scylla/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-looking-down.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-looking-up.png b/3.22.3-scylla/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-looking-up.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png b/3.22.3-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-magnifying-glass.png b/3.22.3-scylla/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-manager.svg b/3.22.3-scylla/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/3.22.3-scylla/_static/img/mascots/scylla-monitor.svg b/3.22.3-scylla/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/3.22.3-scylla/_static/img/mascots/scylla-movement-fast.png b/3.22.3-scylla/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-movement-fast.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-movement.png b/3.22.3-scylla/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-movement.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-onpremise.png b/3.22.3-scylla/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-onpremise.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-opensource.svg b/3.22.3-scylla/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/3.22.3-scylla/_static/img/mascots/scylla-operator.svg b/3.22.3-scylla/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/3.22.3-scylla/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/3.22.3-scylla/_static/img/mascots/scylla-plugin.png b/3.22.3-scylla/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-plugin.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-release-mascot.png b/3.22.3-scylla/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-release-mascot.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-repair.png b/3.22.3-scylla/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-repair.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-server.png b/3.22.3-scylla/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-server.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-sleeping.png b/3.22.3-scylla/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-sleeping.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-tall-measure.png b/3.22.3-scylla/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-tall-measure.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-university.png b/3.22.3-scylla/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-university.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-weights.png b/3.22.3-scylla/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-weights.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-window-cleaning.png b/3.22.3-scylla/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-with-computer-2.png b/3.22.3-scylla/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-with-computer.png b/3.22.3-scylla/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-with-computer.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-with-linux.png b/3.22.3-scylla/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-with-linux.png differ diff --git a/3.22.3-scylla/_static/img/mascots/scylla-writting.png b/3.22.3-scylla/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/3.22.3-scylla/_static/img/mascots/scylla-writting.png differ diff --git a/3.22.3-scylla/_static/img/menu.svg b/3.22.3-scylla/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/3.22.3-scylla/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.22.3-scylla/_static/js/main.bundle.js b/3.22.3-scylla/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/3.22.3-scylla/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
    • Back
    • ',backButtonPosition:"top",wrapper:"
      ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
        "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
        ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
        ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
        ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
        ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra - Exceptions and Enums

        +
        +
        +cassandra.__version_info__
        +

        The version of the driver in a tuple format

        +
        + +
        +
        +cassandra.__version__
        +

        The version of the driver in a string format

        +
        + +
        +
        +class cassandra.ConsistencyLevel
        +

        Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

        +
        +
        +ANY = 0
        +

        Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

        +
        + +
        +
        +ONE = 1
        +

        Only one replica needs to respond to consider the operation a success

        +
        + +
        +
        +TWO = 2
        +

        Two replicas must respond to consider the operation a success

        +
        + +
        +
        +THREE = 3
        +

        Three replicas must respond to consider the operation a success

        +
        + +
        +
        +QUORUM = 4
        +

        ceil(RF/2) + 1 replicas must respond to consider the operation a success

        +
        + +
        +
        +ALL = 5
        +

        All replicas must respond to consider the operation a success

        +
        + +
        +
        +LOCAL_QUORUM = 6
        +

        Requires a quorum of replicas in the local datacenter

        +
        + +
        +
        +EACH_QUORUM = 7
        +

        Requires a quorum of replicas in each datacenter

        +
        + +
        +
        +SERIAL = 8
        +

        For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

        +
        + +
        +
        +LOCAL_SERIAL = 9
        +

        Like SERIAL, but only requires consensus +among replicas in the local datacenter.

        +
        + +
        +
        +LOCAL_ONE = 10
        +

        Sends a request only to replicas in the local datacenter and waits for +one response.

        +
        + +
        + +
        +
        +class cassandra.ProtocolVersion
        +

        Defines native protocol versions supported by this driver.

        +
        +
        +V1 = 1
        +

        v1, supported in Cassandra 1.2–>2.2

        +
        + +
        +
        +V2 = 2
        +

        v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

        +
        + +
        +
        +V3 = 3
        +

        v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

        +
        + +
        +
        +V4 = 4
        +

        v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

        +
        + +
        +
        +V5 = 5
        +

        v5, in beta from 3.x+. Finalised in 4.0-beta5

        +
        + +
        +
        +V6 = 6
        +

        v6, in beta from 4.0-beta5

        +
        + +
        +
        +DSE_V1 = 65
        +

        DSE private protocol v1, supported in DSE 5.1+

        +
        + +
        +
        +DSE_V2 = 66
        +

        DSE private protocol v2, supported in DSE 6.0+

        +
        + +
        +
        +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
        +

        A tuple of all supported protocol versions

        +
        + +
        +
        +BETA_VERSIONS = (6,)
        +

        A tuple of all beta protocol versions

        +
        + +
        +
        +MIN_SUPPORTED = 1
        +

        Minimum protocol version supported by this driver.

        +
        + +
        +
        +MAX_SUPPORTED = 66
        +

        Maximum protocol version supported by this driver.

        +
        + +
        +
        +classmethod get_lower_supported(previous_version)
        +

        Return the lower supported protocol version. Beta versions are omitted.

        +
        + +
        + +
        +
        +class cassandra.UserFunctionDescriptor(name, argument_types)
        +

        Describes a User function by name and argument signature

        +
        +
        +name = None
        +

        name of the function

        +
        + +
        +
        +argument_types = None
        +

        Ordered list of CQL argument type names comprising the type signature

        +
        + +
        +
        +property signature
        +

        function signature string in the form ‘name([type0[,type1[…]]])’

        +

        can be used to uniquely identify overloaded function names within a keyspace

        +
        + +
        + +
        +
        +class cassandra.UserAggregateDescriptor(name, argument_types)
        +

        Describes a User aggregate function by name and argument signature

        +
        +
        +name = None
        +

        name of the aggregate

        +
        + +
        +
        +argument_types = None
        +

        Ordered list of CQL argument type names comprising the type signature

        +
        + +
        +
        +property signature
        +

        function signature string in the form ‘name([type0[,type1[…]]])’

        +

        can be used to uniquely identify overloaded function names within a keyspace

        +
        + +
        + +
        +
        +exception cassandra.DriverException
        +

        Base for all exceptions explicitly raised by the driver.

        +
        + +
        +
        +exception cassandra.RequestExecutionException
        +

        Base for request execution exceptions returned from the server.

        +
        + +
        +
        +exception cassandra.Unavailable
        +

        There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

        +
        +
        +consistency = None
        +

        The requested ConsistencyLevel

        +
        + +
        +
        +required_replicas = None
        +

        The number of replicas that needed to be live to complete the operation

        +
        + +
        +
        +alive_replicas = None
        +

        The number of replicas that were actually alive

        +
        + +
        + +
        +
        +exception cassandra.Timeout
        +

        Replicas failed to respond to the coordinator node before timing out.

        +
        +
        +consistency = None
        +

        The requested ConsistencyLevel

        +
        + +
        +
        +required_responses = None
        +

        The number of required replica responses

        +
        + +
        +
        +received_responses = None
        +

        The number of replicas that responded before the coordinator timed out +the operation

        +
        + +
        + +
        +
        +exception cassandra.ReadTimeout
        +

        A subclass of Timeout for read operations.

        +

        This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

        +
        +
        +data_retrieved = None
        +

        A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

        +
        + +
        + +
        +
        +exception cassandra.WriteTimeout
        +

        A subclass of Timeout for write operations.

        +

        This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

        +
        +
        +write_type = None
        +

        The type of write operation, enum on WriteType

        +
        + +
        + +
        +
        +exception cassandra.CoordinationFailure
        +

        Replicas sent a failure to the coordinator.

        +
        +
        +consistency = None
        +

        The requested ConsistencyLevel

        +
        + +
        +
        +required_responses = None
        +

        The number of required replica responses

        +
        + +
        +
        +received_responses = None
        +

        The number of replicas that responded before the coordinator timed out +the operation

        +
        + +
        +
        +failures = None
        +

        The number of replicas that sent a failure message

        +
        + +
        +
        +error_code_map = None
        +

        A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

        +
        + +
        + +
        +
        +exception cassandra.ReadFailure
        +

        A subclass of CoordinationFailure for read operations.

        +

        This indicates that the replicas sent a failure message to the coordinator.

        +
        +
        +data_retrieved = None
        +

        A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

        +
        + +
        + +
        +
        +exception cassandra.WriteFailure
        +

        A subclass of CoordinationFailure for write operations.

        +

        This indicates that the replicas sent a failure message to the coordinator.

        +
        +
        +write_type = None
        +

        The type of write operation, enum on WriteType

        +
        + +
        + +
        +
        +exception cassandra.FunctionFailure
        +

        User Defined Function failed during execution

        +
        +
        +keyspace = None
        +

        Keyspace of the function

        +
        + +
        +
        +function = None
        +

        Name of the function

        +
        + +
        +
        +arg_types = None
        +

        List of argument type names of the function

        +
        + +
        + +
        +
        +exception cassandra.RequestValidationException
        +

        Server request validation failed

        +
        + +
        +
        +exception cassandra.ConfigurationException
        +

        Server indicated request errro due to current configuration

        +
        + +
        +
        +exception cassandra.AlreadyExists
        +

        An attempt was made to create a keyspace or table that already exists.

        +
        +
        +keyspace = None
        +

        The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

        +
        + +
        +
        +table = None
        +

        The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

        +
        + +
        + +
        +
        +exception cassandra.InvalidRequest
        +

        A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

        +
        + +
        +
        +exception cassandra.Unauthorized
        +

        The current user is not authorized to perform the requested operation.

        +
        + +
        +
        +exception cassandra.AuthenticationFailed
        +

        Failed to authenticate.

        +
        + +
        +
        +exception cassandra.OperationTimedOut
        +

        The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

        +
        +
        +errors = None
        +

        A dict of errors keyed by the Host against which they occurred.

        +
        + +
        +
        +last_host = None
        +

        The last Host this operation was attempted against.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/auth.html b/3.22.3-scylla/api/cassandra/auth.html new file mode 100644 index 0000000000..7a376dc4ef --- /dev/null +++ b/3.22.3-scylla/api/cassandra/auth.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.auth - Authentication

        +
        +
        +class cassandra.auth.AuthProvider
        +

        An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

        +
        +

        New in version 2.0.0.

        +
        +
        +
        +new_authenticator(host)
        +

        Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

        +
        + +
        + +
        +
        +class cassandra.auth.Authenticator
        +

        An abstract class that handles SASL authentication with Cassandra servers.

        +

        Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

        +

        1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

        +

        2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

        +

        3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

        +

        The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

        +
        +

        New in version 2.0.0.

        +
        +
        +
        +server_authenticator_class = None
        +

        Set during the connection AUTHENTICATE phase

        +
        + +
        +
        +initial_response()
        +

        Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

        +
        + +
        +
        +evaluate_challenge(challenge)
        +

        Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

        +
        + +
        +
        +on_authentication_success(token)
        +

        Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

        +
        + +
        + +
        +
        +class cassandra.auth.PlainTextAuthProvider(username, password)
        +

        An AuthProvider that works with Cassandra’s PasswordAuthenticator.

        +

        Example usage:

        +
        from cassandra.cluster import Cluster
        +from cassandra.auth import PlainTextAuthProvider
        +
        +auth_provider = PlainTextAuthProvider(
        +        username='cassandra', password='cassandra')
        +cluster = Cluster(auth_provider=auth_provider)
        +
        +
        +
        +

        New in version 2.0.0.

        +
        +
        +
        +new_authenticator(host)
        +

        Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

        +
        + +
        + +
        +
        +class cassandra.auth.PlainTextAuthenticator(username, password)
        +
        +
        +evaluate_challenge(challenge)
        +

        Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

        +
        + +
        + +
        +
        +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
        +

        An AuthProvider supporting general SASL auth mechanisms

        +

        Suitable for GSSAPI or other SASL mechanisms

        +

        Example usage:

        +
        from cassandra.cluster import Cluster
        +from cassandra.auth import SaslAuthProvider
        +
        +sasl_kwargs = {'service': 'something',
        +               'mechanism': 'GSSAPI',
        +               'qops': 'auth'.split(',')}
        +auth_provider = SaslAuthProvider(**sasl_kwargs)
        +cluster = Cluster(auth_provider=auth_provider)
        +
        +
        +
        +

        New in version 2.1.4.

        +
        +
        +
        +new_authenticator(host)
        +

        Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

        +
        + +
        + +
        +
        +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
        +

        A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

        +
        +

        New in version 2.1.4.

        +
        +
        +
        +initial_response()
        +

        Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

        +
        + +
        +
        +evaluate_challenge(challenge)
        +

        Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cluster.html b/3.22.3-scylla/api/cassandra/cluster.html new file mode 100644 index 0000000000..5a2b0336e9 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cluster.html @@ -0,0 +1,1904 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cluster - Clusters and Sessions

        +
        +
        +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
        +

        The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

        +

        Example usage:

        +
        >>> from cassandra.cluster import Cluster
        +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
        +>>> session = cluster.connect()
        +>>> session.execute("CREATE KEYSPACE ...")
        +>>> ...
        +>>> cluster.shutdown()
        +
        +
        +

        Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

        +

        executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

        +

        Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

        +
        +
        +contact_points = ['127.0.0.1']
        +
        + +
        +
        +port = 9042
        +
        + +
        +
        +cql_version = None
        +
        + +
        +
        +protocol_version = 66
        +
        + +
        +
        +compression = True
        +
        + +
        +
        +auth_provider
        +

        When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

        +

        When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

        +

        When not using authentication, this should be left as None.

        +
        + +
        +
        +load_balancing_policy
        +

        An instance of policies.LoadBalancingPolicy or +one of its subclasses.

        +
        +

        Changed in version 2.6.0.

        +
        +

        Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

        +

        Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

        +
        + +
        +
        +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
        +
        + +
        +
        +default_retry_policy = <cassandra.policies.RetryPolicy object>
        +

        A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

        +
        + +
        +
        +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
        +
        + +
        +
        +address_translator = <cassandra.policies.IdentityTranslator object>
        +
        + +
        +
        +metrics_enabled = False
        +
        + +
        +
        +metrics = None
        +
        + +
        +
        +ssl_context = None
        +
        + +
        +
        +ssl_options = None
        +
        + +
        +
        +sockopts = None
        +
        + +
        +
        +max_schema_agreement_wait = 10
        +
        + +
        +
        +metadata = None
        +
        + +
        +
        +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
        +
        + +
        +
        +control_connection_timeout = 2.0
        +
        + +
        +
        +idle_heartbeat_interval = 30
        +
        + +
        +
        +idle_heartbeat_timeout = 30
        +
        + +
        +
        +schema_event_refresh_window = 2
        +
        + +
        +
        +topology_event_refresh_window = 10
        +
        + +
        +
        +status_event_refresh_window = 2
        +
        + +
        +
        +prepare_on_all_hosts = True
        +
        + +
        +
        +reprepare_on_up = True
        +
        + +
        +
        +connect_timeout = 5
        +
        + +
        +
        +schema_metadata_enabled = True
        +

        Flag indicating whether internal schema metadata is updated.

        +

        When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

        +
        + +
        +
        +token_metadata_enabled = True
        +

        Flag indicating whether internal token metadata is updated.

        +

        When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

        +
        + +
        +
        +timestamp_generator = None
        +
        + +
        +
        +endpoint_factory = None
        +
        + +
        +
        +cloud = None
        +
        + +
        +
        +connect(keyspace=None, wait_for_all_pools=False)
        +

        Creates and returns a new Session object.

        +

        If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

        +

        wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

        +
        + +
        +
        +shutdown()
        +

        Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

        +

        Once shutdown, a Cluster should not be used for any purpose.

        +
        + +
        +
        +register_user_type(keyspace, user_type, klass)
        +

        Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

        +

        keyspace is the name of the keyspace that the UDT is defined in.

        +

        user_type is the string name of the UDT to register the mapping +for.

        +

        klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

        +

        This method should only be called after the type has been created +within Cassandra.

        +

        Example:

        +
        cluster = Cluster(protocol_version=3)
        +session = cluster.connect()
        +session.set_keyspace('mykeyspace')
        +session.execute("CREATE TYPE address (street text, zipcode int)")
        +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
        +
        +# create a class to map to the "address" UDT
        +class Address(object):
        +
        +    def __init__(self, street, zipcode):
        +        self.street = street
        +        self.zipcode = zipcode
        +
        +cluster.register_user_type('mykeyspace', 'address', Address)
        +
        +# insert a row using an instance of Address
        +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
        +                (0, Address("123 Main St.", 78723)))
        +
        +# results will include Address instances
        +results = session.execute("SELECT * FROM users")
        +row = results[0]
        +print row.id, row.location.street, row.location.zipcode
        +
        +
        +
        + +
        +
        +register_listener(listener)
        +

        Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

        +
        + +
        +
        +unregister_listener(listener)
        +

        Removes a registered listener.

        +
        + +
        +
        +add_execution_profile(name, profile, pool_wait_timeout=5)
        +

        Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

        +

        Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

        +

        Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

        +
        + +
        +
        +set_max_requests_per_connection(host_distance, max_requests)
        +

        Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

        +

        Pertains to connection pool management in protocol versions {1,2}.

        +
        + +
        +
        +get_max_requests_per_connection(host_distance)
        +
        + +
        +
        +set_min_requests_per_connection(host_distance, min_requests)
        +

        Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

        +

        Pertains to connection pool management in protocol versions {1,2}.

        +
        + +
        +
        +get_min_requests_per_connection(host_distance)
        +
        + +
        +
        +get_core_connections_per_host(host_distance)
        +

        Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

        +

        This property is ignored if protocol_version is +3 or higher.

        +
        + +
        +
        +set_core_connections_per_host(host_distance, core_connections)
        +

        Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

        +

        Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

        +

        If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

        +
        + +
        +
        +get_max_connections_per_host(host_distance)
        +

        Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

        +

        This property is ignored if protocol_version is +3 or higher.

        +
        + +
        +
        +set_max_connections_per_host(host_distance, max_connections)
        +

        Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

        +

        If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

        +
        + +
        +
        +get_control_connection_host()
        +

        Returns the control connection host metadata.

        +
        + +
        +
        +refresh_schema_metadata(max_schema_agreement_wait=None)
        +

        Synchronously refresh all schema metadata.

        +

        By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

        +

        Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

        +

        Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

        +

        An Exception is raised if schema refresh fails for any reason.

        +
        + +
        +
        +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
        +

        Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

        +

        See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

        +
        + +
        +
        +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
        +

        Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

        +

        See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

        +
        + +
        +
        +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
        +

        Synchronously refresh user defined type metadata.

        +

        See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

        +
        + +
        +
        +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
        +

        Synchronously refresh user defined function metadata.

        +

        function is a cassandra.UserFunctionDescriptor.

        +

        See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

        +
        + +
        +
        +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
        +

        Synchronously refresh user defined aggregate metadata.

        +

        aggregate is a cassandra.UserAggregateDescriptor.

        +

        See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

        +
        + +
        +
        +refresh_nodes(force_token_rebuild=False)
        +

        Synchronously refresh the node list and token metadata

        +

        force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

        +

        An Exception is raised if node refresh fails for any reason.

        +
        + +
        +
        +set_meta_refresh_enabled(enabled)
        +

        Deprecated: set schema_metadata_enabled token_metadata_enabled instead

        +

        Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

        +

        Disabling this is useful to minimize refreshes during multiple changes.

        +

        Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

        +
        + +
        + +
        +
        +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
        +
        +
        +consistency_level = LOCAL_ONE
        +
        + +
        +
        +static row_factory(colnames, rows)
        +

        Returns each row as a namedtuple. +This is the default row factory.

        +

        Example:

        +
        >>> from cassandra.query import named_tuple_factory
        +>>> session = cluster.connect('mykeyspace')
        +>>> session.row_factory = named_tuple_factory
        +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
        +>>> user = rows[0]
        +
        +>>> # you can access field by their name:
        +>>> print "name: %s, age: %d" % (user.name, user.age)
        +name: Bob, age: 42
        +
        +>>> # or you can access fields by their position (like a tuple)
        +>>> name, age = user
        +>>> print "name: %s, age: %d" % (name, age)
        +name: Bob, age: 42
        +>>> name = user[0]
        +>>> age = user[1]
        +>>> print "name: %s, age: %d" % (name, age)
        +name: Bob, age: 42
        +
        +
        +
        +

        Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

        +
        +
        + +
        + +
        +
        +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
        +

        Default execution profile for graph execution.

        +

        See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

        +

        In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

        +
        + +
        +
        +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
        +

        Execution profile with timeout and load balancing appropriate for graph analytics queries.

        +

        See also GraphExecutionPolicy.

        +

        In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

        +

        Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

        +
        + +
        +
        +cassandra.cluster.EXEC_PROFILE_DEFAULT
        +

        The base class of the class hierarchy.

        +

        When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

        +
        + +
        +
        +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
        +

        The base class of the class hierarchy.

        +

        When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

        +
        + +
        +
        +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
        +

        The base class of the class hierarchy.

        +

        When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

        +
        + +
        +
        +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
        +

        The base class of the class hierarchy.

        +

        When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

        +
        + +
        +
        +class cassandra.cluster.Session
        +

        A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

        +

        Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

        +

        Example usage:

        +
        >>> session = cluster.connect()
        +>>> session.set_keyspace("mykeyspace")
        +>>> session.execute("SELECT * FROM mycf")
        +
        +
        +
        +
        +default_timeout = 10.0
        +

        A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

        +

        Setting this to None will cause no timeouts to be set by default.

        +

        Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

        +
        +

        New in version 2.0.0.

        +
        +
        + +
        +
        +default_consistency_level = LOCAL_ONE
        +

        Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

        +
        +

        New in version 1.2.0.

        +
        +
        +

        Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

        +
        +
        + +
        +
        +default_serial_consistency_level = None
        +

        The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

        +

        Only valid for protocol_version >= 2.

        +
        + +
        +
        +row_factory = <function named_tuple_factory>
        +

        The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

        + +
        + +
        +
        +default_fetch_size = 5000
        +
        + +
        +
        +use_client_timestamp = True
        +
        + +
        +
        +timestamp_generator = None
        +
        + +
        +
        +encoder = None
        +
        + +
        +
        +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
        +
        + +
        +
        +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
        +

        Execute the given query and synchronously wait for the response.

        +

        If an error is encountered while executing the query, an Exception +will be raised.

        +

        query may be a query string or an instance of cassandra.query.Statement.

        +

        parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

        +

        timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

        +

        If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

        +

        custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

        +

        execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

        +

        paging_state is an optional paging state, reused from a previous ResultSet.

        +

        host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

        +

        execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

        +
        + +
        +
        +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
        +

        Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

        +

        See Session.execute() for parameter definitions.

        +

        Example usage:

        +
        >>> session = cluster.connect()
        +>>> future = session.execute_async("SELECT * FROM mycf")
        +
        +>>> def log_results(results):
        +...     for row in results:
        +...         log.info("Results: %s", row)
        +
        +>>> def log_error(exc):
        +>>>     log.error("Operation failed: %s", exc)
        +
        +>>> future.add_callbacks(log_results, log_error)
        +
        +
        +

        Async execution with blocking wait for results:

        +
        >>> future = session.execute_async("SELECT * FROM mycf")
        +>>> # do other stuff...
        +
        +>>> try:
        +...     results = future.result()
        +... except Exception:
        +...     log.exception("Operation failed:")
        +
        +
        +
        + +
        +
        +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
        +

        Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

        +

        parameters is dict of named parameters to bind. The values must be +JSON-serializable.

        +

        execution_profile: Selects an execution profile for the request.

        +

        execute_as the user that will be used on the server to execute the request.

        +
        + +
        +
        +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
        +

        Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

        +
        + +
        +
        +prepare(statement)
        +

        Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

        +
        >>> session = cluster.connect("mykeyspace")
        +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
        +>>> prepared = session.prepare(query)
        +>>> session.execute(prepared, (user.id, user.name, user.age))
        +
        +
        +

        Or you may bind values to the prepared statement ahead of time:

        +
        >>> prepared = session.prepare(query)
        +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
        +>>> session.execute(bound_stmt)
        +
        +
        +

        Of course, prepared statements may (and should) be reused:

        +
        >>> prepared = session.prepare(query)
        +>>> for user in users:
        +...     bound = prepared.bind((user.id, user.name, user.age))
        +...     session.execute(bound)
        +
        +
        +

        Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

        +
        >>> analyticskeyspace_prepared = session.prepare(
        +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
        +...     keyspace="analyticskeyspace")  # note the different keyspace
        +
        +
        +

        Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

        +

        custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

        +
        + +
        +
        +shutdown()
        +

        Close all connections. Session instances should not be used +for any purpose after being shutdown.

        +
        + +
        +
        +set_keyspace(keyspace)
        +

        Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

        +
        + +
        +
        +get_execution_profile(name)
        +

        Returns the execution profile associated with the provided name.

        +
        +
        Parameters:
        +

        name – The name (or key) of the execution profile.

        +
        +
        +
        + +
        +
        +execution_profile_clone_update(ep, **kwargs)
        +

        Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

        +

        This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

        +
        + +
        +
        +add_request_init_listener(fn, *args, **kwargs)
        +

        Adds a callback with arguments to be called when any request is created.

        +

        It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

        +

        response_future is the ResponseFuture for the request.

        +

        Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

        +

        See this example in the +source tree for an example.

        +
        + +
        +
        +remove_request_init_listener(fn, *args, **kwargs)
        +

        Removes a callback and arguments from the list.

        +

        See Session.add_request_init_listener().

        +
        + +
        + +
        +
        +class cassandra.cluster.ResponseFuture
        +

        An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

        +
        +
        There are two ways for results to be delivered:
        +
        +
        +
        +
        +query = None
        +
        + +
        +
        +result()
        +

        Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

        +

        Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

        +

        Example usage:

        +
        >>> future = session.execute_async("SELECT * FROM mycf")
        +>>> # do other stuff...
        +
        +>>> try:
        +...     rows = future.result()
        +...     for row in rows:
        +...         ... # process results
        +... except Exception:
        +...     log.exception("Operation failed:")
        +
        +
        +
        + +
        +
        +get_query_trace()
        +

        Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

        +

        Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

        +

        If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

        +

        query_cl is the consistency level used to poll the trace tables.

        +
        + +
        +
        +get_all_query_traces()
        +

        Fetches and returns the query traces for all query pages, if tracing was enabled.

        +

        See note in get_query_trace() regarding possible exceptions.

        +
        + +
        +
        +custom_payload
        +

        The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

        +

        Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

        +
        +
        Returns:
        +

        Custom Payloads.

        +
        +
        +
        + +
        +
        +is_schema_agreed = True
        +
        + +
        +
        +has_more_pages
        +

        Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

        +
        +

        New in version 2.0.0.

        +
        +
        + +
        +
        +warnings
        +

        Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

        +

        Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

        +

        Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

        +
        + +
        +
        +start_fetching_next_page()
        +

        If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

        +

        This should only be called after the first page has been returned.

        +
        +

        New in version 2.0.0.

        +
        +
        + +
        +
        +add_callback(fn, *args, **kwargs)
        +

        Attaches a callback function to be called when the final results arrive.

        +

        By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

        +

        If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

        +

        If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

        +

        Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

        +

        Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

        +

        Usage example:

        +
        >>> session = cluster.connect("mykeyspace")
        +
        +>>> def handle_results(rows, start_time, should_log=False):
        +...     if should_log:
        +...         log.info("Total time: %f", time.time() - start_time)
        +...     ...
        +
        +>>> future = session.execute_async("SELECT * FROM users")
        +>>> future.add_callback(handle_results, time.time(), should_log=True)
        +
        +
        +
        + +
        +
        +add_errback(fn, *args, **kwargs)
        +

        Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

        +
        + +
        +
        +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None)
        +

        A convenient combination of add_callback() and +add_errback().

        +

        Example usage:

        +
        >>> session = cluster.connect()
        +>>> query = "SELECT * FROM mycf"
        +>>> future = session.execute_async(query)
        +
        +>>> def log_results(results, level='debug'):
        +...     for row in results:
        +...         log.log(level, "Result: %s", row)
        +
        +>>> def log_error(exc, query):
        +...     log.error("Query '%s' failed: %s", query, exc)
        +
        +>>> future.add_callbacks(
        +...     callback=log_results, callback_kwargs={'level': 'info'},
        +...     errback=log_error, errback_args=(query,))
        +
        +
        +
        + +
        + +
        +
        +class cassandra.cluster.ResultSet
        +

        An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

        +

        You can treat this as a normal iterator over rows:

        +
        >>> from cassandra.query import SimpleStatement
        +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
        +>>> for user_row in session.execute(statement):
        +...     process_user(user_row)
        +
        +
        +

        Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

        +
        +
        +all()
        +

        Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

        +

        This function is not recommended for queries that return a large number of elements.

        +
        + +
        +
        +property current_rows
        +

        The list of current page rows. May be empty if the result was empty, +or this is the last page.

        +
        + +
        +
        +fetch_next_page()
        +

        Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

        +
        + +
        +
        +get_all_query_traces(max_wait_sec_per=None)
        +

        Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

        +
        + +
        +
        +get_query_trace(max_wait_sec=None)
        +

        Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

        +
        + +
        +
        +property has_more_pages
        +

        True if the last response indicated more pages; False otherwise

        +
        + +
        +
        +one()
        +

        Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

        +
        + +
        +
        +property paging_state
        +

        Server paging state of the query. Can be None if the query was not paged.

        +

        The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

        +
        + +
        +
        +property was_applied
        +

        For LWT results, returns whether the transaction was applied.

        +

        Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

        +

        Only valid when one of the of the internal row factories is in use.

        +
        + +
        + +
        +
        +exception cassandra.cluster.QueryExhausted
        +

        Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

        +
        +

        New in version 2.0.0.

        +
        +
        + +
        +
        +exception cassandra.cluster.NoHostAvailable
        +

        Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

        +
        + +
        +
        +exception cassandra.cluster.UserTypeDoesNotExist
        +

        An attempt was made to use a user-defined type that does not exist.

        +
        +

        New in version 2.1.0.

        +
        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/concurrent.html b/3.22.3-scylla/api/cassandra/concurrent.html new file mode 100644 index 0000000000..8858568edb --- /dev/null +++ b/3.22.3-scylla/api/cassandra/concurrent.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.concurrent - Utilities for Concurrent Statement Execution

        +
        +
        +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
        +

        Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

        +

        The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

        +

        If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

        +

        results_generator controls how the results are returned.

        +
          +
        • If False, the results are returned only after all requests have completed.

        • +
        • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

        • +
        +

        execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

        +

        A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

        +

        Example usage:

        +
        select_statement = session.prepare("SELECT * FROM users WHERE id=?")
        +
        +statements_and_params = []
        +for user_id in user_ids:
        +    params = (user_id, )
        +    statements_and_params.append((select_statement, params))
        +
        +results = execute_concurrent(
        +    session, statements_and_params, raise_on_first_error=False)
        +
        +for (success, result) in results:
        +    if not success:
        +        handle_error(result)  # result will be an Exception
        +    else:
        +        process_user(result[0])  # result will be a list of rows
        +
        +
        +

        Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

        +
        + +
        +
        +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
        +

        Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

        +

        Example usage:

        +
        statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
        +parameters = [(x,) for x in range(1000)]
        +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
        +
        +
        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/connection.html b/3.22.3-scylla/api/cassandra/connection.html new file mode 100644 index 0000000000..27eb67bb6f --- /dev/null +++ b/3.22.3-scylla/api/cassandra/connection.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.connection - Low Level Connection Info

        +
        +
        +exception cassandra.connection.ConnectionException
        +

        An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

        +
        + +
        +
        +exception cassandra.connection.ConnectionShutdown
        +

        Raised when a connection has been marked as defunct or has been closed.

        +
        + +
        +
        +exception cassandra.connection.ConnectionBusy
        +

        An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

        +
        + +
        +
        +exception cassandra.connection.ProtocolError
        +

        Communication did not match the protocol that this driver expects.

        +
        + +
        +
        +class cassandra.connection.EndPoint
        +

        Represents the information to connect to a cassandra node.

        +
        +
        +property address
        +

        The IP address of the node. This is the RPC address the driver uses when connecting to the node

        +
        + +
        +
        +property port
        +

        The port of the node.

        +
        + +
        +
        +resolve()
        +

        Resolve the endpoint to an address/port. This is called +only on socket connection.

        +
        + +
        +
        +property socket_family
        +

        The socket family of the endpoint.

        +
        + +
        +
        +property ssl_options
        +

        SSL options specific to this endpoint.

        +
        + +
        + +
        +
        +class cassandra.connection.EndPointFactory
        +
        +
        +configure(cluster)
        +

        This is called by the cluster during its initialization.

        +
        + +
        +
        +create(row)
        +

        Create an EndPoint from a system.peers row.

        +
        + +
        + +
        +
        +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
        +

        SNI Proxy EndPoint implementation.

        +
        + +
        +
        +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
        +
        + +
        +
        +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
        +

        Unix Socket EndPoint implementation.

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cqlengine/columns.html b/3.22.3-scylla/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..5228e5eaa3 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cqlengine/columns.html @@ -0,0 +1,984 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cqlengine.columns - Column types for object mapping models

        +
        +

        Columns

        +

        Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

        +

        Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

        +

        Each column on your model definitions needs to be an instance of a Column class.

        +
        +
        +class cassandra.cqlengine.columns.Column(**kwargs)
        +
        +
        +primary_key = False
        +

        bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

        +
        + +
        +
        +partition_key = False
        +

        indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

        +
        + +
        +
        +index = False
        +

        bool flag, indicates an index should be created for this column

        +
        + +
        +
        +custom_index = False
        +

        bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

        +
        + +
        +
        +db_field = None
        +

        the fieldname this field will map to in the database

        +
        + +
        +
        +default = None
        +

        the default value, can be a value or a callable (no args)

        +
        + +
        +
        +required = False
        +

        boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

        +
        + +
        +
        +clustering_order = None
        +

        only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

        +
        + +
        +
        +discriminator_column = False
        +

        boolean, if set to True, this column will be used for discriminating records +of inherited models.

        +

        Should only be set on a column of an abstract model being used for inheritance.

        +

        There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

        +
        + +
        +
        +static = False
        +

        boolean, if set to True, this is a static column, with a single value per partition

        +
        + +
        + +
        +
        +

        Column Types

        +

        Columns of all types are initialized by passing Column attributes to the constructor by keyword.

        +
        +
        +class cassandra.cqlengine.columns.Ascii(**kwargs)
        +

        Stores a US-ASCII character string

        +
        +
        Parameters:
        +
          +
        • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

        • +
        • max_length (int) – Sets the maximum length of this string, for validation purposes.

        • +
        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.columns.BigInt(**kwargs)
        +

        Stores a 64-bit signed integer value

        +
        + +
        +
        +class cassandra.cqlengine.columns.Blob(**kwargs)
        +

        Stores a raw binary value

        +
        + +
        +
        +cassandra.cqlengine.columns.Bytes
        +

        alias of Blob

        +
        + +
        +
        +class cassandra.cqlengine.columns.Boolean(**kwargs)
        +

        Stores a boolean True or False value

        +
        + +
        +
        +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
        +

        Stores a counter that can be incremented and decremented

        +
        + +
        +
        +class cassandra.cqlengine.columns.Date(**kwargs)
        +

        Stores a simple date, with no time-of-day

        +
        +

        Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

        +
        +

        requires C* 2.2+ and protocol v4+

        +
        + +
        +
        +class cassandra.cqlengine.columns.DateTime(**kwargs)
        +

        Stores a datetime value

        +
        +
        +truncate_microseconds = False
        +

        Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

        +
        DateTime.truncate_microseconds = True
        +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
        +
        +
        +

        Defaults to False to preserve legacy behavior. May change in the future.

        +
        + +
        + +
        +
        +class cassandra.cqlengine.columns.Decimal(**kwargs)
        +

        Stores a variable precision decimal value

        +
        + +
        +
        +class cassandra.cqlengine.columns.Double(**kwargs)
        +

        Stores a double-precision floating-point value

        +
        + +
        +
        +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
        +

        Stores a single-precision floating-point value

        +
        + +
        +
        +class cassandra.cqlengine.columns.Integer(**kwargs)
        +

        Stores a 32-bit signed integer value

        +
        + +
        +
        +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
        +

        Stores a list of ordered values

        +

        http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

        +
        +
        Parameters:
        +

        value_type – a column class indicating the types of the value

        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
        +

        Stores a key -> value map (dictionary)

        +

        https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

        +
        +
        Parameters:
        +
          +
        • key_type – a column class indicating the types of the key

        • +
        • value_type – a column class indicating the types of the value

        • +
        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
        +

        Stores a set of unordered, unique values

        +

        http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

        +
        +
        Parameters:
        +
          +
        • value_type – a column class indicating the types of the value

        • +
        • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

        • +
        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.columns.SmallInt(**kwargs)
        +

        Stores a 16-bit signed integer value

        +
        +

        New in version 2.6.0.

        +
        +

        requires C* 2.2+ and protocol v4+

        +
        + +
        +
        +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
        +

        Stores a UTF-8 encoded string

        +
        +
        Parameters:
        +
          +
        • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

        • +
        • max_length (int) – Sets the maximum length of this string, for validation purposes.

        • +
        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.columns.Time(**kwargs)
        +

        Stores a timezone-naive time-of-day, with nanosecond precision

        +
        +

        New in version 2.6.0.

        +
        +

        requires C* 2.2+ and protocol v4+

        +
        + +
        +
        +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
        +

        UUID containing timestamp

        +
        + +
        +
        +class cassandra.cqlengine.columns.TinyInt(**kwargs)
        +

        Stores an 8-bit signed integer value

        +
        +

        New in version 2.6.0.

        +
        +

        requires C* 2.2+ and protocol v4+

        +
        + +
        +
        +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
        +

        User Defined Type column

        +

        http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

        +

        These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

        +

        Please see User Defined Types for examples and discussion.

        +
        +
        Parameters:
        +

        user_type (type) – specifies the UserType model of the column

        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.columns.UUID(**kwargs)
        +

        Stores a type 1 or 4 UUID

        +
        + +
        +
        +class cassandra.cqlengine.columns.VarInt(**kwargs)
        +

        Stores an arbitrary-precision integer

        +
        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cqlengine/connection.html b/3.22.3-scylla/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..e500f84816 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cqlengine/connection.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cqlengine.connection - Connection management for cqlengine

        +
        +
        +cassandra.cqlengine.connection.default()
        +

        Configures the default connection to localhost, using the driver defaults +(except for row_factory)

        +
        + +
        +
        +cassandra.cqlengine.connection.set_session(s)
        +

        Configures the default connection with a preexisting cassandra.cluster.Session

        +

        Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

        +
        + +
        +
        +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
        +

        Setup a the driver connection used by the mapper

        +
        +
        Parameters:
        +
          +
        • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

        • +
        • default_keyspace (str) – The default keyspace to use

        • +
        • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

        • +
        • lazy_connect (bool) – True if should not connect until first use

        • +
        • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

        • +
        • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

        • +
        +
        +
        +
        + +
        +
        +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
        +

        Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

        +
        +
        Parameters:
        +
          +
        • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

        • +
        • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

        • +
        • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

        • +
        • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

        • +
        • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

        • +
        • default (bool) – If True, set the new connection as the cqlengine +default

        • +
        • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

        • +
        +
        +
        +
        + +
        +
        +cassandra.cqlengine.connection.unregister_connection(name)
        +
        + +
        +
        +cassandra.cqlengine.connection.set_default_connection(name)
        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cqlengine/management.html b/3.22.3-scylla/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..131ca90240 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cqlengine/management.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cqlengine.management - Schema management for cqlengine

        +

        A collection of functions for managing keyspace and table schema.

        +
        +
        +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
        +

        Creates a keyspace with SimpleStrategy for replica placement

        +

        If the keyspace already exists, it will not be modified.

        +

        This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

        +

        There are plans to guard schema-modifying functions with an environment-driven conditional.

        +
        +
        Parameters:
        +
          +
        • name (str) – name of keyspace to create

        • +
        • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

        • +
        • durable_writes (bool) – Write log is bypassed if set to False

        • +
        • connections (list) – List of connection names

        • +
        +
        +
        +
        + +
        +
        +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
        +

        Creates a keyspace with NetworkTopologyStrategy for replica placement

        +

        If the keyspace already exists, it will not be modified.

        +

        This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

        +

        There are plans to guard schema-modifying functions with an environment-driven conditional.

        +
        +
        Parameters:
        +
          +
        • name (str) – name of keyspace to create

        • +
        • dc_replication_map (dict) – map of dc_names: replication_factor

        • +
        • durable_writes (bool) – Write log is bypassed if set to False

        • +
        • connections (list) – List of connection names

        • +
        +
        +
        +
        + +
        +
        +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
        +

        Drops a keyspace, if it exists.

        +

        There are plans to guard schema-modifying functions with an environment-driven conditional.

        +

        This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

        +
        +
        Parameters:
        +
          +
        • name (str) – name of keyspace to drop

        • +
        • connections (list) – List of connection names

        • +
        +
        +
        +
        + +
        +
        +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
        +

        Inspects the model and creates / updates the corresponding table and columns.

        +

        If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

        +

        If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

        +

        Any User Defined Types used in the table are implicitly synchronized.

        +

        This function can only add fields that are not part of the primary key.

        +

        Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

        +

        This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

        +

        There are plans to guard schema-modifying functions with an environment-driven conditional.

        +
        + +
        +
        +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
        +

        Inspects the type_model and creates / updates the corresponding type.

        +

        Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

        +

        This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

        +

        There are plans to guard schema-modifying functions with an environment-driven conditional.

        +
        + +
        +
        +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
        +

        Drops the table indicated by the model, if it exists.

        +

        If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

        +

        If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

        +

        This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

        +

        There are plans to guard schema-modifying functions with an environment-driven conditional.

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cqlengine/models.html b/3.22.3-scylla/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..ace643d922 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cqlengine/models.html @@ -0,0 +1,964 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cqlengine.models - Table models for object mapping

        +
        +

        Model

        +
        +
        +class cassandra.cqlengine.models.Model(\*\*kwargs)
        +

        The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

        +
        class Person(Model):
        +    id = columns.UUID(primary_key=True)
        +    first_name  = columns.Text()
        +    last_name = columns.Text()
        +
        +person = Person(first_name='Blake', last_name='Eggleston')
        +person.first_name  #returns 'Blake'
        +person.last_name  #returns 'Eggleston'
        +
        +
        +

        Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

        +
        +
        +__abstract__ = False
        +

        Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

        +
        + +
        +
        +__table_name__ = None
        +

        Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

        +
        + +
        +
        +__table_name_case_sensitive__ = False
        +

        Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

        +
        + +
        +
        +__keyspace__ = None
        +

        Sets the name of the keyspace used by this model.

        +
        + +
        +
        +__connection__ = None
        +

        Sets the name of the default connection used by this model.

        +
        + +
        +
        +__default_ttl__ = None
        +

        Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

        +
        + +
        +
        +__discriminator_value__ = None
        +

        Optional Specifies a value for the discriminator column when using model inheritance.

        +

        See Model Inheritance for usage examples.

        +
        + +

        Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

        +

        When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

        +

        Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

        +

        See the list of supported table properties for more information.

        +
        +
        +__options__
        +

        For example:

        +
        class User(Model):
        +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
        +                                  'sstable_size_in_mb': '64',
        +                                  'tombstone_threshold': '.2'},
        +                   'comment': 'User data stored here'}
        +
        +    user_id = columns.UUID(primary_key=True)
        +    name = columns.Text()
        +
        +
        +

        or :

        +
        class TimeData(Model):
        +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
        +                                  'bucket_low': '.3',
        +                                  'bucket_high': '2',
        +                                  'min_threshold': '2',
        +                                  'max_threshold': '64',
        +                                  'tombstone_compaction_interval': '86400'},
        +                   'gc_grace_seconds': '0'}
        +
        +
        +
        + +
        +
        +__compute_routing_key__ = True
        +

        Optional Setting False disables computing the routing key for TokenAwareRouting

        +
        + +

        The base methods allow creating, storing, and querying modeled objects.

        +
        +
        +classmethod create(**kwargs)
        +

        Create an instance of this model in the database.

        +

        Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

        +

        Returns the instance.

        +
        + +
        +
        +if_not_exists()
        +

        Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

        +

        If the insertion isn’t applied, a LWTException is raised.

        +
        try:
        +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
        +except LWTException as e:
        +    # handle failure case
        +    print e.existing  # dict containing LWT result fields
        +
        +
        +

        This method is supported on Cassandra 2.0 or later.

        +
        + +
        +
        +if_exists()
        +

        Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

        +

        If the update or delete isn’t applied, a LWTException is raised.

        +
        try:
        +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
        +except LWTException as e:
        +    # handle failure case
        +    pass
        +
        +
        +

        This method is supported on Cassandra 2.0 or later.

        +
        + +
        +
        +save()
        +

        Saves an object to the database.

        +
        #create a person instance
        +person = Person(first_name='Kimberly', last_name='Eggleston')
        +#saves it to Cassandra
        +person.save()
        +
        +
        +
        + +
        +
        +update(**values)
        +

        Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

        +

        It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

        +
        + +
        +
        +iff(**values)
        +

        Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

        +

        If the insertion isn’t applied, a LWTException is raised.

        +
        t = TestTransactionModel(text='some text', count=5)
        +try:
        +     t.iff(count=5).update('other text')
        +except LWTException as e:
        +    # handle failure case
        +    print e.existing # existing object
        +
        +
        +
        + +
        +
        +classmethod get(*args, **kwargs)
        +

        Returns a single object based on the passed filter constraints.

        +

        This is a pass-through to the model objects().:method:~cqlengine.queries.get.

        +
        + +
        +
        +classmethod filter(*args, **kwargs)
        +

        Returns a queryset based on filter parameters.

        +

        This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

        +
        + +
        +
        +classmethod all()
        +

        Returns a queryset representing all stored objects

        +

        This is a pass-through to the model objects().all()

        +
        + +
        +
        +delete()
        +

        Deletes the object from the database

        +
        + +
        +
        +batch(batch_object)
        +

        Sets the batch object to run instance updates and inserts queries with.

        +

        See Batch Queries for usage examples

        +
        + +
        +
        +timeout(timeout)
        +

        Sets a timeout for use in save(), update(), and delete() +operations

        +
        + +
        +
        +timestamp(timedelta_or_datetime)
        +

        Sets the timestamp for the query

        +
        + +
        +
        +ttl(ttl_in_sec)
        +

        Sets the ttl values to run instance updates and inserts queries with.

        +
        + +
        +
        +using(connection=None)
        +

        Change the context on the fly of the model instance (keyspace, connection)

        +
        + +
        +
        +classmethod column_family_name(include_keyspace=True)
        +

        Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

        +
        + +

        Models also support dict-like access:

        +
        +
        +len(m)
        +

        Returns the number of columns defined in the model

        +
        + +
        +
        +m[col_name]()
        +

        Returns the value of column col_name

        +
        + +
        +
        +m[col_name] = value
        +

        Set m[col_name] to value

        +
        + +
        +
        +keys()
        +

        Returns a list of column IDs.

        +
        + +
        +
        +values()
        +

        Returns list of column values.

        +
        + +
        +
        +items()
        +

        Returns a list of column ID/value tuples.

        +
        + +
        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cqlengine/query.html b/3.22.3-scylla/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..443e6c8b28 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cqlengine/query.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cqlengine.query - Query and filter model objects

        +
        +

        QuerySet

        +

        QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

        +
        +
        +class cassandra.cqlengine.query.ModelQuerySet(model)
        +
        +
        +all()
        +

        Returns a queryset matching all rows

        +
        for user in User.objects().all():
        +    print(user)
        +
        +
        +
        + +
        +
        +batch(batch_obj)
        +

        Set a batch object to run the query on.

        +

        Note: running a select query with a batch object will raise an exception

        +
        + +
        +
        +consistency(consistency)
        +

        Sets the consistency level for the operation. See ConsistencyLevel.

        +
        for user in User.objects(id=3).consistency(CL.ONE):
        +    print(user)
        +
        +
        +
        + +
        +
        +count()
        +

        Returns the number of rows matched by this query.

        +

        Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

        +
        + +
        +
        +len(queryset)
        +

        Returns the number of rows matched by this query. This function uses count() internally.

        +

        Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

        +
        + +
        +
        +distinct(distinct_fields=None)
        +

        Returns the DISTINCT rows matched by this query.

        +

        distinct_fields default to the partition key fields if not specified.

        +

        Note: distinct_fields must be a partition key or a static column

        +
        class Automobile(Model):
        +    manufacturer = columns.Text(partition_key=True)
        +    year = columns.Integer(primary_key=True)
        +    model = columns.Text(primary_key=True)
        +    price = columns.Decimal()
        +
        +sync_table(Automobile)
        +
        +# create rows
        +
        +Automobile.objects.distinct()
        +
        +# or
        +
        +Automobile.objects.distinct(['manufacturer'])
        +
        +
        +
        + +
        +
        +filter(*args, **kwargs)
        +

        Adds WHERE arguments to the queryset, returning a new queryset

        +

        See Retrieving objects with filters

        +

        Returns a QuerySet filtered on the keyword arguments

        +
        + +
        +
        +get(*args, **kwargs)
        +

        Returns a single instance matching this query, optionally with additional filter kwargs.

        +

        See Retrieving objects with filters

        +

        Returns a single object matching the QuerySet.

        +
        user = User.get(id=1)
        +
        +
        +

        If no objects are matched, a DoesNotExist exception is raised.

        +

        If more than one object is found, a MultipleObjectsReturned exception is raised.

        +
        + +
        +
        +limit(v)
        +

        Limits the number of results returned by Cassandra. Use 0 or None to disable.

        +

        Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

        +
        # Fetch 100 users
        +for user in User.objects().limit(100):
        +    print(user)
        +
        +# Fetch all users
        +for user in User.objects().limit(None):
        +    print(user)
        +
        +
        +
        + +
        +
        +fetch_size(v)
        +

        Sets the number of rows that are fetched at a time.

        +

        Note that driver’s default fetch size is 5000.

        +
        for user in User.objects().fetch_size(500):
        +    print(user)
        +
        +
        +
        + +
        +
        +if_not_exists()
        +

        Check the existence of an object before insertion.

        +

        If the insertion isn’t applied, a LWTException is raised.

        +
        + +
        +
        +if_exists()
        +

        Check the existence of an object before an update or delete.

        +

        If the update or delete isn’t applied, a LWTException is raised.

        +
        + +
        +
        +order_by(*colnames)
        +

        Sets the column(s) to be used for ordering

        +

        Default order is ascending, prepend a ‘-’ to any column name for descending

        +

        Note: column names must be a clustering key

        +
        from uuid import uuid1,uuid4
        +
        +class Comment(Model):
        +    photo_id = UUID(primary_key=True)
        +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
        +    comment = Text()
        +
        +sync_table(Comment)
        +
        +u = uuid4()
        +for x in range(5):
        +    Comment.create(photo_id=u, comment="test %d" % x)
        +
        +print("Normal")
        +for comment in Comment.objects(photo_id=u):
        +    print comment.comment_id
        +
        +print("Reversed")
        +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
        +    print comment.comment_id
        +
        +
        +
        + +
        +
        +allow_filtering()
        +

        Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

        +
        + +
        +
        +only(fields)
        +

        Load only these fields for the returned query

        +
        + +
        +
        +defer(fields)
        +

        Don’t load these fields for the returned query

        +
        + +
        +
        +timestamp(timestamp)
        +

        Allows for custom timestamps to be saved with the record.

        +
        + +
        +
        +ttl(ttl)
        +

        Sets the ttl (in seconds) for modified data.

        +

        Note that running a select query with a ttl value will raise an exception

        +
        + +
        +
        +using(keyspace=None, connection=None)
        +

        Change the context on-the-fly of the Model class (keyspace, connection)

        +
        + +
        +
        +update(**values)
        +

        Performs an update on the row selected by the queryset. Include values to update in the +update like so:

        +
        Model.objects(key=n).update(value='x')
        +
        +
        +

        Passing in updates for columns which are not part of the model will raise a ValidationError.

        +

        Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

        +

        For example:

        +
        class User(Model):
        +    id = Integer(primary_key=True)
        +    name = Text()
        +
        +setup(["localhost"], "test")
        +sync_table(User)
        +
        +u = User.create(id=1, name="jon")
        +
        +User.objects(id=1).update(name="Steve")
        +
        +# sets name to null
        +User.objects(id=1).update(name=None)
        +
        +
        +

        Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

        +

        Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

        +

        Given the model below, here are the operations that can be performed on the different container columns:

        +
        class Row(Model):
        +    row_id      = columns.Integer(primary_key=True)
        +    set_column  = columns.Set(Integer)
        +    list_column = columns.List(Integer)
        +    map_column  = columns.Map(Integer, Integer)
        +
        +
        +

        Set

        +
          +
        • add: adds the elements of the given set to the column

        • +
        • remove: removes the elements of the given set to the column

        • +
        +
        # add elements to a set
        +Row.objects(row_id=5).update(set_column__add={6})
        +
        +# remove elements to a set
        +Row.objects(row_id=5).update(set_column__remove={4})
        +
        +
        +

        List

        +
          +
        • append: appends the elements of the given list to the end of the column

        • +
        • prepend: prepends the elements of the given list to the beginning of the column

        • +
        +
        # append items to a list
        +Row.objects(row_id=5).update(list_column__append=[6, 7])
        +
        +# prepend items to a list
        +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
        +
        +
        +

        Map

        +
          +
        • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

        • +
        +
        # add items to a map
        +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
        +
        +# remove items from a map
        +Row.objects(row_id=5).update(map_column__remove={1, 2})
        +
        +
        +
        + +
        + +
        +
        +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
        +

        Handles the batching of queries

        +

        http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

        +

        See Batch Queries for more details.

        +
        +
        Parameters:
        +
          +
        • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

        • +
        • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

        • +
        • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

        • +
        • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

        • +
        • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

        • +
        • connection (str) – Connection name to use for the batch execution

        • +
        +
        +
        +
        +
        +add_query(query)
        +
        + +
        +
        +execute()
        +
        + +
        +
        +add_callback(fn, *args, **kwargs)
        +

        Add a function and arguments to be passed to it to be executed after the batch executes.

        +

        A batch can support multiple callbacks.

        +

        Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

        +
        +
        Parameters:
        +
          +
        • fn (callable) – Callable object

        • +
        • *args – Positional arguments to be passed to the callback at the time of execution

        • +
        • **kwargs – Named arguments to be passed to the callback at the time of execution

        • +
        +
        +
        +
        + +
        + +
        +
        +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
        +

        A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

        +
        +
        Parameters:
        +
          +
        • *args – One or more models. A model should be a class type, not an instance.

        • +
        • **kwargs – (optional) Context parameters: can be keyspace or connection

        • +
        +
        +
        +

        For example:

        +
        with ContextQuery(Automobile, keyspace='test2') as A:
        +    A.objects.create(manufacturer='honda', year=2008, model='civic')
        +    print len(A.objects.all())  # 1 result
        +
        +with ContextQuery(Automobile, keyspace='test4') as A:
        +    print len(A.objects.all())  # 0 result
        +
        +# Multiple models
        +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
        +    print len(A.objects.all())
        +    print len(A2.objects.all())
        +
        +
        +
        + +
        +
        +class cassandra.cqlengine.query.DoesNotExist
        +
        + +
        +
        +class cassandra.cqlengine.query.MultipleObjectsReturned
        +
        + +
        +
        +class cassandra.cqlengine.query.LWTException(existing)
        +

        Lightweight conditional exception.

        +

        This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

        +
        +
        Parameters:
        +

        existing – The current state of the data which prevented the write.

        +
        +
        +
        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/cqlengine/usertype.html b/3.22.3-scylla/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..2a4319403d --- /dev/null +++ b/3.22.3-scylla/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.cqlengine.usertype - Model classes for User Defined Types

        +
        +

        UserType

        +
        +
        +class cassandra.cqlengine.usertype.UserType(**values)
        +

        This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

        +
        # connect with default keyspace ...
        +
        +from cassandra.cqlengine.columns import Text, Integer
        +from cassandra.cqlengine.usertype import UserType
        +
        +class address(UserType):
        +    street = Text()
        +    zipcode = Integer()
        +
        +from cassandra.cqlengine import management
        +management.sync_type(address)
        +
        +
        +

        Please see User Defined Types for a complete example and discussion.

        +
        +
        +__type_name__ = None
        +

        Optional. Sets the name of the CQL type for this type.

        +

        If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

        +
        + +
        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/datastax/graph/fluent/index.html b/3.22.3-scylla/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..9b1ffebf83 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.datastax.graph.fluent

        +
        +
        +class cassandra.datastax.graph.fluent.DseGraph
        +

        Dse Graph utility class for GraphTraversal construction and execution.

        +
        +
        +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
        +

        Graph query language, Default is ‘bytecode-json’ (GraphSON).

        +
        + +
        +
        +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
        +

        Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

        +
        +
        Parameters:
        +
          +
        • graph_name – The graph name

        • +
        • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

        • +
        +
        +
        +
        + +
        +
        +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
        +

        From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

        +
        +
        Parameters:
        +
          +
        • traversal – The GraphTraversal object

        • +
        • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

        • +
        • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

        • +
        +
        +
        +
        + +
        +
        +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
        +

        Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

        +
        +
        Parameters:
        +
          +
        • session – (Optional) A DSE session

        • +
        • graph_name – (Optional) DSE Graph name

        • +
        • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

        • +
        • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

        • +
        +
        +
        +
        from cassandra.cluster import Cluster
        +from cassandra.datastax.graph.fluent import DseGraph
        +
        +c = Cluster()
        +session = c.connect()
        +
        +g = DseGraph.traversal_source(session, 'my_graph')
        +print g.V().valueMap().toList()
        +
        +
        +
        + +
        +
        +static batch(session=None, execution_profile=None)
        +

        Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
        +

        A Tinkerpop RemoteConnection to execute traversal queries on DSE.

        +
        +
        Parameters:
        +
          +
        • session – A DSE session

        • +
        • graph_name – (Optional) DSE Graph name.

        • +
        • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

        • +
        +
        +
        +
        + +
        +
        +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
        +

        Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

        +
        +
        Currently supported:
          +
        • bulk results

        • +
        +
        +
        +
        + +
        +
        +cassandra.datastax.graph.fluent.graph_traversal_row_factory
        +

        alias of _GremlinGraphSON2RowFactory

        +
        + +
        +
        +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
        +

        alias of _DseGraphSON2RowFactory

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/datastax/graph/fluent/predicates.html b/3.22.3-scylla/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..28478630d4 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.datastax.graph.fluent.predicates

        +
        +
        +class cassandra.datastax.graph.fluent.predicates.Search
        +
        +
        +static token(value)
        +

        Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

        +
        + +
        +
        +static token_prefix(value)
        +

        Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

        +
        + +
        +
        +static token_regex(value)
        +

        Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

        +
        + +
        +
        +static prefix(value)
        +

        Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

        +
        + +
        +
        +static regex(value)
        +

        Search for this regular expression inside the text property targeted. +:param value: the value to look for.

        +
        + +
        +
        +static fuzzy(value, distance)
        +

        Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

        +
        + +
        +
        +static token_fuzzy(value, distance)
        +

        Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

        +
        + +
        +
        +static phrase(value, proximity)
        +

        Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.fluent.predicates.CqlCollection
        +
        +
        +static contains(value)
        +

        Search for a value inside a cql list/set column. +:param value: the value to look for.

        +
        + +
        +
        +static contains_value(value)
        +

        Search for a map value. +:param value: the value to look for.

        +
        + +
        +
        +static contains_key(value)
        +

        Search for a map key. +:param value: the value to look for.

        +
        + +
        +
        +static entry_eq(value)
        +

        Search for a map entry. +:param value: the value to look for.

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.fluent.predicates.Geo
        +
        +
        +static inside(value, units=1)
        +

        Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/datastax/graph/fluent/query.html b/3.22.3-scylla/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..8bf0118ee4 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.datastax.graph.fluent.query

        +
        +
        +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
        +

        A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

        +

        If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

        +
        +
        Parameters:
        +
          +
        • session – (Optional) A DSE session

        • +
        • execution_profile – (Optional) The execution profile to use for the batch execution

        • +
        +
        +
        +
        +
        +add(traversal)
        +

        Add a traversal to the batch.

        +
        +
        Parameters:
        +

        traversal – A gremlin GraphTraversal

        +
        +
        +
        + +
        +
        +add_all(traversals)
        +

        Adds a sequence of traversals to the batch.

        +
        +
        Parameters:
        +

        traversals – A sequence of gremlin GraphTraversal

        +
        +
        +
        + +
        +
        +execute()
        +

        Execute the traversal batch if bounded to a DSE Session.

        +
        + +
        +
        +as_graph_statement(graph_protocol=b'graphson-2.0')
        +

        Return the traversal batch as GraphStatement.

        +
        +
        Parameters:
        +

        graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

        +
        +
        +
        + +
        +
        +clear()
        +

        Clear a traversal batch for reuse.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/datastax/graph/index.html b/3.22.3-scylla/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..cedd345e49 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1078 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.datastax.graph - Graph Statements, Options, and Row Factories

        +
        +
        +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
        +

        returns the JSON string value of graph results

        +
        + +
        +
        +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
        +

        Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

        +
        + +
        +
        +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
        +

        Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

        +
        + +
        +
        +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
        +

        Row factory to deserialize GraphSON2 results.

        +
        + +
        +
        +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
        +

        Row factory to deserialize GraphSON3 results.

        +
        + +
        +
        +cassandra.datastax.graph.to_int(value)
        +

        Wraps a value to be explicitly serialized as a graphson Int.

        +
        + +
        +
        +cassandra.datastax.graph.to_bigint(value)
        +

        Wraps a value to be explicitly serialized as a graphson Bigint.

        +
        + +
        +
        +cassandra.datastax.graph.to_smallint(value)
        +

        Wraps a value to be explicitly serialized as a graphson Smallint.

        +
        + +
        +
        +cassandra.datastax.graph.to_float(value)
        +

        Wraps a value to be explicitly serialized as a graphson Float.

        +
        + +
        +
        +cassandra.datastax.graph.to_double(value)
        +

        Wraps a value to be explicitly serialized as a graphson Double.

        +
        + +
        +
        +class cassandra.datastax.graph.GraphProtocol
        +
        +
        +GRAPHSON_1_0 = b'graphson-1.0'
        +

        GraphSON1

        +
        + +
        +
        +GRAPHSON_2_0 = b'graphson-2.0'
        +

        GraphSON2

        +
        + +
        +
        +GRAPHSON_3_0 = b'graphson-3.0'
        +

        GraphSON3

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.GraphOptions(**kwargs)
        +

        Options for DSE Graph Query handler.

        +
        +
        +graph_name
        +

        name of the targeted graph.

        +
        + +
        +
        +graph_source
        +

        choose the graph traversal source, configured on the server side.

        +
        + +
        +
        +graph_language
        +

        the language used in the queries (default “gremlin-groovy”)

        +
        + +
        +
        +graph_read_consistency_level
        +

        read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

        +
        + +
        +
        +graph_write_consistency_level
        +

        write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

        +
        + +
        +
        +is_default_source
        +
        + +
        +
        +is_analytics_source
        +

        True if graph_source is set to the server-defined analytics traversal source (‘a’)

        +
        + +
        +
        +is_graph_source
        +

        True if graph_source is set to the server-defined graph traversal source (‘g’)

        +
        + +
        +
        +set_source_default()
        +

        Sets graph_source to the server-defined default traversal source (‘default’)

        +
        + +
        +
        +set_source_analytics()
        +

        Sets graph_source to the server-defined analytic traversal source (‘a’)

        +
        + +
        +
        +set_source_graph()
        +

        Sets graph_source to the server-defined graph traversal source (‘g’)

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
        +

        Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

        +

        query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

        +

        See Statement attributes for a description of the other parameters.

        +
        + +
        +
        +class cassandra.datastax.graph.Result(value)
        +

        Represents deserialized graph results. +Property and item getters are provided for convenience.

        +
        +
        +value = None
        +

        Deserialized value from the result

        +
        + +
        +
        +as_vertex()
        +

        Return a Vertex parsed from this result

        +

        Raises TypeError if parsing fails (i.e. the result structure is not valid).

        +
        + +
        +
        +as_edge()
        +

        Return a Edge parsed from this result

        +

        Raises TypeError if parsing fails (i.e. the result structure is not valid).

        +
        + +
        +
        +as_path()
        +

        Return a Path parsed from this result

        +

        Raises TypeError if parsing fails (i.e. the result structure is not valid).

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.Vertex(id, label, type, properties)
        +

        Represents a Vertex element from a graph query.

        +

        Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

        +
        + +
        +
        +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
        +

        Vertex properties have a top-level value and an optional dict of properties.

        +
        +
        +label = None
        +

        label of the property

        +
        + +
        +
        +value = None
        +

        Value of the property

        +
        + +
        +
        +properties = None
        +

        dict of properties attached to the property

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
        +

        Represents an Edge element from a graph query.

        +

        Attributes match initializer parameters.

        +
        + +
        +
        +class cassandra.datastax.graph.Path(labels, objects)
        +

        Represents a graph path.

        +

        Labels list is taken verbatim from the results.

        +

        Objects are either Result or Vertex/Edge for recognized types

        +
        +
        +labels = None
        +

        List of labels in the path

        +
        + +
        +
        +objects = None
        +

        List of objects in the path

        +
        + +
        + +
        +
        +class cassandra.datastax.graph.GraphSON1Serializer
        +

        Serialize python objects to graphson types.

        +
        + +
        +
        +class cassandra.datastax.graph.GraphSON1Deserializer
        +

        Deserialize graphson1 types to python objects.

        +
        +
        +classmethod deserialize_date(value)
        +
        + +
        +
        +classmethod deserialize_timestamp(value)
        +
        + +
        +
        +classmethod deserialize_time(value)
        +
        + +
        +
        +classmethod deserialize_duration(value)
        +
        + +
        +
        +classmethod deserialize_int(value)
        +
        + +
        +
        +classmethod deserialize_bigint(value)
        +
        + +
        +
        +classmethod deserialize_double(value)
        +
        + +
        +
        +classmethod deserialize_float(value)
        +
        + +
        +
        +classmethod deserialize_uuid(value)
        +
        + +
        +
        +classmethod deserialize_blob(value)
        +
        + +
        +
        +classmethod deserialize_decimal(value)
        +
        + +
        +
        +classmethod deserialize_point(value)
        +
        + +
        +
        +classmethod deserialize_linestring(value)
        +
        + +
        +
        +classmethod deserialize_polygon(value)
        +
        + +
        + +
        +
        +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
        +

        GraphSON2 Reader that parse json and deserialize to python objects.

        +
        +
        Parameters:
        +

        extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

        +
        +
        +
        +
        +read(json_data)
        +

        Read and deserialize json_data.

        +
        + +
        +
        +deserialize(obj)
        +

        Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/decoder.html b/3.22.3-scylla/api/cassandra/decoder.html new file mode 100644 index 0000000000..42af52a863 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/decoder.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.decoder - Data Return Formats

        +
        +
        +cassandra.decoder.tuple_factory()
        +

        Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

        +
        + +
        +
        +cassandra.decoder.named_tuple_factory()
        +

        Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

        +
        + +
        +
        +cassandra.decoder.dict_factory()
        +

        Deprecated in 2.0.0. Use cassandra.query.dict_factory()

        +
        + +
        +
        +cassandra.decoder.ordered_dict_factory()
        +

        Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/encoder.html b/3.22.3-scylla/api/cassandra/encoder.html new file mode 100644 index 0000000000..b83d8d092f --- /dev/null +++ b/3.22.3-scylla/api/cassandra/encoder.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.encoder - Encoders for non-prepared Statements

        +
        +
        +class cassandra.encoder.Encoder
        +

        A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

        +
        +
        +mapping = None
        +

        A map of python types to encoder functions.

        +
        + +
        +
        +cql_encode_none()
        +

        Converts None to the string ‘NULL’.

        +
        + +
        +
        +cql_encode_object()
        +

        Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

        +
        + +
        +
        +cql_encode_all_types()
        +

        Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

        +
        + +
        +
        +cql_encode_sequence()
        +

        Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

        +
        + +
        +
        +cql_encode_str()
        +

        Escapes quotes in str objects.

        +
        + +
        +
        +cql_encode_unicode()
        +

        Converts unicode objects to UTF-8 encoded strings with quote escaping.

        +
        + +
        +
        +cql_encode_bytes()
        +

        Converts strings, buffers, and bytearrays into CQL blob literals.

        +
        + +
        +
        +cql_encode_datetime()
        +

        Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

        +
        + +
        +
        +cql_encode_date()
        +

        Converts a datetime.date object to a string with format +YYYY-MM-DD.

        +
        + +
        +
        +cql_encode_map_collection()
        +

        Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

        +
        + +
        +
        +cql_encode_list_collection()
        +

        Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

        +
        + +
        +
        +cql_encode_set_collection()
        +

        Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

        +
        + +
        +
        +cql_encode_tuple()
        +

        Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/graph.html b/3.22.3-scylla/api/cassandra/graph.html new file mode 100644 index 0000000000..8db4c2fbe3 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/graph.html @@ -0,0 +1,1098 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.graph - Graph Statements, Options, and Row Factories

        +
        +

        Note

        +

        This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

        +
        +
        +
        +cassandra.graph.single_object_row_factory(column_names, rows)
        +

        returns the JSON string value of graph results

        +
        + +
        +
        +cassandra.graph.graph_result_row_factory(column_names, rows)
        +

        Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

        +
        + +
        +
        +cassandra.graph.graph_object_row_factory(column_names, rows)
        +

        Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

        +
        + +
        +
        +cassandra.graph.graph_graphson2_row_factory(cluster)
        +

        Row factory to deserialize GraphSON2 results.

        +
        + +
        +
        +cassandra.graph.graph_graphson3_row_factory(cluster)
        +

        Row factory to deserialize GraphSON3 results.

        +
        + +
        +
        +cassandra.graph.to_int(value)
        +

        Wraps a value to be explicitly serialized as a graphson Int.

        +
        + +
        +
        +cassandra.graph.to_bigint(value)
        +

        Wraps a value to be explicitly serialized as a graphson Bigint.

        +
        + +
        +
        +cassandra.graph.to_smallint(value)
        +

        Wraps a value to be explicitly serialized as a graphson Smallint.

        +
        + +
        +
        +cassandra.graph.to_float(value)
        +

        Wraps a value to be explicitly serialized as a graphson Float.

        +
        + +
        +
        +cassandra.graph.to_double(value)
        +

        Wraps a value to be explicitly serialized as a graphson Double.

        +
        + +
        +
        +class cassandra.graph.GraphProtocol
        +
        +
        +GRAPHSON_1_0 = b'graphson-1.0'
        +

        GraphSON1

        +
        + +
        +
        +GRAPHSON_2_0 = b'graphson-2.0'
        +

        GraphSON2

        +
        + +
        +
        +GRAPHSON_3_0 = b'graphson-3.0'
        +

        GraphSON3

        +
        + +
        + +
        +
        +class cassandra.graph.GraphOptions(**kwargs)
        +

        Options for DSE Graph Query handler.

        +
        +
        +graph_name
        +

        name of the targeted graph.

        +
        + +
        +
        +graph_source
        +

        choose the graph traversal source, configured on the server side.

        +
        + +
        +
        +graph_language
        +

        the language used in the queries (default “gremlin-groovy”)

        +
        + +
        +
        +graph_read_consistency_level
        +

        read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

        +
        + +
        +
        +graph_write_consistency_level
        +

        write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

        +
        + +
        +
        +is_default_source
        +
        + +
        +
        +is_analytics_source
        +

        True if graph_source is set to the server-defined analytics traversal source (‘a’)

        +
        + +
        +
        +is_graph_source
        +

        True if graph_source is set to the server-defined graph traversal source (‘g’)

        +
        + +
        +
        +set_source_default()
        +

        Sets graph_source to the server-defined default traversal source (‘default’)

        +
        + +
        +
        +set_source_analytics()
        +

        Sets graph_source to the server-defined analytic traversal source (‘a’)

        +
        + +
        +
        +set_source_graph()
        +

        Sets graph_source to the server-defined graph traversal source (‘g’)

        +
        + +
        + +
        +
        +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
        +

        Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

        +

        query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

        +

        See Statement attributes for a description of the other parameters.

        +
        + +
        +
        +class cassandra.graph.Result(value)
        +

        Represents deserialized graph results. +Property and item getters are provided for convenience.

        +
        +
        +value = None
        +

        Deserialized value from the result

        +
        + +
        +
        +as_vertex()
        +

        Return a Vertex parsed from this result

        +

        Raises TypeError if parsing fails (i.e. the result structure is not valid).

        +
        + +
        +
        +as_edge()
        +

        Return a Edge parsed from this result

        +

        Raises TypeError if parsing fails (i.e. the result structure is not valid).

        +
        + +
        +
        +as_path()
        +

        Return a Path parsed from this result

        +

        Raises TypeError if parsing fails (i.e. the result structure is not valid).

        +
        + +
        + +
        +
        +class cassandra.graph.Vertex(id, label, type, properties)
        +

        Represents a Vertex element from a graph query.

        +

        Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

        +
        + +
        +
        +class cassandra.graph.VertexProperty(label, value, properties=None)
        +

        Vertex properties have a top-level value and an optional dict of properties.

        +
        +
        +label = None
        +

        label of the property

        +
        + +
        +
        +value = None
        +

        Value of the property

        +
        + +
        +
        +properties = None
        +

        dict of properties attached to the property

        +
        + +
        + +
        +
        +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
        +

        Represents an Edge element from a graph query.

        +

        Attributes match initializer parameters.

        +
        + +
        +
        +class cassandra.graph.Path(labels, objects)
        +

        Represents a graph path.

        +

        Labels list is taken verbatim from the results.

        +

        Objects are either Result or Vertex/Edge for recognized types

        +
        +
        +labels = None
        +

        List of labels in the path

        +
        + +
        +
        +objects = None
        +

        List of objects in the path

        +
        + +
        + +
        +
        +class cassandra.graph.GraphSON1Serializer
        +

        Serialize python objects to graphson types.

        +
        + +
        +
        +class cassandra.graph.GraphSON1Deserializer
        +

        Deserialize graphson1 types to python objects.

        +
        +
        +classmethod deserialize_date(value)
        +
        + +
        +
        +classmethod deserialize_timestamp(value)
        +
        + +
        +
        +classmethod deserialize_time(value)
        +
        + +
        +
        +classmethod deserialize_duration(value)
        +
        + +
        +
        +classmethod deserialize_int(value)
        +
        + +
        +
        +classmethod deserialize_bigint(value)
        +
        + +
        +
        +classmethod deserialize_double(value)
        +
        + +
        +
        +classmethod deserialize_float(value)
        +
        + +
        +
        +classmethod deserialize_uuid(value)
        +
        + +
        +
        +classmethod deserialize_blob(value)
        +
        + +
        +
        +classmethod deserialize_decimal(value)
        +
        + +
        +
        +classmethod deserialize_point(value)
        +
        + +
        +
        +classmethod deserialize_linestring(value)
        +
        + +
        +
        +classmethod deserialize_polygon(value)
        +
        + +
        + +
        +
        +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
        +

        GraphSON2 Reader that parse json and deserialize to python objects.

        +
        +
        Parameters:
        +

        extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

        +
        +
        +
        +
        +read(json_data)
        +

        Read and deserialize json_data.

        +
        + +
        +
        +deserialize(obj)
        +

        Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

        +
        + +
        + +
        +
        +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
        +

        GraphSON3 Reader that parse json and deserialize to python objects.

        +
        +
        Parameters:
        +
          +
        • context – A dict of the context, mostly used as context for udt deserialization.

        • +
        • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

        • +
        +
        +
        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/io/asyncioreactor.html b/3.22.3-scylla/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..433b220a16 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.io.asyncioreactor - asyncio Event Loop

        +
        +
        +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
        +

        An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

        +

        Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

        +
        +
        +classmethod initialize_reactor()
        +

        Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/io/asyncorereactor.html b/3.22.3-scylla/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..bec48ca86f --- /dev/null +++ b/3.22.3-scylla/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.io.asyncorereactor - asyncore Event Loop

        +
        +
        +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
        +

        An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

        +
        +
        +classmethod initialize_reactor()
        +

        Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

        +
        + +
        +
        +classmethod handle_fork()
        +

        Called after a forking. This should cleanup any remaining reactor state +from the parent process.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/io/eventletreactor.html b/3.22.3-scylla/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..774bf34764 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/io/eventletreactor.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.io.eventletreactor - eventlet-compatible Connection

        +
        +
        +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
        +

        An implementation of Connection that utilizes eventlet.

        +

        This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

        +
        +
        +classmethod initialize_reactor()
        +

        Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

        +
        + +
        +
        +classmethod service_timeouts()
        +

        cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/io/geventreactor.html b/3.22.3-scylla/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..ee90d0d9d7 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/io/geventreactor.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.io.geventreactor - gevent-compatible Event Loop

        +
        +
        +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
        +

        An implementation of Connection that utilizes gevent.

        +

        This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

        +
        +
        +classmethod initialize_reactor()
        +

        Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/io/libevreactor.html b/3.22.3-scylla/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..e0d2df690a --- /dev/null +++ b/3.22.3-scylla/api/cassandra/io/libevreactor.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.io.libevreactor - libev Event Loop

        +
        +
        +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
        +

        An implementation of Connection that uses libev for its event loop.

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/io/twistedreactor.html b/3.22.3-scylla/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..beb4e78f44 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/io/twistedreactor.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.io.twistedreactor - Twisted Event Loop

        +
        +
        +class cassandra.io.twistedreactor.TwistedConnection
        +

        An implementation of Connection that uses +Twisted’s reactor as its event loop.

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/metadata.html b/3.22.3-scylla/api/cassandra/metadata.html new file mode 100644 index 0000000000..ffc78b43ab --- /dev/null +++ b/3.22.3-scylla/api/cassandra/metadata.html @@ -0,0 +1,1097 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.metadata - Schema and Ring Topology

        +
        +
        +cassandra.metadata.cql_keywords
        +

        set() -> new empty set object +set(iterable) -> new set object

        +

        Build an unordered collection of unique elements.

        +
        + +
        +
        +cassandra.metadata.cql_keywords_unreserved
        +

        set() -> new empty set object +set(iterable) -> new set object

        +

        Build an unordered collection of unique elements.

        +
        + +
        +
        +cassandra.metadata.cql_keywords_reserved
        +

        set() -> new empty set object +set(iterable) -> new set object

        +

        Build an unordered collection of unique elements.

        +
        + +
        +
        +class cassandra.metadata.Metadata
        +

        Holds a representation of the cluster schema and topology.

        +
        +
        +add_or_return_host(host)
        +

        Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

        +
        + +
        +
        +all_hosts()
        +

        Returns a list of all known Host instances in the cluster.

        +
        + +
        +
        +export_schema_as_string()
        +

        Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

        +
        + +
        +
        +get_host(endpoint_or_address, port=None)
        +

        Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

        +
        + +
        +
        +get_host_by_host_id(host_id)
        +

        Same as get_host() but use host_id for lookup.

        +
        + +
        +
        +get_replicas(keyspace, key)
        +

        Returns a list of Host instances that are replicas for a given +partition key.

        +
        + +
        + +
        +

        Schemas

        +
        +
        +class cassandra.metadata.KeyspaceMetadata
        +

        A representation of the schema for a single keyspace.

        +
        +
        +as_cql_query()
        +

        Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

        +
        + +
        +
        +export_as_string()
        +

        Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

        +
        + +
        + +
        +
        +class cassandra.metadata.UserType
        +

        A user defined type, as created by CREATE TYPE statements.

        +

        User-defined types were introduced in Cassandra 2.1.

        +
        +

        New in version 2.1.0.

        +
        +
        +
        +as_cql_query(formatted=False)
        +

        Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

        +
        + +
        + +
        +
        +class cassandra.metadata.Function
        +

        A user defined function, as created by CREATE FUNCTION statements.

        +

        User-defined functions were introduced in Cassandra 2.2

        +
        +

        New in version 2.6.0.

        +
        +
        +
        +as_cql_query(formatted=False)
        +

        Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

        +
        + +
        + +
        +
        +class cassandra.metadata.Aggregate
        +

        A user defined aggregate function, as created by CREATE AGGREGATE statements.

        +

        Aggregate functions were introduced in Cassandra 2.2

        +
        +

        New in version 2.6.0.

        +
        +
        +
        +as_cql_query(formatted=False)
        +

        Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

        +
        + +
        + +
        +
        +class cassandra.metadata.TableMetadata
        +

        A representation of the schema for a single table.

        +
        +
        +as_cql_query(formatted=False)
        +

        Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

        +
        + +
        +
        +export_as_string()
        +

        Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

        +
        + +
        +
        +property is_cql_compatible
        +

        A boolean indicating if this table can be represented as CQL in export

        +
        + +
        +
        +property primary_key
        +

        A list of ColumnMetadata representing the components of +the primary key for this table.

        +
        + +
        + +
        +
        +class cassandra.metadata.TableMetadataV3
        +

        For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

        +
        +
        +property is_cql_compatible
        +

        A boolean indicating if this table can be represented as CQL in export

        +
        + +
        + +
        +
        +class cassandra.metadata.TableMetadataDSE68
        +
        +
        +as_cql_query(formatted=False)
        +

        Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

        +
        + +
        + +
        +
        +class cassandra.metadata.ColumnMetadata
        +

        A representation of a single column in a table.

        +
        + +
        +
        +class cassandra.metadata.IndexMetadata
        +

        A representation of a secondary index on a column.

        +
        +
        +as_cql_query()
        +

        Returns a CQL query that can be used to recreate this index.

        +
        + +
        +
        +export_as_string()
        +

        Returns a CQL query string that can be used to recreate this index.

        +
        + +
        + +
        +
        +class cassandra.metadata.MaterializedViewMetadata
        +

        A representation of a materialized view on a table

        +
        +
        +as_cql_query(formatted=False)
        +

        Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

        +
        + +
        + +
        +
        +class cassandra.metadata.VertexMetadata
        +

        A representation of a vertex on a table

        +
        + +
        +
        +class cassandra.metadata.EdgeMetadata
        +

        A representation of an edge on a table

        +
        + +
        +
        +

        Tokens and Ring Topology

        +
        +
        +class cassandra.metadata.TokenMap
        +

        Information about the layout of the ring.

        +
        +
        +get_replicas(keyspace, token)
        +

        Get a set of Host instances representing all of the +replica nodes for a given Token.

        +
        + +
        + +
        +
        +class cassandra.metadata.Token
        +

        Abstract class representing a token.

        +
        + +
        +
        +class cassandra.metadata.Murmur3Token(token)
        +

        A token for Murmur3Partitioner.

        +

        token is an int or string representing the token.

        +
        + +
        +
        +class cassandra.metadata.MD5Token(token)
        +

        A token for RandomPartitioner.

        +
        + +
        +
        +class cassandra.metadata.BytesToken(token)
        +

        A token for ByteOrderedPartitioner.

        +
        +
        +classmethod from_string(token_string)
        +

        token_string should be the string representation from the server.

        +
        + +
        + +
        +
        +cassandra.metadata.ReplicationStrategy
        +

        alias of _ReplicationStrategy

        +
        + +
        +
        +class cassandra.metadata.SimpleStrategy(options_map)
        +
        +
        +export_for_schema()
        +

        Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

        +
        + +
        +
        +property replication_factor
        +

        The replication factor for this keyspace.

        +

        For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

        +
        + +
        + +
        +
        +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
        +
        +
        +export_for_schema()
        +

        Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

        +
        + +
        + +
        +
        +class cassandra.metadata.LocalStrategy(options_map)
        +
        +
        +export_for_schema()
        +

        Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

        +
        + +
        + +
        +
        +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
        +

        Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

        +

        If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

        +

        Example usage:

        +
        >>> result = group_keys_by_replica(
        +...     session, "system", "peers",
        +...     (("127.0.0.1", ), ("127.0.0.2", )))
        +
        +
        +
        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/metrics.html b/3.22.3-scylla/api/cassandra/metrics.html new file mode 100644 index 0000000000..13b6794038 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/metrics.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.metrics - Performance Metrics

        +
        +
        +class cassandra.metrics.Metrics
        +

        A collection of timers and counters for various performance metrics.

        +

        Timer metrics are represented as floating point seconds.

        +
        +
        +request_timer = None
        +

        A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

        +
          +
        • count - number of requests that have been timed

        • +
        • min - min latency

        • +
        • max - max latency

        • +
        • mean - mean latency

        • +
        • stddev - standard deviation for latencies

        • +
        • median - median latency

        • +
        • 75percentile - 75th percentile latencies

        • +
        • 95percentile - 95th percentile latencies

        • +
        • 98percentile - 98th percentile latencies

        • +
        • 99percentile - 99th percentile latencies

        • +
        • 999percentile - 99.9th percentile latencies

        • +
        +
        + +
        +
        +connection_errors = None
        +

        A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

        +
        + +
        +
        +write_timeouts = None
        +

        A greplin.scales.IntStat count of write requests that resulted +in a timeout.

        +
        + +
        +
        +read_timeouts = None
        +

        A greplin.scales.IntStat count of read requests that resulted +in a timeout.

        +
        + +
        +
        +unavailables = None
        +

        A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

        +
        + +
        +
        +other_errors = None
        +

        A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

        +
        + +
        +
        +retries = None
        +

        A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

        +
        + +
        +
        +ignores = None
        +

        A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

        +
        + +
        +
        +known_hosts = None
        +

        A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

        +
        + +
        +
        +connected_to = None
        +

        A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

        +
        + +
        +
        +open_connections = None
        +

        A greplin.scales.IntStat count of the number connections +the driver currently has open.

        +
        + +
        +
        +get_stats()
        +

        Returns the metrics for the registered cluster instance.

        +
        + +
        +
        +set_stats_name(stats_name)
        +

        Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/policies.html b/3.22.3-scylla/api/cassandra/policies.html new file mode 100644 index 0000000000..1d07325003 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/policies.html @@ -0,0 +1,1880 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.policies - Load balancing and Failure Handling Policies

        +
        +

        Load Balancing

        +
        +
        +class cassandra.policies.HostDistance
        +

        A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

        +
        +
        +IGNORED = -1
        +

        A node with this distance should never be queried or have +connections opened to it.

        +
        + +
        +
        +LOCAL = 0
        +

        Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

        +

        This distance is typically used for nodes within the same +datacenter as the client.

        +
        + +
        +
        +REMOTE = 1
        +

        Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

        +

        This distance is typically used for nodes outside of the +datacenter that the client is running in.

        +
        + +
        + +
        +
        +class cassandra.policies.LoadBalancingPolicy
        +

        Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

        +

        In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

        +

        You may also use subclasses of LoadBalancingPolicy for +custom behavior.

        +
        +
        +distance(host)
        +

        Returns a measure of how remote a Host is in +terms of the HostDistance enums.

        +
        + +
        +
        +populate(cluster, hosts)
        +

        This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

        +
        + +
        +
        +make_query_plan(working_keyspace=None, query=None)
        +

        Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

        +

        Note that the query argument may be None when preparing +statements.

        +

        working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

        +
        + +
        +
        +check_supported()
        +

        This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

        +
        + +
        + +
        +
        +class cassandra.policies.RoundRobinPolicy
        +

        A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

        +
        +
        +populate(cluster, hosts)
        +

        This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

        +
        + +
        +
        +distance(host)
        +

        Returns a measure of how remote a Host is in +terms of the HostDistance enums.

        +
        + +
        +
        +make_query_plan(working_keyspace=None, query=None)
        +

        Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

        +

        Note that the query argument may be None when preparing +statements.

        +

        working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

        +
        + +
        +
        +on_up(host)
        +

        Called when a node is marked up.

        +
        + +
        +
        +on_down(host)
        +

        Called when a node is marked down.

        +
        + +
        +
        +on_add(host)
        +

        Called when a node is added to the cluster. The newly added node +should be considered up.

        +
        + +
        +
        +on_remove(host)
        +

        Called when a node is removed from the cluster.

        +
        + +
        + +
        +
        +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
        +

        Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

        +

        The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

        +

        used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

        +
        +
        +populate(cluster, hosts)
        +

        This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

        +
        + +
        +
        +distance(host)
        +

        Returns a measure of how remote a Host is in +terms of the HostDistance enums.

        +
        + +
        +
        +make_query_plan(working_keyspace=None, query=None)
        +

        Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

        +

        Note that the query argument may be None when preparing +statements.

        +

        working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

        +
        + +
        +
        +on_up(host)
        +

        Called when a node is marked up.

        +
        + +
        +
        +on_down(host)
        +

        Called when a node is marked down.

        +
        + +
        +
        +on_add(host)
        +

        Called when a node is added to the cluster. The newly added node +should be considered up.

        +
        + +
        +
        +on_remove(host)
        +

        Called when a node is removed from the cluster.

        +
        + +
        + +
        +
        +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
        +

        A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

        +

        This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

        +

        The hosts parameter should be a sequence of hosts to permit +connections to.

        +
        +
        +populate(cluster, hosts)
        +

        This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

        +
        + +
        +
        +distance(host)
        +

        Returns a measure of how remote a Host is in +terms of the HostDistance enums.

        +
        + +
        +
        +on_up(host)
        +

        Called when a node is marked up.

        +
        + +
        +
        +on_add(host)
        +

        Called when a node is added to the cluster. The newly added node +should be considered up.

        +
        + +
        + +
        +
        +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
        +

        A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

        +

        This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

        +

        If no routing_key is set on the query, the child +policy’s query plan will be used as is.

        +
        +
        +shuffle_replicas = False
        +

        Yield local replicas in a random order.

        +
        + +
        +
        +populate(cluster, hosts)
        +

        This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

        +
        + +
        +
        +check_supported()
        +

        This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

        +
        + +
        +
        +distance(*args, **kwargs)
        +

        Returns a measure of how remote a Host is in +terms of the HostDistance enums.

        +
        + +
        +
        +make_query_plan(working_keyspace=None, query=None)
        +

        Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

        +

        Note that the query argument may be None when preparing +statements.

        +

        working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

        +
        + +
        +
        +on_up(*args, **kwargs)
        +

        Called when a node is marked up.

        +
        + +
        +
        +on_down(*args, **kwargs)
        +

        Called when a node is marked down.

        +
        + +
        +
        +on_add(*args, **kwargs)
        +

        Called when a node is added to the cluster. The newly added node +should be considered up.

        +
        + +
        +
        +on_remove(*args, **kwargs)
        +

        Called when a node is removed from the cluster.

        +
        + +
        + +
        +
        +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
        +

        A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

        +

        This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

        +
        def address_is_ignored(host):
        +    return host.address in [ignored_address0, ignored_address1]
        +
        +blacklist_filter_policy = HostFilterPolicy(
        +    child_policy=RoundRobinPolicy(),
        +    predicate=address_is_ignored
        +)
        +
        +cluster = Cluster(
        +    primary_host,
        +    load_balancing_policy=blacklist_filter_policy,
        +)
        +
        +
        +

        See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

        +

        Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

        +
        +
        Parameters:
        +
          +
        • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

        • +
        • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

        • +
        +
        +
        +
        +
        +predicate(host)
        +

        A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

        +

        This is a read-only value set in __init__, implemented as a +property.

        +
        + +
        +
        +distance(host)
        +

        Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

        +
        + +
        +
        +make_query_plan(working_keyspace=None, query=None)
        +

        Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

        +

        Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

        +
        + +
        + +
        +
        +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
        +

        A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

        +

        If no host is set on the query, the child policy’s query plan will be used as is.

        +
        +
        +populate(cluster, hosts)
        +

        This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

        +
        + +
        +
        +make_query_plan(working_keyspace=None, query=None)
        +

        Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

        +

        Note that the query argument may be None when preparing +statements.

        +

        working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

        +
        + +
        + +
        +
        +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
        +

        Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

        +
        + +
        +
        +

        Translating Server Node Addresses

        +
        +
        +class cassandra.policies.AddressTranslator
        +

        Interface for translating cluster-defined endpoints.

        +

        The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

        +

        Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

        +
        +
        +translate(addr)
        +

        Accepts the node ip address, and returns a translated address to be used connecting to this node.

        +
        + +
        + +
        +
        +class cassandra.policies.IdentityTranslator
        +

        Returns the endpoint with no translation

        +
        +
        +translate(addr)
        +

        Accepts the node ip address, and returns a translated address to be used connecting to this node.

        +
        + +
        + +
        +
        +class cassandra.policies.EC2MultiRegionTranslator
        +

        Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

        +
        +
        +translate(addr)
        +

        Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

        +
        + +
        + +
        +
        +

        Marking Hosts Up or Down

        +
        +
        +class cassandra.policies.ConvictionPolicy(host)
        +

        A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

        +

        If custom behavior is needed, this class may be subclassed.

        +

        host is an instance of Host.

        +
        +
        +add_failure(connection_exc)
        +

        Implementations should return True if the host should be +convicted, False otherwise.

        +
        + +
        +
        +reset()
        +

        Implementations should clear out any convictions or state regarding +the host.

        +
        + +
        + +
        +
        +class cassandra.policies.SimpleConvictionPolicy(host)
        +

        The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

        +

        host is an instance of Host.

        +
        +
        +add_failure(connection_exc)
        +

        Implementations should return True if the host should be +convicted, False otherwise.

        +
        + +
        +
        +reset()
        +

        Implementations should clear out any convictions or state regarding +the host.

        +
        + +
        + +
        +
        +

        Reconnecting to Dead Hosts

        +
        +
        +class cassandra.policies.ReconnectionPolicy
        +

        This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

        +

        If custom behavior is needed, this class may be subclassed.

        +
        +
        +new_schedule()
        +

        This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

        +
        + +
        + +
        +
        +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
        +

        A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

        +

        delay should be a floating point number of seconds to wait inbetween +each attempt.

        +

        max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

        +
        +
        +new_schedule()
        +

        This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

        +
        + +
        + +
        +
        +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
        +

        A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

        +

        A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

        +

        base_delay and max_delay should be in floating point units of +seconds.

        +

        max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

        +
        +
        +new_schedule()
        +

        This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

        +
        + +
        + +
        +
        +

        Retrying Failed Operations

        +
        +
        +class cassandra.policies.WriteType
        +

        For usage with RetryPolicy, this describe a type +of write operation.

        +
        +
        +SIMPLE = 0
        +

        A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

        +
        + +
        +
        +BATCH = 1
        +

        A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

        +
        + +
        +
        +UNLOGGED_BATCH = 2
        +

        A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

        +
        + +
        +
        +COUNTER = 3
        +

        A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

        +
        + +
        +
        +BATCH_LOG = 4
        +

        The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

        +
        + +
        +
        +CAS = 5
        +

        A lighweight-transaction write, such as “DELETE … IF EXISTS”.

        +
        + +
        +
        +VIEW = 6
        +

        This WriteType is only seen in results for requests that were unable to +complete MV operations.

        +
        + +
        +
        +CDC = 7
        +

        This WriteType is only seen in results for requests that were unable to +complete CDC operations.

        +
        + +
        + +
        +
        +class cassandra.policies.RetryPolicy
        +

        A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

        +

        To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

        +

        To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

        +

        If custom behavior is needed for retrying certain operations, +this class may be subclassed.

        +
        +
        +RETRY = 0
        +

        This should be returned from the below methods if the operation +should be retried on the same connection.

        +
        + +
        +
        +RETHROW = 1
        +

        This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

        +
        + +
        +
        +IGNORE = 2
        +

        This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

        +
        + +
        +
        +RETRY_NEXT_HOST = 3
        +

        This should be returned from the below methods if the operation +should be retried on another connection.

        +
        + +
        +
        +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
        +

        This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

        +
        + +
        +
        +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
        +

        This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        write_type is one of the WriteType enums describing the +type of write operation.

        +

        The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

        +
        + +
        +
        +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
        +

        This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

        +

        query is the Statement that failed.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

        +
        + +
        +
        +on_request_error(query, consistency, error, retry_num)
        +

        This is called when an unexpected error happens. This can be in the +following situations:

        +
          +
        • On a connection error

        • +
        • On server errors: overloaded, isBootstrapping, serverError, etc.

        • +
        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        error the instance of the exception.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        The default, it triggers a retry on the next host in the query plan +with the same consistency level.

        +
        + +
        + +
        +
        +class cassandra.policies.FallthroughRetryPolicy
        +

        A retry policy that never retries and always propagates failures to +the application.

        +
        +
        +on_read_timeout(*args, **kwargs)
        +

        This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

        +
        + +
        +
        +on_write_timeout(*args, **kwargs)
        +

        This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        write_type is one of the WriteType enums describing the +type of write operation.

        +

        The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

        +
        + +
        +
        +on_unavailable(*args, **kwargs)
        +

        This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

        +

        query is the Statement that failed.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

        +
        + +
        +
        +on_request_error(*args, **kwargs)
        +

        This is called when an unexpected error happens. This can be in the +following situations:

        +
          +
        • On a connection error

        • +
        • On server errors: overloaded, isBootstrapping, serverError, etc.

        • +
        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        error the instance of the exception.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        The default, it triggers a retry on the next host in the query plan +with the same consistency level.

        +
        + +
        + +
        +
        +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
        +

        Deprecated: This retry policy will be removed in the next major release.

        +

        A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

        +

        BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

        +

        This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

        +
          +
        • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

        • +
        • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

        • +
        • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

        • +
        +

        The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

        +
          +
        • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

        • +
        • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

        • +
        +

        In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

        +
        +
        +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
        +

        This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

        +
        + +
        +
        +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
        +

        This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

        +

        query is the Statement that timed out.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        write_type is one of the WriteType enums describing the +type of write operation.

        +

        The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

        +
        + +
        +
        +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
        +

        This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

        +

        query is the Statement that failed.

        +

        consistency is the ConsistencyLevel that the operation was +attempted at.

        +

        required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

        +

        retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

        +

        By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

        +
        + +
        + +
        +
        +

        Retrying Idempotent Operations

        +
        +
        +class cassandra.policies.SpeculativeExecutionPolicy
        +

        Interface for specifying speculative execution plans

        +
        +
        +new_plan(keyspace, statement)
        +

        Returns

        +
        +
        Parameters:
        +
          +
        • keyspace

        • +
        • statement

        • +
        +
        +
        Returns:
        +

        +
        +
        +
        + +
        + +
        +
        +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
        +

        A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

        +
        +
        +new_plan(keyspace, statement)
        +

        Returns

        +
        +
        Parameters:
        +
          +
        • keyspace

        • +
        • statement

        • +
        +
        +
        Returns:
        +

        +
        +
        +
        + +
        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/pool.html b/3.22.3-scylla/api/cassandra/pool.html new file mode 100644 index 0000000000..e25f970069 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/pool.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.pool - Hosts and Connection Pools

        +

        Connection pooling and host management.

        +
        +
        +class cassandra.pool.Host
        +

        Represents a single Cassandra node.

        +
        +
        +property address
        +

        The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

        +
        + +
        +
        +property datacenter
        +

        The datacenter the node is in.

        +
        + +
        +
        +property rack
        +

        The rack the node is in.

        +
        + +
        + +
        +
        +exception cassandra.pool.NoConnectionsAvailable
        +

        All existing connections to a given host are busy, or there are +no open connections.

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/protocol.html b/3.22.3-scylla/api/cassandra/protocol.html new file mode 100644 index 0000000000..7c03a6450a --- /dev/null +++ b/3.22.3-scylla/api/cassandra/protocol.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.protocol - Protocol Features

        +
        +

        Custom Payloads

        +

        Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

        +

        By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

        +

        See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

        +
        +
        +class cassandra.protocol._ProtocolHandler
        +

        _ProtocolHander handles encoding and decoding messages.

        +

        This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

        +

        Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

        +
        +
        +message_types_by_opcode = {default mapping}
        +
        + +
        +
        +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
        +

        Encodes a message using the specified frame parameters, and compressor

        +
        +
        Parameters:
        +
          +
        • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

        • +
        • stream_id – protocol stream id for the frame header

        • +
        • protocol_version – version for the frame header, and used encoding contents

        • +
        • compressor – optional compression function to be used on the body

        • +
        +
        +
        +
        + +
        +
        +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
        +

        Decodes a native protocol message body

        +
        +
        Parameters:
        +
          +
        • protocol_version – version to use decoding contents

        • +
        • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

        • +
        • stream_id – native protocol stream id from the frame header

        • +
        • flags – native protocol flags bitmap from the header

        • +
        • opcode – native protocol opcode from the header

        • +
        • body – frame body

        • +
        • decompressor – optional decompression function to inflate the body

        • +
        +
        +
        Returns:
        +

        a message decoded from the body and frame attributes

        +
        +
        +
        + +
        + +
        +
        +

        Faster Deserialization

        +

        When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

        +
        from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
        +from cassandra.query import tuple_factory
        +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
        +s.row_factory = tuple_factory  #required for Numpy results
        +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
        +
        +
        +

        These protocol handlers comprise different parsers, and return results as described below:

        +
          +
        • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

        • +
        • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

        • +
        • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

        • +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/query.html b/3.22.3-scylla/api/cassandra/query.html new file mode 100644 index 0000000000..638a145727 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/query.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

        +
        +
        +cassandra.query.tuple_factory(colnames, rows)
        +

        Returns each row as a tuple

        +

        Example:

        +
        >>> from cassandra.query import tuple_factory
        +>>> session = cluster.connect('mykeyspace')
        +>>> session.row_factory = tuple_factory
        +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
        +>>> print rows[0]
        +('Bob', 42)
        +
        +
        +
        +

        Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

        +
        +
        + +
        +
        +cassandra.query.named_tuple_factory(colnames, rows)
        +

        Returns each row as a namedtuple. +This is the default row factory.

        +

        Example:

        +
        >>> from cassandra.query import named_tuple_factory
        +>>> session = cluster.connect('mykeyspace')
        +>>> session.row_factory = named_tuple_factory
        +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
        +>>> user = rows[0]
        +
        +>>> # you can access field by their name:
        +>>> print "name: %s, age: %d" % (user.name, user.age)
        +name: Bob, age: 42
        +
        +>>> # or you can access fields by their position (like a tuple)
        +>>> name, age = user
        +>>> print "name: %s, age: %d" % (name, age)
        +name: Bob, age: 42
        +>>> name = user[0]
        +>>> age = user[1]
        +>>> print "name: %s, age: %d" % (name, age)
        +name: Bob, age: 42
        +
        +
        +
        +

        Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

        +
        +
        + +
        +
        +cassandra.query.dict_factory(colnames, rows)
        +

        Returns each row as a dict.

        +

        Example:

        +
        >>> from cassandra.query import dict_factory
        +>>> session = cluster.connect('mykeyspace')
        +>>> session.row_factory = dict_factory
        +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
        +>>> print rows[0]
        +{u'age': 42, u'name': u'Bob'}
        +
        +
        +
        +

        Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

        +
        +
        + +
        +
        +cassandra.query.ordered_dict_factory(colnames, rows)
        +

        Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

        +
        +

        Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

        +
        +
        + +
        +
        +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
        +

        A simple, un-prepared query.

        +

        query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

        +

        See Statement attributes for a description of the other parameters.

        +
        + +
        +
        +class cassandra.query.PreparedStatement
        +

        A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

        +

        A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

        +

        A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

        +
        +
        +bind(values)
        +

        Creates and returns a BoundStatement instance using values.

        +

        See BoundStatement.bind() for rules on input values.

        +
        + +
        + +
        +
        +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
        +

        A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

        +

        prepared_statement should be an instance of PreparedStatement.

        +

        See Statement attributes for a description of the other parameters.

        +
        +
        +bind(values)
        +

        Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

        +
          +
        • a sequence, even if you are only binding one value, or

        • +
        • a dict that relates 1-to-1 between dict keys and columns

        • +
        +
        +

        Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

        +
          +
        • short sequences will be extended to match bind parameters with UNSET_VALUE

        • +
        • names may be omitted from a dict with UNSET_VALUE implied.

        • +
        +
        +
        +

        Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

        +
        +
        + +
        +
        +property routing_key
        +

        The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

        +

        If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

        +
        + +
        + +
        +
        +class cassandra.query.Statement
        +

        An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

        +
        +
        +property routing_key
        +

        The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

        +

        If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

        +
        + +
        +
        +property serial_consistency_level
        +

        The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

        +

        The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

        +

        The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

        +

        Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

        +

        See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

        +
        +

        New in version 2.0.0.

        +
        +
        + +
        + +
        +
        +cassandra.query.UNSET_VALUE
        +

        The base class of the class hierarchy.

        +

        When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

        +
        + +
        +
        +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
        +

        A protocol-level batch of operations which are applied atomically +by default.

        +
        +

        New in version 2.0.0.

        +
        +

        batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

        +

        retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

        +

        consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

        +

        custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

        +

        Example usage:

        +
        insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
        +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
        +
        +for (name, age) in users_to_insert:
        +    batch.add(insert_user, (name, age))
        +
        +session.execute(batch)
        +
        +
        +

        You can also mix different types of operations within a batch:

        +
        batch = BatchStatement()
        +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
        +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
        +session.execute(batch)
        +
        +
        +
        +

        New in version 2.0.0.

        +
        +
        +

        Changed in version 2.1.0: Added serial_consistency_level as a parameter

        +
        +
        +

        Changed in version 2.6.0: Added custom_payload as a parameter

        +
        +
        +
        +add(statement, parameters=None)
        +

        Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

        +

        Like with other statements, parameters must be a sequence, even +if there is only one item.

        +
        + +
        +
        +add_all(statements, parameters)
        +

        Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

        +
        + +
        +
        +clear()
        +

        This is a convenience method to clear a batch statement for reuse.

        +

        Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

        +
        + +
        +
        +serial_consistency_level = None
        +
        + +
        + +
        +
        +class cassandra.query.BatchType
        +

        A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

        +
        +

        New in version 2.0.0.

        +
        +
        +
        +LOGGED = BatchType.LOGGED
        +
        + +
        +
        +UNLOGGED = BatchType.UNLOGGED
        +
        + +
        +
        +COUNTER = BatchType.COUNTER
        +
        + +
        + +
        +
        +class cassandra.query.ValueSequence(iterable=(), /)
        +

        A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

        +

        This is typically needed when supplying a list of keys to select. +For example:

        +
        >>> my_user_ids = ('alice', 'bob', 'charles')
        +>>> query = "SELECT * FROM users WHERE user_id IN %s"
        +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
        +
        +
        +
        + +
        +
        +class cassandra.query.QueryTrace
        +

        A trace of the duration and events that occurred when executing +an operation.

        +
        +
        +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
        +

        Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

        +

        wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

        +

        query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

        +
        + +
        + +
        +
        +class cassandra.query.TraceEvent
        +

        Representation of a single event within a query trace.

        +
        + +
        +
        +exception cassandra.query.TraceUnavailable
        +

        Raised when complete trace details cannot be fetched from Cassandra.

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/timestamps.html b/3.22.3-scylla/api/cassandra/timestamps.html new file mode 100644 index 0000000000..5e39becd2c --- /dev/null +++ b/3.22.3-scylla/api/cassandra/timestamps.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.timestamps - Timestamp Generation

        +
        +
        +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
        +

        An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

        +
        +

        New in version 3.8.0.

        +
        +
        +
        +warn_on_drift = True
        +

        If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

        +
        + +
        +
        +warning_threshold = 1
        +

        This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

        +
        + +
        +
        +warning_interval = 1
        +

        This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

        +
        + +
        +
        +_next_timestamp(now, last)
        +

        Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

        +
        +
        Parameters:
        +
          +
        • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

        • +
        • last (int) – an integer representing the last timestamp returned by +this object

        • +
        +
        +
        +
        + +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/cassandra/util.html b/3.22.3-scylla/api/cassandra/util.html new file mode 100644 index 0000000000..7bd0de8580 --- /dev/null +++ b/3.22.3-scylla/api/cassandra/util.html @@ -0,0 +1,1082 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        cassandra.util - Utilities

        +
        +
        +class cassandra.util.Date(value)
        +

        Idealized date: year, month, day

        +

        Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

        +

        Initializer value can be:

        +
          +
        • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

        • +
        • datetime.date: built-in date

        • +
        • string_type: a string time of the form “yyyy-mm-dd”

        • +
        +
        +
        +date()
        +

        Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

        +

        ValueError is raised for Dates outside this range.

        +
        + +
        +
        +property seconds
        +

        Absolute seconds from epoch (can be negative)

        +
        + +
        + +
        +
        +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
        +

        DSE DateRange Type

        +
        +
        +lower_bound
        +

        DateRangeBound representing the lower bound of a bounded range.

        +
        + +
        +
        +upper_bound
        +

        DateRangeBound representing the upper bound of a bounded range.

        +
        + +
        +
        +value
        +

        DateRangeBound representing the value of a single-value range.

        +
        + +

        As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

        +
        +
        Parameters:
        +
        +
        +
        +
        + +
        +
        +class cassandra.util.DateRangeBound(value, precision)
        +

        Represents a single date value and its precision for DateRange.

        +
        +
        +milliseconds
        +

        Integer representing milliseconds since the UNIX epoch. May be negative.

        +
        + +
        +
        +precision
        +

        String representing the precision of a bound. Must be a valid +DateRangePrecision member.

        +
        + +

        DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

        +
        +
        Parameters:
        +
          +
        • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

        • +
        • precision – a string representing precision

        • +
        +
        +
        +
        +
        +datetime()
        +

        Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

        +
        + +
        +
        +classmethod from_value(value)
        +

        Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

        +
        +
        Parameters:
        +

        value – a dictlike or iterable object

        +
        +
        +
        + +
        + +
        +
        +class cassandra.util.DateRangePrecision
        +

        An “enum” representing the valid values for DateRange.precision.

        +
        + +
        +
        +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
        +

        Represents a Distance geometry for DSE

        +
        +
        +static from_wkt(s)
        +

        Parse a Distance geometry from a wkt string and return a new Distance object.

        +
        + +
        + +
        +
        +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
        +

        Cassandra Duration Type

        +
        + +
        +
        +class cassandra.util.LineString(coords=())
        +

        Represents a linestring geometry for DSE

        +

        ‘coords`: a sequence of (x, y) coordinates of points in the linestring

        +
        +
        +static from_wkt(s)
        +

        Parse a LineString geometry from a wkt string and return a new LineString object.

        +
        + +
        + +
        +
        +class cassandra.util.OrderedMap(*args, **kwargs)
        +

        An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

        +
        >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
        +...                  ({'three': 3, 'four': 4}, 'value2')])
        +>>> list(od.keys())
        +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
        +>>> list(od.values())
        +['value', 'value2']
        +
        +
        +

        These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

        +
        CREATE TABLE example (
        +    ...
        +    value map<frozen<map<int, int>>, double>
        +    ...
        +)
        +
        +
        +

        This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

        +
        + +
        +
        +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
        +
        + +
        +
        +class cassandra.util.Point(x=nan, y=nan)
        +

        Represents a point geometry for DSE

        +
        +
        +static from_wkt(s)
        +

        Parse a Point geometry from a wkt string and return a new Point object.

        +
        + +
        + +
        +
        +class cassandra.util.Polygon(exterior=(), interiors=None)
        +

        Represents a polygon geometry for DSE

        +

        ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

        +
        +
        +static from_wkt(s)
        +

        Parse a Polygon geometry from a wkt string and return a new Polygon object.

        +
        + +
        + +
        +
        +class cassandra.util.SortedSet(iterable=())
        +

        A sorted set based on sorted list

        +

        A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

        +

        #Not implemented: update functions, inplace operators

        +
        + +
        +
        +class cassandra.util.Time(value)
        +

        Idealized time, independent of day.

        +

        Up to nanosecond resolution

        +

        Initializer value can be:

        +
          +
        • integer_type: absolute nanoseconds in the day

        • +
        • datetime.time: built-in time

        • +
        • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

        • +
        +
        +
        +property hour
        +

        The hour component of this time (0-23)

        +
        + +
        +
        +property minute
        +

        The minute component of this time (0-59)

        +
        + +
        +
        +property nanosecond
        +

        The fractional seconds component of the time, in nanoseconds

        +
        + +
        +
        +property second
        +

        The second component of this time (0-59)

        +
        + +
        +
        +time()
        +

        Return a built-in datetime.time (nanosecond precision truncated to micros).

        +
        + +
        + +
        +
        +class cassandra.util.Version(version)
        +

        Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

        +

        TODO: when python2 support is removed, use packaging.version.

        +
        + +
        +
        +cassandra.util.datetime_from_timestamp(timestamp)
        +

        Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

        +
        +
        Parameters:
        +

        timestamp – a unix timestamp, in seconds

        +
        +
        +
        + +
        +
        +cassandra.util.datetime_from_uuid1(uuid_arg)
        +

        Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

        +
        +
        Parameters:
        +

        uuid_arg – a version 1 UUID

        +
        +
        +
        + +
        +
        +cassandra.util.max_uuid_from_time(timestamp)
        +

        Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

        +

        See uuid_from_time() for argument and return types.

        +
        + +
        +
        +cassandra.util.min_uuid_from_time(timestamp)
        +

        Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

        +

        See uuid_from_time() for argument and return types.

        +
        + +
        +
        +cassandra.util.ms_timestamp_from_datetime(dt)
        +

        Converts a datetime to a timestamp expressed in milliseconds.

        +
        +
        Parameters:
        +

        dt – a datetime.datetime

        +
        +
        +
        + +
        +
        +cassandra.util.sortedset
        +

        alias of SortedSet

        +
        + +
        +
        +cassandra.util.unix_time_from_uuid1(uuid_arg)
        +

        Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

        +
        +
        Parameters:
        +

        uuid_arg – a version 1 UUID

        +
        +
        +
        + +
        +
        +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
        +

        Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

        +

        Raises an OverflowError if the timestamp is out of range for +datetime.

        +
        +
        Parameters:
        +

        timestamp – timestamp, in milliseconds

        +
        +
        +
        + +
        +
        +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
        +

        Converts a datetime or timestamp to a type 1 uuid.UUID.

        +
        +
        Parameters:
        +
          +
        • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

        • +
        • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

        • +
        • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

        • +
        +
        +
        Return type:
        +

        uuid.UUID

        +
        +
        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/api/index.html b/3.22.3-scylla/api/index.html new file mode 100644 index 0000000000..b912536c79 --- /dev/null +++ b/3.22.3-scylla/api/index.html @@ -0,0 +1,872 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        API Documentation

        +
        +

        Core Driver

        +
        + +
        +
        +
        +

        Object Mapper

        + +
        +
        +

        DataStax Graph

        + +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/batches.html b/3.22.3-scylla/cqlengine/batches.html new file mode 100644 index 0000000000..0defd2ced0 --- /dev/null +++ b/3.22.3-scylla/cqlengine/batches.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Batch Queries

        +

        cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

        +
        +

        Batch Query General Use Pattern

        +

        You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

        +
        from cassandra.cqlengine.query import BatchQuery
        +
        +#using a context manager
        +with BatchQuery() as b:
        +    now = datetime.now()
        +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
        +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
        +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
        +
        +# -- or --
        +
        +#manually
        +b = BatchQuery()
        +now = datetime.now()
        +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
        +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
        +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
        +b.execute()
        +
        +# updating in a batch
        +
        +b = BatchQuery()
        +em1.description = "new description"
        +em1.batch(b).save()
        +em2.description = "another new description"
        +em2.batch(b).save()
        +b.execute()
        +
        +# deleting in a batch
        +b = BatchQuery()
        +ExampleModel.objects(id=some_id).batch(b).delete()
        +ExampleModel.objects(id=some_id2).batch(b).delete()
        +b.execute()
        +
        +
        +

        Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

        +
        with BatchQuery(execute_on_exception=True) as b:
        +    LogEntry.batch(b).create(k=1, v=1)
        +    mystery_function() # exception thrown in here
        +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
        +
        +
        +

        If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

        +
        +
        +

        Batch Query Execution Callbacks

        +

        In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

        +

        Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

        +

        The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

        +
        def my_callback(*args, **kwargs):
        +    pass
        +
        +batch = BatchQuery()
        +
        +batch.add_callback(my_callback)
        +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
        +
        +# if you need reference to the batch within the callback,
        +# just trap it in the arguments to be passed to the callback:
        +batch.add_callback(my_callback, cqlengine_batch=batch)
        +
        +# once the batch executes...
        +batch.execute()
        +
        +# the effect of the above scheduled callbacks will be similar to
        +my_callback()
        +my_callback('positional arg', named_arg='named arg value')
        +my_callback(cqlengine_batch=batch)
        +
        +
        +

        Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

        +
        +

        Logged vs Unlogged Batches

        +

        By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

        +
        from cassandra.cqlengine.query import BatchType
        +with BatchQuery(batch_type=BatchType.Unlogged) as b:
        +    LogEntry.batch(b).create(k=1, v=1)
        +    LogEntry.batch(b).create(k=1, v=2)
        +
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/connections.html b/3.22.3-scylla/cqlengine/connections.html new file mode 100644 index 0000000000..13677331e0 --- /dev/null +++ b/3.22.3-scylla/cqlengine/connections.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Connections

        +

        Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

        +
        +

        Register a new connection

        +

        To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

        +
        from cassandra.cqlengine import connection
        +
        +connection.setup(['127.0.0.1')
        +connection.register_connection('cluster2', ['127.0.0.2'])
        +
        +
        +

        register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

        +
        from cassandra.cqlengine import connection
        +from cassandra.cluster import Cluster
        +
        +session = Cluster(['127.0.0.1']).connect()
        +connection.register_connection('cluster3', session=session)
        +
        +
        +
        +
        +

        Change the default connection

        +

        You can change the default cqlengine connection on registration:

        +
        from cassandra.cqlengine import connection
        +
        +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
        +
        +
        +

        or on the fly using set_default_connection()

        +
        connection.set_default_connection('cluster2')
        +
        +
        +
        +
        +

        Unregister a connection

        +

        You can unregister a connection using unregister_connection():

        +
        connection.unregister_connection('cluster2')
        +
        +
        +
        +
        +

        Management

        +

        When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

        +
        from cassandra.cqlengine import management
        +
        +keyspaces = ['ks1', 'ks2']
        +conns = ['cluster1', 'cluster2']
        +
        +# registers your connections
        +# ...
        +
        +# create all keyspaces on all connections
        +for ks in keyspaces:
        +    management.create_simple_keyspace(ks, connections=conns)
        +
        +# define your Automobile model
        +# ...
        +
        +# sync your models
        +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
        +
        +
        +
        +
        +

        Connection Selection

        +

        cqlengine will select the default connection, unless your specify a connection using one of the following methods.

        +
        +

        Default Model Connection

        +

        You can specify a default connection per model:

        +
        class Automobile(Model):
        +    __keyspace__ = 'test'
        +    __connection__ = 'cluster2'
        +    manufacturer = columns.Text(primary_key=True)
        +    year = columns.Integer(primary_key=True)
        +    model = columns.Text(primary_key=True)
        +
        +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
        +
        +
        +
        +
        +

        QuerySet and model instance

        +

        You can use the using() method to select a connection (or keyspace):

        +
        Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
        +q = Automobile.objects.filter(manufacturer='Tesla')
        +autos = q.using(keyspace='ks2', connection='cluster2').all()
        +
        +for auto in autos:
        +    auto.using(connection='cluster1').save()
        +
        +
        +
        +
        +

        Context Manager

        +

        You can use the ContextQuery as well to select a connection:

        +
        with ContextQuery(Automobile, connection='cluster1') as A:
        +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
        +
        +
        +
        +
        +

        BatchQuery

        +

        With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

        +
        with BatchQuery(connection='cluster1') as b:
        +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
        +
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/faq.html b/3.22.3-scylla/cqlengine/faq.html new file mode 100644 index 0000000000..6961d1da07 --- /dev/null +++ b/3.22.3-scylla/cqlengine/faq.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Frequently Asked Questions

        +
        +

        Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

        +

        The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

        +
        +
        +

        How to preserve ordering in batch query?

        +

        Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

        +
          +
        • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

        • +
        • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

        • +
        • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

        • +
        +

        Below is an example to show this scenario.

        +
        class MyMode(Model):
        +    id    = columns.Integer(primary_key=True)
        +    count = columns.Integer()
        +    text  = columns.Text()
        +
        +with BatchQuery() as b:
        +   MyModel.batch(b).create(id=1, count=2, text='123')
        +   MyModel.batch(b).create(id=1, count=3, text='111')
        +
        +assert MyModel.objects(id=1).first().count == 3
        +assert MyModel.objects(id=1).first().text  == '123'
        +
        +
        +

        The largest value of count is 3, and the largest value of text would be ‘123’.

        +

        The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

        +
        with BatchQuery() as b:
        +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
        +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
        +
        +assert MyModel.objects(id=1).first().count == 3
        +assert MyModel.objects(id=1).first().text  == '111'
        +
        +
        +
        +
        +

        How can I delete individual values from a row?

        +

        When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

        +
        class MyModel(Model):
        +    id    = columns.Integer(primary_key=True)
        +    text  = columns.Text()
        +
        +m = MyModel.create(id=1, text='We can delete this with None')
        +assert MyModel.objects(id=1).first().text is not None
        +
        +m.update(text=None)
        +assert MyModel.objects(id=1).first().text is None
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/models.html b/3.22.3-scylla/cqlengine/models.html new file mode 100644 index 0000000000..2638c2c0bc --- /dev/null +++ b/3.22.3-scylla/cqlengine/models.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Models

        +

        A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

        +

        Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

        +

        Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

        +
        +

        Example Definitions

        +

        This example defines a Person table, with the columns first_name and last_name

        +
        from cassandra.cqlengine import columns
        +from cassandra.cqlengine.models import Model
        +
        + class Person(Model):
        +     id = columns.UUID(primary_key=True)
        +     first_name  = columns.Text()
        +     last_name = columns.Text()
        +
        +
        +

        The Person model would create this CQL table:

        +
        CREATE TABLE cqlengine.person (
        +    id uuid,
        +    first_name text,
        +    last_name text,
        +    PRIMARY KEY (id)
        +);
        +
        +
        +

        Here’s an example of a comment table created with clustering keys, in descending order:

        +
        from cassandra.cqlengine import columns
        +from cassandra.cqlengine.models import Model
        +
        +class Comment(Model):
        +    photo_id = columns.UUID(primary_key=True)
        +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
        +    comment = columns.Text()
        +
        +
        +

        The Comment model’s create table would look like the following:

        +
        CREATE TABLE comment (
        +  photo_id uuid,
        +  comment_id timeuuid,
        +  comment text,
        +  PRIMARY KEY (photo_id, comment_id)
        +) WITH CLUSTERING ORDER BY (comment_id DESC);
        +
        +
        +

        To sync the models to the database, you may do the following*:

        +
        from cassandra.cqlengine.management import sync_table
        +sync_table(Person)
        +sync_table(Comment)
        +
        +
        +

        *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

        +

        For examples on manipulating data and creating queries, see Making Queries

        +
        +
        +

        Manipulating model instances as dictionaries

        +

        Model instances can be accessed like dictionaries.

        +
        class Person(Model):
        +    first_name  = columns.Text()
        +    last_name = columns.Text()
        +
        +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
        +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
        +kevin['first_name']  # returns 'Kevin'
        +kevin.keys()  # returns ['first_name', 'last_name']
        +kevin.values()  # returns ['Kevin', 'Deldycke']
        +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
        +
        +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
        +
        +
        +
        +
        +

        Extending Model Validation

        +

        Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

        +

        However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

        +
        class Member(Model):
        +    person_id = UUID(primary_key=True)
        +    name = Text(required=True)
        +
        +    def validate(self):
        +        super(Member, self).validate()
        +        if self.name == 'jon':
        +            raise ValidationError('no jon\'s allowed')
        +
        +
        +

        Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

        +
        +
        +

        Model Inheritance

        +

        It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

        +

        For instance, suppose you want a table that stores rows of pets owned by an owner:

        +
        class Pet(Model):
        +    __table_name__ = 'pet'
        +    owner_id = UUID(primary_key=True)
        +    pet_id = UUID(primary_key=True)
        +    pet_type = Text(discriminator_column=True)
        +    name = Text()
        +
        +    def eat(self, food):
        +        pass
        +
        +    def sleep(self, time):
        +        pass
        +
        +class Cat(Pet):
        +    __discriminator_value__ = 'cat'
        +    cuteness = Float()
        +
        +    def tear_up_couch(self):
        +        pass
        +
        +class Dog(Pet):
        +    __discriminator_value__ = 'dog'
        +    fierceness = Float()
        +
        +    def bark_all_night(self):
        +        pass
        +
        +
        +

        After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

        +

        To setup a model structure with inheritance, follow these steps

        +
          +
        1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

        2. +
        3. Create subclass models, and define a unique __discriminator_value__ value on each

        4. +
        5. Run sync_table on each of the sub tables

        6. +
        +

        About the discriminator value

        +

        The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

        +
        +
        +

        User Defined Types

        +

        cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

        +
        from cassandra.cqlengine.columns import *
        +from cassandra.cqlengine.models import Model
        +from cassandra.cqlengine.usertype import UserType
        +
        +class address(UserType):
        +    street = Text()
        +    zipcode = Integer()
        +
        +class users(Model):
        +    __keyspace__ = 'account'
        +    name = Text(primary_key=True)
        +    addr = UserDefinedType(address)
        +
        +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
        +user = users.objects(name="Joe")[0]
        +print user.name, user.addr
        +# Joe address(street=u'Easy St.', zipcode=99999)
        +
        +
        +

        UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

        +

        sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

        +

        Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

        +

        *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/queryset.html b/3.22.3-scylla/cqlengine/queryset.html new file mode 100644 index 0000000000..dfe5be9413 --- /dev/null +++ b/3.22.3-scylla/cqlengine/queryset.html @@ -0,0 +1,996 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Making Queries

        +
        +

        Retrieving objects

        +

        Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

        +
        +

        Retrieving all objects

        +

        The simplest query you can make is to return all objects from a table.

        +

        This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

        +

        Using the Person example model, we would get all Person objects like this:

        +
        all_objects = Person.objects.all()
        +
        +
        +
        +
        +

        Retrieving objects with filters

        +

        Typically, you’ll want to query only a subset of the records in your database.

        +

        That can be accomplished with the QuerySet’s .filter(\*\*) method.

        +

        For example, given the model definition:

        +
        class Automobile(Model):
        +    manufacturer = columns.Text(primary_key=True)
        +    year = columns.Integer(primary_key=True)
        +    model = columns.Text()
        +    price = columns.Decimal()
        +    options = columns.Set(columns.Text)
        +
        +
        +

        …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +
        +
        +

        You can also use the more convenient syntax:

        +
        q = Automobile.objects(Automobile.manufacturer == 'Tesla')
        +
        +
        +

        We can then further filter our query with another call to .filter

        +
        q = q.filter(year=2012)
        +
        +
        +

        Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

        +
        +
        +
        +

        Accessing objects in a QuerySet

        +

        There are several methods for getting objects out of a queryset

        +
          +
        • +
          iterating over the queryset
          for car in Automobile.objects.all():
          +    #...do something to the car instance
          +    pass
          +
          +
          +
          +
          +
        • +
        • +
          list index
          q = Automobile.objects.all()
          +q[0] #returns the first result
          +q[1] #returns the second result
          +
          +
          +
          +

          Note

          +
            +
          • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

          • +
          • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

          • +
          +
          +
          +
          +
        • +
        • +
          list slicing
          q = Automobile.objects.all()
          +q[1:] #returns all results except the first
          +q[1:9] #returns a slice of the results
          +
          +
          +
          +

          Note

          +
            +
          • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

          • +
          • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

          • +
          +
          +
          +
          +
        • +
        • +
          calling get() on the queryset
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year=2012)
          +car = q.get()
          +
          +
          +

          this returns the object matching the queryset

          +
          +
          +
        • +
        • +
          calling first() on the queryset
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year=2012)
          +car = q.first()
          +
          +
          +

          this returns the first value in the queryset

          +
          +
          +
        • +
        +
        +
        +

        Filtering Operators

        +

        Equal To

        +

        The default filtering operator.

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year=2012)  #year == 2012
        +
        +
        +

        In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

        +

        in (__in)

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year__in=[2011, 2012])
        +
        +
        +

        > (__gt)

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year__gt=2010)  # year > 2010
        +
        +# or the nicer syntax
        +
        +q.filter(Automobile.year > 2010)
        +
        +
        +

        >= (__gte)

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year__gte=2010)  # year >= 2010
        +
        +# or the nicer syntax
        +
        +q.filter(Automobile.year >= 2010)
        +
        +
        +

        < (__lt)

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year__lt=2012)  # year < 2012
        +
        +# or...
        +
        +q.filter(Automobile.year < 2012)
        +
        +
        +

        <= (__lte)

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q = q.filter(year__lte=2012)  # year <= 2012
        +
        +q.filter(Automobile.year <= 2012)
        +
        +
        +

        CONTAINS (__contains)

        +

        The CONTAINS operator is available for all collection types (List, Set, Map).

        +
        q = Automobile.objects.filter(manufacturer='Tesla')
        +q.filter(options__contains='backup camera').allow_filtering()
        +
        +
        +

        Note that we need to use allow_filtering() since the options column has no secondary index.

        +

        LIKE (__like)

        +

        The LIKE operator is available for text columns that have a SASI secondary index.

        +
        q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
        +
        +
        +

        IS NOT NULL (IsNotNull(column_name))

        +

        The IS NOT NULL operator is not yet supported for C*.

        +
        q = Automobile.objects.filter(IsNotNull('model'))
        +
        +
        +

        Limitations:

        +
          +
        • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

        • +
        • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

        • +
        +
        +
        +

        TimeUUID Functions

        +

        In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

        +
        +
        +class cqlengine.queryset.MinTimeUUID(datetime)
        +

        returns the minimum time uuid value possible for the given datetime

        +
        + +
        +
        +class cqlengine.queryset.MaxTimeUUID(datetime)
        +

        returns the maximum time uuid value possible for the given datetime

        +
        + +

        Example

        +
        class DataStream(Model):
        +    id      = columns.UUID(partition_key=True)
        +    time    = columns.TimeUUID(primary_key=True)
        +    data    = columns.Bytes()
        +
        +min_time = datetime(1982, 1, 1)
        +max_time = datetime(1982, 3, 9)
        +
        +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
        +
        +
        +
        +
        +

        Token Function

        +

        Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

        +

        See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

        +

        Example

        +
        class Items(Model):
        +    id      = columns.Text(primary_key=True)
        +    data    = columns.Bytes()
        +
        +query = Items.objects.all().limit(10)
        +
        +first_page = list(query);
        +last = first_page[-1]
        +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
        +
        +
        +
        +
        +

        QuerySets are immutable

        +

        When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

        +

        Example

        +
        #this produces 3 different querysets
        +#q does not change after it's initial definition
        +q = Automobiles.objects.filter(year=2012)
        +tesla2012 = q.filter(manufacturer='Tesla')
        +honda2012 = q.filter(manufacturer='Honda')
        +
        +
        +
        +
        +

        Ordering QuerySets

        +

        Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

        +

        However, you can set a column to order on with the .order_by(column_name) method.

        +

        Example

        +
        #sort ascending
        +q = Automobiles.objects.all().order_by('year')
        +#sort descending
        +q = Automobiles.objects.all().order_by('-year')
        +
        +
        +

        Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

        +

        For instance, given our Automobile model, year is the only column we can order on.

        +
        +
        +

        Values Lists

        +

        There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

        +
        items = list(range(20))
        +random.shuffle(items)
        +for i in items:
        +    TestModel.create(id=1, clustering_key=i)
        +
        +values = list(TestModel.objects.values_list('clustering_key', flat=True))
        +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
        +
        +
        +
        +
        +

        Per Query Timeouts

        +

        By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

        +
        class Row(Model):
        +    id = columns.Integer(primary_key=True)
        +    name = columns.Text()
        +
        +
        +

        Fetch all objects with a timeout of 5 seconds

        +
        Row.objects().timeout(5).all()
        +
        +
        +

        Create a single row with a 50ms timeout

        +
        Row(id=1, name='Jon').timeout(0.05).create()
        +
        +
        +

        Delete a single row with no timeout

        +
        Row(id=1).timeout(None).delete()
        +
        +
        +

        Update a single row with no timeout

        +
        Row(id=1).timeout(None).update(name='Blake')
        +
        +
        +

        Batch query timeouts

        +
        with BatchQuery(timeout=10) as b:
        +    Row(id=1, name='Jon').create()
        +
        +
        +

        NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

        +
        +
        +

        Default TTL and Per Query TTL

        +

        Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

        +

        Example:

        +
        class User(Model):
        +    __options__ = {'default_time_to_live': 20}
        +
        +    user_id = columns.UUID(primary_key=True)
        +    ...
        +
        +
        +

        You can set TTL per-query if needed. Here are a some examples:

        +

        Example:

        +
        class User(Model):
        +    __options__ = {'default_time_to_live': 20}
        +
        +    user_id = columns.UUID(primary_key=True)
        +    ...
        +
        +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
        +
        +user.ttl(30).update(age=21)            # Update the TTL to 30
        +User.objects.ttl(10).create(user_id=1)  # TTL 10
        +User(user_id=1, age=21).ttl(10).save()  # TTL 10
        +
        +
        +
        +
        +

        Named Tables

        +

        Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

        +
        from cassandra.cqlengine.connection import setup
        +setup("127.0.0.1", "cqlengine_test")
        +
        +from cassandra.cqlengine.named import NamedTable
        +user = NamedTable("cqlengine_test", "user")
        +user.objects()
        +user.objects()[0]
        +
        +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/third_party.html b/3.22.3-scylla/cqlengine/third_party.html new file mode 100644 index 0000000000..617c84d481 --- /dev/null +++ b/3.22.3-scylla/cqlengine/third_party.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Third party integrations

        +
        +

        Celery

        +

        Here’s how, in substance, CQLengine can be plugged to Celery:

        +
        from celery import Celery
        +from celery.signals import worker_process_init, beat_init
        +from cassandra.cqlengine import connection
        +from cassandra.cqlengine.connection import (
        +    cluster as cql_cluster, session as cql_session)
        +
        +def cassandra_init(**kwargs):
        +    """ Initialize a clean Cassandra connection. """
        +    if cql_cluster is not None:
        +        cql_cluster.shutdown()
        +    if cql_session is not None:
        +        cql_session.shutdown()
        +    connection.setup()
        +
        +# Initialize worker context for both standard and periodic tasks.
        +worker_process_init.connect(cassandra_init)
        +beat_init.connect(cassandra_init)
        +
        +app = Celery()
        +
        +
        +
        +
        +

        uWSGI

        +

        This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

        +
        from cassandra.cqlengine import connection
        +from cassandra.cqlengine.connection import (
        +    cluster as cql_cluster, session as cql_session)
        +
        +try:
        +    from uwsgidecorators import postfork
        +except ImportError:
        +    # We're not in a uWSGI context, no need to hook Cassandra session
        +    # initialization to the postfork event.
        +    pass
        +else:
        +    @postfork
        +    def cassandra_init(**kwargs):
        +        """ Initialize a new Cassandra session in the context.
        +
        +        Ensures that a new session is returned for every new request.
        +        """
        +        if cql_cluster is not None:
        +            cql_cluster.shutdown()
        +        if cql_session is not None:
        +            cql_session.shutdown()
        +        connection.setup()
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/cqlengine/upgrade_guide.html b/3.22.3-scylla/cqlengine/upgrade_guide.html new file mode 100644 index 0000000000..6b32e34017 --- /dev/null +++ b/3.22.3-scylla/cqlengine/upgrade_guide.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Upgrade Guide

        +

        This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

        +

        THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

        +
        +

        Functional Changes

        +
        +

        List Prepend Reversing

        +

        Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

        +
        +
        +

        Date Column Type

        +

        The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

        +
        +
        +
        +

        Remove cqlengine

        +

        To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

        +

        The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

        +
        +
        +

        Organization

        +
        +

        Imports

        +

        cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

        +
        from cassandra.cqlengine import columns
        +
        +
        +

        is now:

        +
        from cassandra.cqlengine import columns
        +
        +
        +
        +
        +

        Package-Level Aliases

        +

        Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

        +

        Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

        +

        These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

        +
        +
        +

        Exceptions

        +

        The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

        + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Exception class

        New module

        CQLEngineException

        cassandra.cqlengine

        ModelException

        cassandra.cqlengine.models

        ValidationError

        cassandra.cqlengine

        UndefinedKeyspaceException

        cassandra.cqlengine.connection

        LWTException

        cassandra.cqlengine.query

        IfNotExistsWithCounterColumn

        cassandra.cqlengine.query

        +
        +
        +

        UnicodeMixin Consolidation

        +

        class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

        +
        +
        +
        +

        API Deprecations

        +

        This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

        +
        +

        Float/Double Overload

        +

        Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

        +
        +
        +

        Schema Management

        +

        cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

        + +

        cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

        +
        +
        +

        Model Inheritance

        +

        The names for class attributes controlling model inheritance are changing. Changes are as follows:

        + +

        The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

        +

        The example below shows a simple translation:

        +

        Before:

        +
        class Pet(Model):
        +    __table_name__ = 'pet'
        +    owner_id = UUID(primary_key=True)
        +    pet_id = UUID(primary_key=True)
        +    pet_type = Text(polymorphic_key=True)
        +    name = Text()
        +
        +class Cat(Pet):
        +    __polymorphic_key__ = 'cat'
        +
        +class Dog(Pet):
        +    __polymorphic_key__ = 'dog'
        +
        +
        +

        After:

        +
        class Pet(models.Model):
        +    __table_name__ = 'pet'
        +    owner_id = UUID(primary_key=True)
        +    pet_id = UUID(primary_key=True)
        +    pet_type = Text(discriminator_column=True)
        +    name = Text()
        +
        +class Cat(Pet):
        +    __discriminator_value__ = 'cat'
        +
        +class Dog(Pet):
        +    __discriminator_value__ = 'dog'
        +
        +
        +
        +
        +

        TimeUUID.from_datetime

        +

        This function is deprecated in favor of the core utility function uuid_from_time().

        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/dates_and_times.html b/3.22.3-scylla/dates_and_times.html new file mode 100644 index 0000000000..d154547c61 --- /dev/null +++ b/3.22.3-scylla/dates_and_times.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Working with Dates and Times

        +

        This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

        +
        +

        timestamps (Cassandra DateType)

        +

        Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

        +
        +

        Write Path

        +

        When inserting timestamps, the driver handles serialization for the write path as follows:

        +

        If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

        +
          +
        • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

        • +
        • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

        • +
        +

        Note the second point above applies even to “local” times created using now():

        +
        >>> d = datetime.now()
        +
        +>>> print(d.tzinfo)
        +None
        +
        +
        +

        These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

        +

        If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

        +
        +
        +

        Read Path

        +

        The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

        +

        The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

        +
        import pytz
        +user_tz = pytz.timezone('US/Central')
        +timestamp_naive = row.ts
        +timestamp_utc = pytz.utc.localize(timestamp_naive)
        +timestamp_presented = timestamp_utc.astimezone(user_tz)
        +
        +
        +

        This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

        +
        +
        +
        +

        date, time (Cassandra DateType)

        +

        Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

        +
        +

        Write Path

        +

        For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

        +

        For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

        +
        +
        +

        Read Path

        +

        The driver always returns custom types for date and time.

        +

        The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

        +

        The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/execution_profiles.html b/3.22.3-scylla/execution_profiles.html new file mode 100644 index 0000000000..241bf11a06 --- /dev/null +++ b/3.22.3-scylla/execution_profiles.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Execution Profiles

        +

        Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

        +

        The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

        +

        An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

        +

        This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

        +
        +

        Mapping Legacy Parameters to Profiles

        +

        Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

        + +

        When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

        +
        +
        +

        Using Execution Profiles

        +
        +

        Default

        +
        from cassandra.cluster import Cluster
        +cluster = Cluster()
        +session = cluster.connect()
        +local_query = 'SELECT rpc_address FROM system.local'
        +for _ in cluster.metadata.all_hosts():
        +    print session.execute(local_query)[0]
        +
        +
        +
        Row(rpc_address='127.0.0.2')
        +Row(rpc_address='127.0.0.1')
        +
        +
        +

        The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

        +
        +
        +

        Initializing cluster with profiles

        +
        from cassandra.cluster import ExecutionProfile
        +from cassandra.policies import WhiteListRoundRobinPolicy
        +
        +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
        +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
        +
        +profiles = {'node1': node1_profile, 'node2': node2_profile}
        +session = Cluster(execution_profiles=profiles).connect()
        +for _ in cluster.metadata.all_hosts():
        +    print session.execute(local_query, execution_profile='node1')[0]
        +
        +
        +
        Row(rpc_address='127.0.0.1')
        +Row(rpc_address='127.0.0.1')
        +
        +
        +
        for _ in cluster.metadata.all_hosts():
        +    print session.execute(local_query, execution_profile='node2')[0]
        +
        +
        +
        Row(rpc_address='127.0.0.2')
        +Row(rpc_address='127.0.0.2')
        +
        +
        +
        for _ in cluster.metadata.all_hosts():
        +    print session.execute(local_query)[0]
        +
        +
        +
        Row(rpc_address='127.0.0.2')
        +Row(rpc_address='127.0.0.1')
        +
        +
        +

        Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

        +
        from cassandra.cluster import EXEC_PROFILE_DEFAULT
        +profile = ExecutionProfile(request_timeout=30)
        +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
        +
        +
        +
        +
        +

        Adding named profiles

        +

        New profiles can be added constructing from scratch, or deriving from default:

        +
        locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
        +node1_profile = 'node1_whitelist'
        +cluster.add_execution_profile(node1_profile, locked_execution)
        +
        +for _ in cluster.metadata.all_hosts():
        +    print session.execute(local_query, execution_profile=node1_profile)[0]
        +
        +
        +
        Row(rpc_address='127.0.0.1')
        +Row(rpc_address='127.0.0.1')
        +
        +
        +

        See Cluster.add_execution_profile() for details and optional parameters.

        +
        +
        +

        Passing a profile instance without mapping

        +

        We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

        +
        from cassandra.query import tuple_factory
        +
        +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
        +
        +print session.execute(local_query, execution_profile=tmp)[0]
        +print session.execute(local_query, execution_profile='node1')[0]
        +
        +
        +
        ('127.0.0.1',)
        +Row(rpc_address='127.0.0.1')
        +
        +
        +

        The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/faq.html b/3.22.3-scylla/faq.html new file mode 100644 index 0000000000..b936ed1e5a --- /dev/null +++ b/3.22.3-scylla/faq.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Frequently Asked Questions

        +

        See also cqlengine FAQ

        +
        +

        Why do connections or IO operations timeout in my WSGI application?

        +

        Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

        +

        To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

        +
        from flask import Flask
        +from uwsgidecorators import postfork
        +from cassandra.cluster import Cluster
        +
        +session = None
        +prepared = None
        +
        +@postfork
        +def connect():
        +    global session, prepared
        +    session = Cluster().connect()
        +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
        +
        +app = Flask(__name__)
        +
        +@app.route('/')
        +def server_version():
        +    row = session.execute(prepared, ('local',))[0]
        +    return row.release_version
        +
        +
        +

        uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

        +
        +
        +

        How do I trace a request?

        +

        Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

        +
        >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
        +>>> result = future.result()
        +>>> trace = future.get_query_trace()
        +>>> for e in trace.events:
        +>>>     print e.source_elapsed, e.description
        +
        +0:00:00.000077 Parsing select * from system.local
        +0:00:00.000153 Preparing statement
        +0:00:00.000309 Computing ranges to query
        +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
        +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
        +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
        +0:00:00.000669 Read 1 live and 0 tombstone cells
        +0:00:00.000755 Scanned 1 rows and matched 1
        +
        +
        +

        trace is a QueryTrace object.

        +
        +
        +

        How do I determine the replicas for a query?

        +

        With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

        +
        >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
        +>>> bound = prepared.bind((1,))
        +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
        +>>> for h in replicas:
        +>>>   print h.address
        +127.0.0.1
        +127.0.0.2
        +
        +
        +

        replicas is a list of Host objects.

        +
        +
        +

        How does the driver manage request retries?

        +

        By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

        +

        Retries are presently attempted on the same coordinator, but this may change in the future.

        +

        Please see policies.RetryPolicy for further details.

        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/getting_started.html b/3.22.3-scylla/getting_started.html new file mode 100644 index 0000000000..b1b8474804 --- /dev/null +++ b/3.22.3-scylla/getting_started.html @@ -0,0 +1,1097 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Getting Started

        +

        First, make sure you have the driver properly installed.

        +
        +

        Connecting to Cassandra

        +

        Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

        +

        The simplest way to create a Cluster is like this: +First, make sure you have the Cassandra driver properly installed.

        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster()
        +
        +
        +

        This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
        +
        +
        +

        The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

        +

        If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

        +
        from cassandra.cluster import Cluster
        +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
        +
        +
        +

        Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

        +
        cluster = Cluster()
        +session = cluster.connect()
        +
        +
        +

        The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

        +
        cluster = Cluster()
        +session = cluster.connect('mykeyspace')
        +
        +
        +

        You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

        +
        session.set_keyspace('users')
        +# or you can do this instead
        +session.execute('USE users')
        +
        +
        +

        Profiles are passed in by execution_profiles dict.

        +

        In this case we can construct the base ExecutionProfile passing all attributes:

        +
        from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
        +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
        +from cassandra.query import tuple_factory
        +
        +profile = ExecutionProfile(
        +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
        +    retry_policy=DowngradingConsistencyRetryPolicy(),
        +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
        +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
        +    request_timeout=15,
        +    row_factory=tuple_factory
        +)
        +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
        +session = cluster.connect()
        +
        +print(session.execute("SELECT release_version FROM system.local").one())
        +
        +
        +

        Users are free to setup additional profiles to be used by name:

        +
        profile_long = ExecutionProfile(request_timeout=30)
        +cluster = Cluster(execution_profiles={'long': profile_long})
        +session = cluster.connect()
        +session.execute(statement, execution_profile='long')
        +
        +
        +

        Also, parameters passed to Session.execute or attached to Statements are still honored as before.

        +
        +
        +

        Executing Queries

        +

        Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

        +
        rows = session.execute('SELECT name, age, email FROM users')
        +for user_row in rows:
        +    print user_row.name, user_row.age, user_row.email
        +
        +
        +

        This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

        +

        By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

        +
        rows = session.execute('SELECT name, age, email FROM users')
        +for row in rows:
        +    print row.name, row.age, row.email
        +
        +
        +
        rows = session.execute('SELECT name, age, email FROM users')
        +for (name, age, email) in rows:
        +    print name, age, email
        +
        +
        +
        rows = session.execute('SELECT name, age, email FROM users')
        +for row in rows:
        +    print row[0], row[1], row[2]
        +
        +
        +

        If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

        +

        As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

        +
        +
        +

        Prepared Statements

        +

        Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

        +

        To prepare a query, use Session.prepare():

        +
        user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
        +
        +users = []
        +for user_id in user_ids_to_query:
        +    user = session.execute(user_lookup_stmt, [user_id])
        +    users.append(user)
        +
        +
        +

        prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

        +

        Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

        +
        +

        Passing Parameters to CQL Queries

        +

        Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

        +

        Positional parameters are used with a %s placeholder. For example, +when you execute:

        +
        session.execute(
        +    """
        +    INSERT INTO users (name, credits, user_id)
        +    VALUES (%s, %s, %s)
        +    """,
        +    ("John O'Reilly", 42, uuid.uuid1())
        +)
        +
        +
        +

        It is translated to the following CQL query:

        +
        INSERT INTO users (name, credits, user_id)
        +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
        +
        +
        +

        Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

        +
        session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
        +
        +
        +

        Instead, use %s for the age placeholder.

        +

        If you need to use a literal % character, use %%.

        +

        Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

        +
        session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
        +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
        +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
        +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
        +
        +
        +

        Note that the second line is incorrect because in Python, single-element tuples +require a comma.

        +

        Named place-holders use the %(name)s form:

        +
        session.execute(
        +    """
        +    INSERT INTO users (name, credits, user_id, username)
        +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
        +    """,
        +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
        +)
        +
        +
        +

        Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

        +

        Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

        +
        +
        +

        Type Conversions

        +

        For non-prepared statements, Python types are cast to CQL literals in the +following way:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Python Type

        CQL Literal Type

        None

        NULL

        bool

        boolean

        float

        +
        float
        +
        double
        +
        +
        +
        int
        +
        long
        +
        +
        +
        int
        +
        bigint
        +
        varint
        +
        smallint
        +
        tinyint
        +
        counter
        +
        +

        decimal.Decimal

        decimal

        +
        str
        +
        unicode
        +
        +
        +
        ascii
        +
        varchar
        +
        text
        +
        +
        +
        buffer
        +
        bytearray
        +
        +

        blob

        date

        date

        datetime

        timestamp

        time

        time

        +
        list
        +
        tuple
        +
        generator
        +
        +

        list

        +
        set
        +
        frozenset
        +
        +

        set

        +
        dict
        +
        OrderedDict
        +
        +

        map

        uuid.UUID

        +
        timeuuid
        +
        uuid
        +
        +
        +
        +
        +

        Asynchronous Queries

        +

        The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

        +

        The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

        +
        from cassandra import ReadTimeout
        +
        +query = "SELECT * FROM users WHERE user_id=%s"
        +future = session.execute_async(query, [user_id])
        +
        +# ... do some other work
        +
        +try:
        +    rows = future.result()
        +    user = rows[0]
        +    print user.name, user.age
        +except ReadTimeout:
        +    log.exception("Query timed out:")
        +
        +
        +

        This works well for executing many queries concurrently:

        +
        # build a list of futures
        +futures = []
        +query = "SELECT * FROM users WHERE user_id=%s"
        +for user_id in ids_to_fetch:
        +    futures.append(session.execute_async(query, [user_id])
        +
        +# wait for them to complete and use the results
        +for future in futures:
        +    rows = future.result()
        +    print rows[0].name
        +
        +
        +

        Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

        +
        def handle_success(rows):
        +    user = rows[0]
        +    try:
        +        process_user(user.name, user.age, user.id)
        +    except Exception:
        +        log.error("Failed to process user %s", user.id)
        +        # don't re-raise errors in the callback
        +
        +def handle_error(exception):
        +    log.error("Failed to fetch user info: %s", exception)
        +
        +
        +future = session.execute_async(query)
        +future.add_callbacks(handle_success, handle_error)
        +
        +
        +
        +
        There are a few important things to remember when working with callbacks:
          +
        • Exceptions that are raised inside the callback functions will be logged and then ignored.

        • +
        • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

        • +
        +
        +
        +
        +
        +
        +

        Setting a Consistency Level

        +

        The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

        +

        By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

        +
        from cassandra import ConsistencyLevel
        +from cassandra.query import SimpleStatement
        +
        +query = SimpleStatement(
        +    "INSERT INTO users (name, age) VALUES (%s, %s)",
        +    consistency_level=ConsistencyLevel.QUORUM)
        +session.execute(query, ('John', 42))
        +
        +
        +
        +

        Setting a Consistency Level with Prepared Statements

        +

        To specify a consistency level for prepared statements, you have two options.

        +

        The first is to set a default consistency level for every execution of the +prepared statement:

        +
        from cassandra import ConsistencyLevel
        +
        +cluster = Cluster()
        +session = cluster.connect("mykeyspace")
        +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
        +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
        +
        +# these will both use QUORUM
        +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
        +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
        +
        +
        +

        The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

        +
        # override the QUORUM default
        +user3_lookup = user_lookup_stmt.bind([user_id3])
        +user3_lookup.consistency_level = ConsistencyLevel.ALL
        +user3 = session.execute(user3_lookup)
        +
        +
        +
        +
        +

        Speculative Execution

        +

        Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

        +

        To enable speculative execution:

        +
          +
        • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

        • +
        • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

        • +
        +

        Example:

        +
        from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
        +from cassandra.policies import ConstantSpeculativeExecutionPolicy
        +from cassandra.query import SimpleStatement
        +
        +# Configure the speculative execution policy
        +ep = ExecutionProfile(
        +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
        +)
        +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
        +session = cluster.connect()
        +
        +# Mark the query idempotent
        +query = SimpleStatement(
        +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
        +    is_idempotent=True
        +)
        +
        +# Execute. A new query will be sent to the server every 0.5 second
        +# until we receive a response, for a max number attempts of 10.
        +session.execute(query)
        +
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/index.html b/3.22.3-scylla/index.html new file mode 100644 index 0000000000..5c2a8fa9ad --- /dev/null +++ b/3.22.3-scylla/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Python Driver for Scylla and Apache Cassandra®

        +

        A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

        +

        The driver supports Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8.

        +

        This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

        +

        Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

        +
        +

        Contents

        +
        +
        Installation

        How to install the driver.

        +
        +
        Getting Started

        A guide through the first steps of connecting to Scylla and executing queries

        +
        +
        Scylla Specific Features

        A list of feature available only on scylla-driver

        +
        +
        Execution Profiles

        An introduction to a more flexible way of configuring request execution

        +
        +
        Lightweight Transactions (Compare-and-set)

        Working with results of conditional requests

        +
        +
        Object Mapper

        Introduction to the integrated object mapper, cqlengine

        +
        +
        Performance Notes

        Tips for getting good performance.

        +
        +
        Paging Large Queries

        Notes on paging large query results

        +
        +
        Security

        An overview of the security features of the driver

        +
        +
        Upgrading

        A guide to upgrading versions of the driver

        +
        +
        User Defined Types

        Working with Scylla’s user-defined types (UDT)

        +
        +
        Working with Dates and Times

        Some discussion on the driver’s approach to working with timestamp, date, time types

        +
        +
        Scylla Cloud

        Connect to Scylla Cloud

        +
        +
        CHANGELOG

        Log of changes to the driver, organized by version.

        +
        +
        Frequently Asked Questions

        A collection of Frequently Asked Questions

        +
        +
        API Documentation

        The API documentation.

        +
        +
        +
        +
        +
        +
        +

        Getting Help

        +

        Visit the FAQ section in this documentation.

        +

        Please send questions to the Scylla user list.

        +
        +
        +

        Reporting Issues

        +

        Please report any bugs and make any feature requests on the Github project issues

        +
        + +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/installation.html b/3.22.3-scylla/installation.html new file mode 100644 index 0000000000..8b2c94c536 --- /dev/null +++ b/3.22.3-scylla/installation.html @@ -0,0 +1,860 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Installation

        +
        +

        Supported Platforms

        +

        Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

        +

        Linux, OSX, and Windows are supported.

        +
        +
        +

        Installation through pip

        +

        pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

        +
        pip install scylla-driver
        +
        +
        +

        You can use pip install --pre scylla-driver if you need to install a beta version.

        +

        *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

        +
        +
        +

        Verifying your Installation

        +

        To check if the installation was successful, you can run:

        +
        python -c 'import cassandra; print cassandra.__version__'
        +
        +
        +

        It should print something like “3.22.0”.

        +
        +
        +

        (Optional) DataStax Graph

        +

        The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

        +
        pip install scylla-driver[graph]
        +
        +
        +

        See graph_fluent for more details about this API.

        +
        +
        +

        (Optional) Compression Support

        +

        Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

        +

        For lz4 support:

        +
        pip install lz4
        +
        +
        +

        For snappy support:

        +
        pip install python-snappy
        +
        +
        +

        (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

        +
        +
        +

        (Optional) Metrics Support

        +

        The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

        +
        pip install scales
        +
        +
        +
        +

        Speeding Up Installation

        +

        By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

        +

        In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

        +
        $ # installing from source
        +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
        +$ # installing from pip
        +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
        +
        +
        +
        +
        +

        OSX Installation Error

        +

        If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

        +
        clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
        +
        +
        +

        To fix this, re-run the installation with an extra compilation flag:

        +
        ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
        +
        +
        +
        +
        +
        +

        Windows Installation Notes

        +

        Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

        +

        Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

        +

        It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

        +
        +
        +

        Manual Installation

        +

        You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

        +

        Once the dependencies are installed, simply run:

        +
        python setup.py install
        +
        +
        +
        +
        +

        (Optional) Non-python Dependencies

        +

        The driver has several optional features that have non-Python dependencies.

        +
        +

        C Extensions

        +

        By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

        +

        When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

        +

        To compile the extensions, ensure that GCC and the Python headers are available.

        +

        On Ubuntu and Debian, this can be accomplished by running:

        +
        $ sudo apt-get install gcc python-dev
        +
        +
        +

        On RedHat and RedHat-based systems like CentOS and Fedora:

        +
        $ sudo yum install gcc python-devel
        +
        +
        +

        On OS X, homebrew installations of Python should provide the necessary headers.

        +

        See Windows Installation Notes for notes on configuring the build environment on Windows.

        +
        +

        Cython-based Extensions

        +

        By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

        +

        This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

        +
        python setup.py install --no-cython
        +
        +
        +

        Alternatively, an environment variable can be used to switch this option regardless of +context:

        +
        CASS_DRIVER_NO_CYTHON=1 <your script here>
        +- or, to disable all extensions:
        +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
        +
        +
        +

        This method is required when using pip, which provides no other way of injecting user options in a single command:

        +
        CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
        +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
        +
        +
        +

        The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

        +

        If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

        +
        sudo pip install six futures
        +sudo pip install --install-option="--no-cython"
        +
        +
        +
        +
        +
        +

        libev support

        +

        The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

        +

        If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

        +
        $ sudo apt-get install libev4 libev-dev
        +
        +
        +

        On RHEL/CentOS/Fedora:

        +
        $ sudo yum install libev libev-devel
        +
        +
        +

        If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

        +
        $ brew install libev
        +
        +
        +

        The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

        +

        If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

        +
        >>> from cassandra.io.libevreactor import LibevConnection
        +>>> from cassandra.cluster import Cluster
        +
        +>>> cluster = Cluster()
        +>>> cluster.connection_class = LibevConnection
        +>>> session = cluster.connect()
        +
        +
        +
        +
        +
        +

        (Optional) Configuring SSL

        +

        Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/lwt.html b/3.22.3-scylla/lwt.html new file mode 100644 index 0000000000..9a2047db15 --- /dev/null +++ b/3.22.3-scylla/lwt.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Lightweight Transactions (Compare-and-set)

        +

        Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

        +

        For pertinent execution parameters, see Statement.serial_consistency_level.

        +

        This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

        +
        +

        Specialized Results

        +

        The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

        +

        The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

        +
          +
        • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

        • +
        • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

        • +
        • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

        • +
        +

        How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

        +
        CREATE TABLE test.t (
        +    k int PRIMARY KEY,
        +    v int,
        +    x int
        +)
        +
        +
        +

        … the following sections show the expected result for a number of example statements, using the three base row factories.

        +
        +

        named_tuple_factory (default)

        +

        The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

        +
        >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
        +Row(applied=True)
        +
        +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
        +Row(applied=False, k=0, v=0, x=None)
        +
        +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
        +Row(applied=True)
        +
        +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
        +Row(applied=False, v=1, x=2)
        +
        +
        +
        +
        +

        tuple_factory

        +

        This return type does not refer to names, but the boolean value applied is always present in position 0:

        +
        >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
        +(True,)
        +
        +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
        +(False, 0, 0, None)
        +
        +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
        +(True,)
        +
        +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
        +(False, 1, 2)
        +
        +
        +
        +
        +

        dict_factory

        +

        The retuned dict contains the [applied] key:

        +
        >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
        +{u'[applied]': True}
        +
        +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
        +{u'x': 2, u'[applied]': False, u'v': 1}
        +
        +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
        +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
        +
        +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
        +{u'[applied]': True}
        +
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/object_mapper.html b/3.22.3-scylla/object_mapper.html new file mode 100644 index 0000000000..4c373c5573 --- /dev/null +++ b/3.22.3-scylla/object_mapper.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Object Mapper

        +

        cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

        +

        Jump to Getting Started

        +
        +

        Contents

        +
        +
        Upgrade Guide

        For migrating projects from legacy cqlengine, to the integrated product

        +
        +
        Models

        Examples defining models, and mapping them to tables

        +
        +
        Making Queries

        Overview of query sets and filtering

        +
        +
        Batch Queries

        Working with batch mutations

        +
        +
        Connections

        Working with multiple sessions

        +
        +
        API Documentation

        Index of API documentation

        +
        +
        Third party integrations

        High-level examples in Celery and uWSGI

        +
        +
        +

        Frequently Asked Questions

        +
        +
        +
        +
        +

        Getting Started

        +
        import uuid
        +from cassandra.cqlengine import columns
        +from cassandra.cqlengine import connection
        +from datetime import datetime
        +from cassandra.cqlengine.management import sync_table
        +from cassandra.cqlengine.models import Model
        +
        +#first, define a model
        +class ExampleModel(Model):
        +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
        +    example_type    = columns.Integer(index=True)
        +    created_at      = columns.DateTime()
        +    description     = columns.Text(required=False)
        +
        +#next, setup the connection to your cassandra server(s)...
        +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
        +# the list of hosts will be passed to create a Cluster() instance
        +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
        +
        +#...and create your CQL table
        +>>> sync_table(ExampleModel)
        +
        +#now we can create some rows:
        +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
        +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
        +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
        +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
        +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
        +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
        +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
        +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
        +
        +#and now we can run some queries against our table
        +>>> ExampleModel.objects.count()
        +8
        +>>> q = ExampleModel.objects(example_type=1)
        +>>> q.count()
        +4
        +>>> for instance in q:
        +>>>     print instance.description
        +example5
        +example6
        +example7
        +example8
        +
        +#here we are applying additional filtering to an existing query
        +#query objects are immutable, so calling filter returns a new
        +#query object
        +>>> q2 = q.filter(example_id=em5.example_id)
        +
        +>>> q2.count()
        +1
        +>>> for instance in q2:
        +>>>     print instance.description
        +example5
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/objects.inv b/3.22.3-scylla/objects.inv new file mode 100644 index 0000000000..1c085a62b6 Binary files /dev/null and b/3.22.3-scylla/objects.inv differ diff --git a/3.22.3-scylla/performance.html b/3.22.3-scylla/performance.html new file mode 100644 index 0000000000..cba8183239 --- /dev/null +++ b/3.22.3-scylla/performance.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Performance Notes

        +

        The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

        +

        Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

        +

        The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

        +

        Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

        +
        +

        PyPy

        +

        PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

        +
        +
        +

        Cython Extensions

        +

        Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

        +

        See Installation for details on controlling this build.

        +
        +
        +

        multiprocessing

        +

        All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

        +

        Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

        +

        For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/py-modindex.html b/3.22.3-scylla/py-modindex.html new file mode 100644 index 0000000000..227f4bd1eb --- /dev/null +++ b/3.22.3-scylla/py-modindex.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + + + +
        + + + + + +
        + + +
        +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/query_paging.html b/3.22.3-scylla/query_paging.html new file mode 100644 index 0000000000..915fc0b495 --- /dev/null +++ b/3.22.3-scylla/query_paging.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Paging Large Queries

        +

        Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

        +
        +

        Controlling the Page Size

        +

        By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

        +
        +
        +

        Handling Paged Results

        +

        Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

        +
        from cassandra.query import SimpleStatement
        +query = "SELECT * FROM users"  # users contains 100 rows
        +statement = SimpleStatement(query, fetch_size=10)
        +for user_row in session.execute(statement):
        +    process_user(user_row)
        +
        +
        +

        Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

        +

        If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

        +
        +
        +

        Handling Paged Results with Callbacks

        +

        If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

        +

        Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

        +
        class PagedResultHandler(object):
        +
        +    def __init__(self, future):
        +        self.error = None
        +        self.finished_event = Event()
        +        self.future = future
        +        self.future.add_callbacks(
        +            callback=self.handle_page,
        +            errback=self.handle_err)
        +
        +    def handle_page(self, rows):
        +        for row in rows:
        +            process_row(row)
        +
        +        if self.future.has_more_pages:
        +            self.future.start_fetching_next_page()
        +        else:
        +            self.finished_event.set()
        +
        +    def handle_error(self, exc):
        +        self.error = exc
        +        self.finished_event.set()
        +
        +future = session.execute_async("SELECT * FROM users")
        +handler = PagedResultHandler(future)
        +handler.finished_event.wait()
        +if handler.error:
        +    raise handler.error
        +
        +
        +
        +
        +

        Resume Paged Results

        +

        You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

        +
        from cassandra.query import SimpleStatement
        +query = "SELECT * FROM users"
        +statement = SimpleStatement(query, fetch_size=10)
        +results = session.execute(statement)
        +
        +# save the paging_state somewhere and return current results
        +web_session['paging_stage'] = results.paging_state
        +
        +
        +# resume the pagination sometime later...
        +statement = SimpleStatement(query, fetch_size=10)
        +ps = web_session['paging_state']
        +results = session.execute(statement, paging_state=ps)
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/scylla_cloud.html b/3.22.3-scylla/scylla_cloud.html new file mode 100644 index 0000000000..e9b2fdb96e --- /dev/null +++ b/3.22.3-scylla/scylla_cloud.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + Scylla Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Cloud

        +

        To connect to a Scylla Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/scylla_specific.html b/3.22.3-scylla/scylla_specific.html new file mode 100644 index 0000000000..75bf54d150 --- /dev/null +++ b/3.22.3-scylla/scylla_specific.html @@ -0,0 +1,711 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Specific Features

        +
        +

        Shard Awareness

        +

        scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

        +

        Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/protocol-extensions.md

        +

        For using it you only need to enable TokenAwarePolicy on the Cluster

        +
        from cassandra.cluster import Cluster
        +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
        +
        +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
        +
        +
        +
        +
        +

        New Cluster Helpers

        +
          +
        • cluster.is_shard_aware()

          +

          New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

          +
        • +
        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster()
        +session = cluster.connect()
        +
        +if cluster.is_shard_aware():
        +    print("connected to a scylla cluster")
        +
        +
        +
          +
        • cluster.shard_aware_stats()

          +

          New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

          +
        • +
        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster()
        +session = cluster.connect()
        +
        +stats = cluster.shard_aware_stats()
        +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
        +    print("successfully connected to all shards of all scylla nodes")
        +
        +
        +
        +
        +

        New Table Attributes

        +
          +
        • in_memory flag

          +

          New flag available on TableMetadata.options to indicate that it is an In Memory table

          +
        • +
        +
        +

        Note

        +

        in memory tables is a feature existing only in Scylla Enterprise

        +
        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster()
        +session = cluster.connect()
        +session.execute("""
        +    CREATE KEYSPACE IF NOT EXISTS keyspace1
        +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
        +""")
        +
        +session.execute("""
        +    CREATE TABLE IF NOT EXISTS keyspace1.standard1 (
        +        key blob PRIMARY KEY,
        +        "C0" blob
        +    ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'}
        +""")
        +
        +cluster.refresh_table_metadata("keyspace1", "standard1")
        +assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True
        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/search.html b/3.22.3-scylla/search.html new file mode 100644 index 0000000000..539c48b793 --- /dev/null +++ b/3.22.3-scylla/search.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + + + + + +
        + + + + + +
        + + +
        +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/searchindex.js b/3.22.3-scylla/searchindex.js new file mode 100644 index 0000000000..65b2113141 --- /dev/null +++ b/3.22.3-scylla/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third_party", "cqlengine/upgrade_guide", "dates_and_times", "execution_profiles", "faq", "getting_started", "index", "installation", "lwt", "object_mapper", "performance", "query_paging", "scylla_cloud", "scylla_specific", "security", "upgrading", "user_defined_types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third_party.rst", "cqlengine/upgrade_guide.rst", "dates_and_times.rst", "execution_profiles.rst", "faq.rst", "getting_started.rst", "index.rst", "installation.rst", "lwt.rst", "object_mapper.rst", "performance.rst", "query_paging.rst", "scylla_cloud.rst", "scylla_specific.rst", "security.rst", "upgrading.rst", "user_defined_types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "Scylla Cloud", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"februari": 0, "26": [0, 38], "2020": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 54, 55], "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 52, 53, 54], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 53, 54], "resultset": [0, 3, 33, 50, 54], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 53], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 53, 54, 55], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 53, 54, 55], "schema": [0, 3, 9, 30, 33, 37, 44, 54], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 53, 54], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 54, 55], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 52, 54, 55], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 52, 53, 54, 55], "788": 0, "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53], "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 53], "nativ": [0, 1, 15, 18, 29, 37, 45], "graph": [0, 3], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 54, 55], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 52], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 55], "1027": 0, "enabl": [0, 3, 10, 44, 52, 53, 54], "page": [0, 1, 3, 45, 51], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 54, 55], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 55], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 53, 54], "numer": [0, 41], "wrapper": [0, 27, 30], "ensur": [0, 3, 4, 9, 27, 39, 46, 53], "proper": [0, 39, 46], "definit": [0, 3, 6, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 53], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "deseri": [0, 15, 18, 33, 41], "1057": 0, "bulkset": 0, "1060": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 55], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 53, 54], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 52, 53, 54, 55], "classic": 0, "1090": 0, "core": [0, 3, 4, 38, 40, 46, 49], "1039": 0, "expos": [0, 31, 54], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 25, 26, 30, 32, 38, 45, 54], "1019": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 53, 54], "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "more": [0, 3, 4, 6, 9, 10, 25, 27, 29, 31, 38, 40, 42, 44, 45, 46, 49, 50, 53, 54], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 53], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 52, 53, 54], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 54, 55], "1205": 0, "januari": 0, "unifi": [0, 54], "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 54], "packag": [0, 2, 32, 41, 46, 48, 53, 54], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 52, 53, 54, 55], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 53], "twist": [0, 33, 44], "1161": 0, "cloud": [0, 3, 27, 45], "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "system": [0, 5, 25, 38, 42, 43, 44, 46, 54], "1048": 0, "flexibl": [0, 45], "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 54, 55], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 54], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 52, 55], "fluent": [0, 33, 46, 54], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 55], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 53, 55], "mismatch": 0, "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 53, 54, 55], "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "re": [0, 27, 30, 37, 38, 39, 44, 46, 53, 55], "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 54], "cqlengineexcept": [0, 40], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "1166": 0, "asyncio": [0, 33], "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "process": [0, 3, 4, 20, 43, 44, 46, 49, 53, 54], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 54], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 52, 53], "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "peer": [0, 5, 25], "1181": 0, "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55], "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 53], "certif": [0, 53], "hostnam": [0, 27, 53], "sslcontext": [0, 53], "check_hostnam": [0, 53], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 55], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 53, 54], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 54], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 53], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 53, 54, 55], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 53, 54, 55], "depend": [0, 2, 41, 43, 47, 49], "geomet": 0, "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 53], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 52, 53, 54, 55], "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "warn": [0, 1, 3, 31, 40, 54], "about": [0, 3, 25, 30, 37, 41, 44, 46, 53, 54], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 53, 54], "balanc": [0, 3, 33, 42, 54], "polici": [0, 3, 33, 42, 43, 44, 52, 54], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 44, 46, 48, 49, 51, 53, 55], "1177": 0, "keyword": [0, 3, 6, 7, 9, 10], "1122": 0, "publish": [0, 46, 53], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 54], "next": [0, 3, 21, 27, 42, 48, 50, 53], "major": [0, 27, 42, 53, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 53, 54], "defaultloadbalancingpolici": [0, 27, 54], "integr": [0, 29, 40, 41, 45, 46, 48, 54], "1047": 0, "profil": [0, 3, 4, 12, 14, 44, 45], "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 53, 54], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 52, 53, 54, 55], "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 54], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 53], "unknown": [0, 15, 18, 46, 54], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 53, 55], "819": 0, "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 52], "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 52, 55], "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 53, 55], "773": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "authprovid": [0, 2, 3, 33, 53], "transit": 0, "mode": 0, "831": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 53, 54], "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 53], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 54], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 54], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 53], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 53], "574": 0, "config": [0, 53], "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 52, 54], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 54], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 53], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 52], "avail": [0, 3, 10, 30, 38, 45, 46, 52, 54], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55], "runtimeerror": 0, "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 53], "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 54], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 53, 55], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 52, 53], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 53, 54], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 53, 54], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53], "caus": [0, 3, 10, 26, 37, 47], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 54], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 53, 54], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 54], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 54, 55], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 52, 53, 54], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "unexpectedli": 0, "709": 0, "socket": [0, 5, 53], "associ": [0, 3, 54], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46], "clean": [0, 39, 46, 54], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 53, 54], "shutdown": [0, 3, 39], "673": 0, "fqdn": [0, 53], "ip": [0, 3, 5, 27, 28, 44, 53], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 53, 54, 55], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 55], "t": [0, 9, 10, 31, 37, 38, 41, 43, 44, 47, 49, 53, 54, 55], "empti": [0, 2, 3, 25, 47], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "around": [0, 9, 32, 40, 41, 54], "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 54], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 53, 54], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 55], "789": 0, "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 53, 54], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 54, 55], "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 53, 54, 55], "v5": [0, 1], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 53], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 53, 54], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 53, 54, 55], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 53], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 54], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 48, 53, 54], "apollo": 0, "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 53], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 52], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44], "1009": 0, "deadlock": [0, 4], "drop": [0, 6, 8, 29], "heartbeat": 0, "whilst": 0, "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 53, 54], "flight": [0, 5], "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 54], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 53], "1044": 0, "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53], "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 52, 53, 54], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 54], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 54], "1023": 0, "param": [0, 4, 13], "log": [0, 3, 8, 27, 30, 31, 44, 45, 54], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 27, 33, 43, 46, 52], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 55], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 53, 54], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 55], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 54], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 54, 55], "1093": 0, "incorrect": [0, 44], "compact": [0, 9, 52], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 53], "1117": 0, "built": [0, 32, 42, 46, 49, 54], "sourc": [0, 3, 15, 18, 45, 46], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 52, 54], "doesn": [0, 31, 54], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45], "port": [0, 3, 5, 25, 44], "1127": 0, "invalid": [0, 1, 26, 30], "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 53, 55], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 53], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41], "1079": 0, "improv": [0, 1, 35, 49, 54], "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 53], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 53, 54], "1082": 0, "let": [0, 3, 54], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 53, 54], "sortedset": [0, 32, 33, 54], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 54], "1068": 0, "ssl_context": [0, 3, 44, 53], "995": 0, "encrypt": [0, 53], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 52, 53, 55], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 54, 55], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 54, 55], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 53], "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "bump": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 53], "releas": [0, 9, 27, 40, 42, 53, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 53, 54, 55], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 54], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 53], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 53, 54], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 52, 54], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 53, 55], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 53, 54], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 54], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 54], "1015": 0, "septemb": 0, "c": [0, 6, 12, 25, 27, 38, 53], "logic": [0, 37], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 44, 52, 54], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 53], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 53, 54], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 53, 54], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "asyncor": [0, 33, 46], "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 53], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 53], "loop": [0, 3, 4, 21, 33, 44, 46, 53], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 53, 54], "subclass": [0, 1, 2, 3, 27, 30, 37, 53], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "april": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 54], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 53, 54], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 53, 54, 55], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 54], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 52], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 54], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 52, 53], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 53, 54], "cassandra_vers": 0, "910": 0, "refactor": [0, 41], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 53, 54, 55], "kind": [0, 27, 54], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 54, 55], "915": 0, "authent": [0, 1, 3, 33], "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 55], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 53, 55], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 55], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 54, 55], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 55], "865": 0, "deprecationwarn": [0, 54], "846": 0, "example_mapp": 0, "py": [0, 46], "python3": 0, "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 53, 54], "execute_concurr": [0, 4, 33, 49], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 53], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 53], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 54], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 54], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 54, 55], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 54], "810": 0, "833": 0, "juli": 0, "24": [0, 3], "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 53, 54], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46, 52], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 54], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 53], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 53], "772": 0, "pool": [0, 1, 3, 33, 54], "739": 0, "murmur3": [0, 3, 46], "big": 0, "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 54], "785": 0, "25": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 53], "464": 0, "inupt": 0, "microsecond": [0, 31, 54], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "pr": 0, "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 52, 55], "705": 0, "get_query_trac": [0, 3, 43, 54], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 54], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44], "drain": 0, "734": 0, "resulset": 0, "trace": [0, 3, 33], "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 52, 54], "grow": 0, "720": 0, "size": [0, 3, 10, 54], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 52, 53, 54, 55], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 53], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "race": 0, "callback": [0, 3, 10, 44, 49, 53], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 54], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 52, 53], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "march": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 54], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 52], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 54], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 54], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 54], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 54], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 54], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 53, 54, 55], "lead": [0, 34, 49, 54], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "unabl": [0, 27, 46], "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 54, 55], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 53, 54], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 53, 54], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47, 52], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 53], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 54], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "replic": [0, 3, 8, 25, 40, 52], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 54], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 55], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 54], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 54], "stat": [0, 26, 52], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 54], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 53, 54], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 53, 54], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 54], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "alias": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 54], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "condit": [0, 1, 3, 8, 10, 30, 45], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 52], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "june": 0, "569": 0, "control": [0, 3, 4, 27, 30, 40, 49, 53], "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 53], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 52, 54, 55], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 54, 55], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 52, 53, 55], "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "compat": [0, 3, 18, 25, 33, 54], "434": 0, "unicodedecodeerror": 0, "unicod": [0, 17, 44], "bop": 0, "559": 0, "565": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 53, 54, 55], "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 52], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 54], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 53, 54], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 53, 54], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 53, 54], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 54], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 54, 55], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 53], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 54], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 53], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 52, 54], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 54], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 54], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 53], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 52], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53], "489": 0, "typo": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": 0, "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 54, 55], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 54], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55], "might": [0, 3, 30, 50, 53], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 53, 55], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 53, 54], "access": [0, 3, 9, 26, 30, 37, 44, 54], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 54], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 53, 54], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 53, 54, 55], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 53, 54], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28], "dc": [0, 3, 27, 54], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 54], "408": [0, 54], "400": [0, 54], "422": [0, 54], "292": [0, 54], "318": [0, 54], "368": [0, 54], "371": 0, "blist": 0, "soft": 0, "385": [0, 54], "local_quorum": [0, 1, 44], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44], "178": [0, 30, 54], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "well": [0, 27, 35, 44, 53], "pagedresult": [0, 50, 54], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "runtim": [0, 46, 49], "397": 0, "398": 0, "extens": [0, 3, 27, 41, 52], "file": [0, 40, 49, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 55], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 54], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 54], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 54], "round": [0, 27, 32], "341": 0, "sizeti": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55], "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 54], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 53], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 54], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 53], "patch": [0, 21, 22, 41, 53], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 53], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "23": [0, 32], "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 54], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 54], "243": 0, "kerbero": [0, 53], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 54], "192": [0, 3, 44], "stream": [0, 29], "set_keyspac": [0, 3, 27, 44, 55], "195": 0, "implicit": [0, 10, 54], "204": 0, "collis": 0, "sasl": [0, 2, 53], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 54], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 54], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 54], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27], "contact_point": [0, 3, 7, 27, 53], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 54], "88": 0, "constructor": [0, 3, 6, 38], "basi": [0, 54], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 52], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 53, 54], "use_client_timestamp": [0, 1, 3, 54], "overrid": [0, 3, 9, 15, 18, 42, 44, 54], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 55], "refer": [0, 10, 34, 40, 42, 47, 54], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 54], "libevreactor": [0, 3, 33, 46], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 54], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 53, 54, 55], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 54], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 53, 54, 55], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 53], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 53, 54, 55], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 53, 54], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 52], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 54], "help": [0, 38, 54], "done": [0, 3, 37, 41, 43, 53, 54], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 53, 54], "guarante": [0, 27, 30, 54], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 54, 55], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 53], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 52, 53, 54, 55], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 53, 54, 55], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 54], "left": [0, 3, 4, 9, 41, 54], "place": [0, 40, 44, 54], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 54], "dict_factori": [0, 3, 7, 16, 30, 33, 54], "ordered_dict_factori": [0, 3, 16, 30, 33, 54], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 53, 54, 55], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 54], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 54], "executor": 0, "becom": [0, 3, 8, 49, 54], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 53, 54], "lowercas": 0, "boolean": [0, 1, 6, 25, 27, 44, 47], "liter": [0, 15, 17, 18, 30, 41, 44, 54, 55], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 54], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 54, 55], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 53, 54], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 53, 54], "never": [0, 27, 34, 47, 49, 54], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 52, 54], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": [0, 54], "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 53, 54], "main": [0, 3, 53, 55], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 46, 49, 52, 53, 54], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 53, 54], "strong": 0, "garbag": [0, 54], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 54], "twice": 0, "had": [0, 40, 54], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 55], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 52], "parallel": 0, "sesssion": 0, "effort": [0, 40, 53], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 53], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 54], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 53], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 52], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 53], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 53], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 54, 55], "constant": [0, 53], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 54], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 53, 54], "ONE": [1, 3, 10, 40, 54], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 55], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 55], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 52, 53, 55], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 52, 55], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 45, 46, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 54, 55], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 55], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 53], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 54], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 52], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 54], "higher": [1, 3, 4, 30, 53, 54], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 54], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 53], "author": [1, 53], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 54], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "mechan": [2, 3, 27, 53], "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 53], "plaintextauthprovid": [2, 3, 33, 53, 54], "usernam": [2, 44, 53], "password": [2, 53], "passwordauthent": [2, 53], "auth_provid": [2, 3, 53], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 53], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 53, 54, 55], "servic": [2, 53], "someth": [2, 27, 37, 38, 46, 53], "qop": [2, 53], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 53], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 53], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "mutabl": 3, "load_balancing_polici": [3, 27, 42, 44, 52], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 53, 54], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 53], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 53, 55], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 53, 54], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50], "purpos": [3, 6], "register_user_typ": [3, 54, 55], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 53, 54], "whose": 3, "mykeyspac": [3, 30, 44, 54, 55], "street": [3, 11, 37, 54, 55], "zipcod": [3, 11, 37, 54, 55], "locat": [3, 40, 53, 55], "def": [3, 27, 34, 37, 39, 43, 44, 50, 53, 54, 55], "self": [3, 15, 18, 37, 50, 54, 55], "INTO": [3, 4, 30, 44, 47, 55], "st": [3, 37, 55], "78723": [3, 55], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 55], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 54], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 54], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 53], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": [3, 52], "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 53], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 54], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 54], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 55], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "appropri": [3, 37, 46, 53], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 54], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 53], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 53], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 53, 54], "placehold": [3, 15, 18, 30, 44, 55], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 53], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 54], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 55], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 53], "expir": 3, "exceed": [3, 4], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 54], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 53], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 53, 54], "backward": [3, 18, 25, 54], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 53], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 54, 55], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 54], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 53], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 53], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 52], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 53], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 53], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 52], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 52], "www": 6, "com": [6, 10, 52, 53], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 52], "durable_writ": 8, "simplestrategi": [8, 25, 52], "caution": [8, 37], "product": [8, 48, 53, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 53, 54], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 52, 55], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 54], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 53], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 54], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 54], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 54], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 53], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 53], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 53], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 54], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 54], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 54], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 53], "handle_fork": 20, "eventletconnect": [21, 33, 53], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 54], "twistedconnect": [24, 33, 53], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 54], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "options_map": 25, "replicationfactor": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 53], "pmfstat": 26, "latenc": [26, 44, 52], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 53], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 52], "evenli": 27, "what": [27, 30, 37, 41, 53, 54, 55], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 53], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 53], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 54], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 53, 54], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 53, 54], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 53], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 53], "silent": 27, "idea": 27, "best": [27, 44, 51, 53], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 53], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 53], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 54], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 53], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "asyncioreactor": 33, "eventletreactor": 33, "twistedreactor": [33, 53], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 53], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 52], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41, 54], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 53], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 53, 54], "presist": 37, "pattern": [37, 49], "joe": [37, 53], "99999": 37, "ll": [38, 53], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 53], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 54], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 52], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 54], "scylla": [38, 40, 46, 54], "21": [38, 54], "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "17": [38, 53], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45, 54], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 54], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 54], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 54], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": 42, "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 54, 55], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 53], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 55], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49], "handle_success": 44, "rememb": 44, "user1": [44, 53], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "secur": [45, 54], "upgrad": [45, 48, 53], "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 54], "reinstal": 46, "22": 46, "gremlinpython": 46, "abl": 46, "graph_fluent": 46, "snappi": 46, "ubuntu": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 53], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": 46, "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 53], "mussei": [46, 53], "thorough": [46, 53], "outcom": 47, "pertin": 47, "appear": 47, "reject": 47, "statu": [47, 52], "squar": 47, "bracket": 47, "AND": [47, 52], "retun": 47, "jump": 48, "migrat": [48, 54], "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 53], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "paging_stag": 50, "p": 50, "onward": 52, "scylladb": 52, "md": 52, "is_shard_awar": 52, "shard_aware_stat": 52, "shards_count": 52, "in_memori": 52, "enterpris": 52, "keyspace1": 52, "standard1": 52, "c0": 52, "inmemorycompactionstrategi": 52, "get_credenti": 53, "host_address": 53, "1234": 53, "wrap_socket": 53, "create_default_context": 53, "server_hostnam": 53, "keystor": 53, "intruct": 53, "cert": 53, "understand": 53, "demonstr": 53, "deploy": 53, "client_encryption_opt": 53, "keystore_password": 53, "mystorepass": 53, "require_client_auth": 53, "protocol_tlsv1": 53, "veri": 53, "verify_mod": 53, "cert_requir": 53, "load_verify_loc": 53, "rootca": 53, "crt": 53, "truststor": 53, "jk": 53, "truststore_password": 53, "pem": 53, "conf": 53, "gen_client_cert": 53, "eof": 53, "req": 53, "distinguished_nam": 53, "req_distinguished_nam": 53, "output_password": 53, "root_cert_pass": 53, "default_bit": 53, "2048": 53, "cert_countri": 53, "cert_org_nam": 53, "ou": 53, "cert_ou": 53, "cn": 53, "root": 53, "Then": 53, "openssl": 53, "newkei": 53, "rsa": 53, "keyout": 53, "csr": 53, "x509": 53, "root_ca_base_nam": 53, "cakei": 53, "passin": 53, "crt_sign": 53, "cert_valid": 53, "cacreateseri": 53, "load_cert_chain": 53, "certfil": 53, "keyfil": 53, "crypto": 53, "tlsv1_method": 53, "set_verifi": 53, "verify_p": 53, "lambda": 53, "_1": 53, "_2": 53, "_3": 53, "_4": 53, "use_certificate_fil": 53, "use_privatekey_fil": 53, "ca_cert": 53, "ssl_version": 53, "ssl_opt": 53, "my": 53, "cert_req": 53, "risen": 53, "advanc": 53, "dseplaintextauthprovid": 53, "act": 53, "permiss": 53, "grant": 53, "role": 53, "plain": 53, "authorization_id": 53, "ticket": 53, "kinit": 53, "offici": [53, 54], "fulli": 54, "benefit": 54, "dse_graph": 54, "swap": 54, "rework": 54, "mesh": 54, "afterward": 54, "got": 54, "row_list": 54, "first_result": 54, "variant": 54, "brought": 54, "overhaul": 54, "highlight": 54, "nomenclatur": 54, "keyspace_nam": 54, "031ebb0": 54, "refresh_": 54, "_metadata": 54, "419fcdf": 54, "submit_schema_refresh": 54, "574266d": 54, "cqltype": 54, "bb984ee": 54, "e16a073": 54, "cc94073": 54, "from_datetim": 54, "96489cc": 54, "a2d3a98": 54, "4bd5909": 54, "__polymorphic_": 54, "__discrimin": 54, "9d98c8e": 54, "79efe97": 54, "citi": 54, "zip": [54, 55], "though": 54, "notabl": 54, "simpler": 54, "unclean": 54, "tell": 55, "insert_stat": 55, "otherstuff": 55, "first_row": 55, "fine": 55, "unprepar": 55, "parameter": 55, "interpol": 55}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph": [[15, 3, 1, "", "Edge"], [15, 3, 1, "", "GraphOptions"], [15, 3, 1, "", "GraphProtocol"], [15, 3, 1, "", "GraphSON1Deserializer"], [15, 3, 1, "", "GraphSON1Serializer"], [15, 3, 1, "", "GraphSON2Reader"], [15, 3, 1, "", "Path"], [15, 3, 1, "", "Result"], [15, 3, 1, "", "SimpleGraphStatement"], [15, 3, 1, "", "Vertex"], [15, 3, 1, "", "VertexProperty"], [12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphProtocol": [[15, 2, 1, "", "GRAPHSON_1_0"], [15, 2, 1, "", "GRAPHSON_2_0"], [15, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph.GraphSON2Reader": [[15, 4, 1, "", "deserialize"], [15, 4, 1, "", "read"]], "cassandra.datastax.graph.Path": [[15, 2, 1, "", "labels"], [15, 2, 1, "", "objects"]], "cassandra.datastax.graph.Result": [[15, 4, 1, "", "as_edge"], [15, 4, 1, "", "as_path"], [15, 4, 1, "", "as_vertex"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.VertexProperty": [[15, 2, 1, "", "label"], [15, 2, 1, "", "properties"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 53, 54], "22": 0, "0": [0, 53, 54], "featur": [0, 29, 52, 54], "bug": 0, "fix": 0, "21": 0, "other": 0, "deprec": [0, 40, 54], "20": 0, "2": [0, 54], "1": [0, 54], "19": 0, "18": 0, "17": 0, "16": [0, 53], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 54], "x": [0, 54], "upgrad": [0, 40, 54], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 54], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 53, 54], "cluster": [3, 42, 52, 54], "session": [3, 54], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 54], "execut": [4, 34, 42, 44, 53, 54], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 54], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 54, 55], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 55], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38, 52], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 54], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 55], "user": [11, 37, 54, 55], "defin": [11, 37, 54, 55], "datastax": [12, 13, 14, 15, 33, 46], "graph": [12, 13, 14, 15, 18, 33, 46, 54], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 54], "format": 16, "encod": [17, 54], "non": [17, 46, 54], "prepar": [17, 30, 44, 54], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 53], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 53], "metadata": [25, 54], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 53], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 53, 54], "custom": [29, 53, 54], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 54], "trace": [30, 43, 54], "timestamp": [31, 41, 54], "gener": [31, 34], "api": [33, 40, 54], "document": 33, "core": 33, "driver": [33, 43, 45, 54], "mapper": [33, 48], "us": [34, 42, 54, 55], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 55], "new": [35, 52], "chang": [35, 40, 54], "default": [35, 38, 42, 47, 54], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 54], "work": [36, 41, 54], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 54], "delet": 36, "individu": 36, "exampl": [37, 53], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 54], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 54], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 54], "organ": 40, "import": [40, 54], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": 42, "legaci": 42, "paramet": [42, 44, 54], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 55], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 54], "specul": 44, "python": [45, 46], "scylla": [45, 51, 52], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 54], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 53], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": 46, "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 54], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 54], "configur": [46, 53], "ssl": [46, 53], "lightweight": [47, 54], "transact": [47, 54], "compar": 47, "special": 47, "result": [47, 50, 54], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 54], "larg": 50, "control": 50, "size": 50, "resum": 50, "cloud": 51, "specif": 52, "shard": 52, "awar": 52, "helper": 52, "attribut": 52, "secur": 53, "v1": 53, "No": 53, "ident": 53, "verif": 53, "client": [53, 54], "version": 53, "lower": 53, "dse": [53, 54], "unifi": 53, "proxi": 53, "login": 53, "modul": 54, "execute_async": 54, "now": 54, "local_on": 54, "normal": 54, "inform": 54, "attach": 54, "bind": 54, "ignor": 54, "extra": 54, "blist": 54, "soft": 54, "sever": 54, "v3": 54, "nativ": 54, "side": 54, "v2": 54, "automat": 54, "sasl": 54, "call": 54, "shutdown": 54, "udt": 55, "dict": 55, "them": 55}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Frequently Asked Questions": [[43, "frequently-asked-questions"], [36, "frequently-asked-questions"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "Model Inheritance": [[40, "model-inheritance"], [37, "model-inheritance"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "User Defined Types": [[37, "user-defined-types"], [55, "user-defined-types"]], "Execution Profiles": [[42, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "Registering a UDT": [[55, "registering-a-udt"]], "Map a Class to a UDT": [[55, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[55, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[55, "using-udts-without-registering-them"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "Contents": [[48, "contents"], [45, "contents"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Installation": [[46, "installation"], [54, "installation"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) DataStax Graph": [[46, "optional-datastax-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Upgrading": [[54, "upgrading"]], "Upgrading from dse-driver": [[54, "upgrading-from-dse-driver"]], "Import from the cassandra module": [[54, "import-from-the-cassandra-module"]], "dse-graph": [[54, "dse-graph"]], "Session.execute and Session.execute_async API": [[54, "session-execute-and-session-execute-async-api"]], "Deprecations": [[54, "deprecations"], [54, "id2"], [0, "deprecations"], [0, "id27"], [0, "id152"]], "Upgrading to 3.0": [[54, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[54, "default-consistency-is-now-local-one"]], "Execution API Updates": [[54, "execution-api-updates"]], "Result return normalization": [[54, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[54, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[54, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[54, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[54, "metadata-api-updates"]], "Several deprecated features are removed": [[54, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[54, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[54, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[54, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[54, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[54, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[54, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[54, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[54, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[54, "protocol-level-batch-statements"]], "SASL-based Authentication": [[54, "sasl-based-authentication"]], "Lightweight Transactions": [[54, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[54, "calling-cluster-shutdown"]], "Dependency Changes": [[54, "dependency-changes"]], "Scylla Cloud": [[51, "scylla-cloud"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "Scylla Specific Features": [[52, "scylla-specific-features"]], "Shard Awareness": [[52, "shard-awareness"]], "New Cluster Helpers": [[52, "new-cluster-helpers"]], "New Table Attributes": [[52, "new-table-attributes"]], "Security": [[53, "security"]], "Authentication": [[53, "authentication"]], "Custom Authenticators": [[53, "custom-authenticators"]], "Protocol v1 Authentication": [[53, "protocol-v1-authentication"]], "SSL": [[53, "ssl"]], "SSL with Twisted or Eventlet": [[53, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[53, "ssl-configuration-examples"]], "No identity verification": [[53, "no-identity-verification"]], "Client verifies server": [[53, "client-verifies-server"]], "Server verifies client": [[53, "server-verifies-client"]], "Server verifies client and client verifies server": [[53, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[53, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[53, "ssl-with-twisted"]], "DSE Authentication": [[53, "dse-authentication"]], "DSE Unified Authentication": [[53, "dse-unified-authentication"]], "Proxy Login": [[53, "proxy-login"]], "Proxy Execute": [[53, "proxy-execute"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "CHANGELOG": [[0, "changelog"]], "3.22.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id5"], [0, "id12"], [0, "id15"], [0, "id19"], [0, "id24"], [0, "id34"], [0, "id38"], [0, "id41"], [0, "id45"], [0, "id49"], [0, "id53"], [0, "id57"], [0, "id63"], [0, "id69"], [0, "id72"], [0, "id75"], [0, "id80"], [0, "id83"], [0, "id88"], [0, "id93"], [0, "id97"], [0, "id99"], [0, "id106"], [0, "id110"], [0, "id112"], [0, "id117"], [0, "id120"], [0, "id123"], [0, "id126"], [0, "id129"], [0, "id137"], [0, "id144"], [0, "id146"], [0, "id150"], [0, "id154"], [0, "id160"], [0, "id170"], [0, "id172"], [0, "id177"], [0, "id180"], [0, "id182"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id6"], [0, "id8"], [0, "id10"], [0, "id13"], [0, "id16"], [0, "id20"], [0, "id22"], [0, "id25"], [0, "id29"], [0, "id32"], [0, "id35"], [0, "id42"], [0, "id46"], [0, "id50"], [0, "id54"], [0, "id58"], [0, "id61"], [0, "id64"], [0, "id67"], [0, "id70"], [0, "id73"], [0, "id76"], [0, "id78"], [0, "id81"], [0, "id84"], [0, "id89"], [0, "id91"], [0, "id94"], [0, "id98"], [0, "id100"], [0, "id102"], [0, "id104"], [0, "id107"], [0, "id109"], [0, "id111"], [0, "id113"], [0, "id115"], [0, "id118"], [0, "id121"], [0, "id124"], [0, "id127"], [0, "id130"], [0, "id133"], [0, "id135"], [0, "id138"], [0, "id140"], [0, "id142"], [0, "id145"], [0, "id147"], [0, "id151"], [0, "id155"], [0, "id158"], [0, "id161"], [0, "id164"], [0, "id167"], [0, "id169"], [0, "id173"], [0, "id175"], [0, "id178"], [0, "id181"], [0, "id183"], [0, "id185"]], "3.21.0": [[0, "id2"]], "Others": [[0, "others"]], "Other": [[0, "other"], [0, "id17"], [0, "id26"], [0, "id30"], [0, "id36"], [0, "id39"], [0, "id43"], [0, "id47"], [0, "id51"], [0, "id55"], [0, "id59"], [0, "id65"], [0, "id95"], [0, "id131"], [0, "id136"], [0, "id148"], [0, "id156"], [0, "id162"], [0, "id165"], [0, "id168"], [0, "id171"], [0, "id174"], [0, "id176"], [0, "id179"], [0, "id184"]], "3.20.2": [[0, "id7"]], "3.20.1": [[0, "id9"]], "3.20.0": [[0, "id11"]], "3.19.0": [[0, "id14"]], "3.18.0": [[0, "id18"]], "3.17.1": [[0, "id21"]], "3.17.0": [[0, "id23"]], "3.16.0": [[0, "id28"]], "3.15.1": [[0, "id31"]], "3.15.0": [[0, "id33"]], "3.14.0": [[0, "id37"]], "3.13.0": [[0, "id40"]], "3.12.0": [[0, "id44"]], "3.11.0": [[0, "id48"]], "3.10.0": [[0, "id52"]], "3.9.0": [[0, "id56"]], "3.8.1": [[0, "id60"]], "3.8.0": [[0, "id62"]], "3.7.1": [[0, "id66"]], "3.7.0": [[0, "id68"]], "3.6.0": [[0, "id71"]], "3.5.0": [[0, "id74"]], "3.4.1": [[0, "id77"]], "3.4.0": [[0, "id79"]], "3.3.0": [[0, "id82"]], "3.2.2": [[0, "id85"]], "3.2.1": [[0, "id86"]], "3.2.0": [[0, "id87"]], "3.1.1": [[0, "id90"]], "3.1.0": [[0, "id92"]], "3.0.0": [[0, "id96"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id101"]], "2.7.1": [[0, "id103"]], "2.7.0": [[0, "id105"]], "2.6.0": [[0, "id108"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id114"]], "2.5.0": [[0, "id116"]], "2.1.4": [[0, "id119"]], "2.1.3": [[0, "id122"]], "2.1.2": [[0, "id125"]], "2.1.1": [[0, "id128"]], "2.1.0": [[0, "id132"]], "2.1.0c1": [[0, "id134"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id139"]], "2.0.1": [[0, "id141"]], "2.0.0": [[0, "id143"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id149"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id153"]], "1.1.1": [[0, "id157"]], "1.1.0": [[0, "id159"]], "1.0.2": [[0, "id163"]], "1.0.1": [[0, "id166"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "edge (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Edge"]], "graphson_1_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphOptions"]], "graphprotocol (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON2Reader"]], "path (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Path"]], "result (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Result"]], "simplegraphstatement (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.SimpleGraphStatement"]], "vertex (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Vertex"]], "vertexproperty (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.VertexProperty"]], "as_edge() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_edge"]], "as_path() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_path"]], "as_vertex() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_vertex"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize() (cassandra.datastax.graph.graphson2reader method)": [[15, "cassandra.datastax.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "label (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.label"]], "labels (cassandra.datastax.graph.path attribute)": [[15, "cassandra.datastax.graph.Path.labels"]], "objects (cassandra.datastax.graph.path attribute)": [[15, "cassandra.datastax.graph.Path.objects"]], "properties (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.properties"]], "read() (cassandra.datastax.graph.graphson2reader method)": [[15, "cassandra.datastax.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "value (cassandra.datastax.graph.result attribute)": [[15, "cassandra.datastax.graph.Result.value"]], "value (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.value"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/3.22.3-scylla/security.html b/3.22.3-scylla/security.html new file mode 100644 index 0000000000..e193a5dc21 --- /dev/null +++ b/3.22.3-scylla/security.html @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Security

        +

        The two main security components you will use with the +Python driver are Authentication and SSL.

        +
        +

        Authentication

        +

        Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

        +

        For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

        +
        from cassandra.cluster import Cluster
        +from cassandra.auth import PlainTextAuthProvider
        +
        +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
        +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
        +
        +
        +
        +

        Custom Authenticators

        +

        If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

        +
        +
        +

        Protocol v1 Authentication

        +

        When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

        +
        from cassandra.cluster import Cluster
        +
        +def get_credentials(host_address):
        +    return {'username': 'joe', 'password': '1234'}
        +
        +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
        +
        +
        +
        +
        +
        +

        SSL

        +

        SSL should be used when client encryption is enabled in Cassandra.

        +

        To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

        +

        To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

        +

        If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

        +

        The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

        + +

        It might be also useful to learn about the different levels of identity verification to understand the examples:

        + +
        +

        SSL with Twisted or Eventlet

        +

        Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

        +
        +
        +

        SSL Configuration Examples

        +

        Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

        +
        +

        No identity verification

        +

        No identity verification at all. Note that this is not recommended for for production deployments.

        +

        The Cassandra configuration:

        +
        client_encryption_options:
        +  enabled: true
        +  keystore: /path/to/127.0.0.1.keystore
        +  keystore_password: myStorePass
        +  require_client_auth: false
        +
        +
        +

        The driver configuration:

        +
        from cassandra.cluster import Cluster, Session
        +from ssl import SSLContext, PROTOCOL_TLSv1
        +
        +ssl_context = SSLContext(PROTOCOL_TLSv1)
        +
        +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
        +session = cluster.connect()
        +
        +
        +
        +
        +

        Client verifies server

        +

        Ensure the python driver verifies the identity of the server.

        +

        The Cassandra configuration:

        +
        client_encryption_options:
        +  enabled: true
        +  keystore: /path/to/127.0.0.1.keystore
        +  keystore_password: myStorePass
        +  require_client_auth: false
        +
        +
        +

        For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

        +
        from cassandra.cluster import Cluster, Session
        +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
        +
        +ssl_context = SSLContext(PROTOCOL_TLSv1)
        +ssl_context.load_verify_locations('/path/to/rootca.crt')
        +ssl_context.verify_mode = CERT_REQUIRED
        +
        +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
        +session = cluster.connect()
        +
        +
        +

        Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

        +
        from cassandra.cluster import Cluster, Session
        +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
        +
        +ssl_context = SSLContext(PROTOCOL_TLSv1)
        +ssl_context.load_verify_locations('/path/to/rootca.crt')
        +ssl_context.verify_mode = CERT_REQUIRED
        +ssl_context.check_hostname = True
        +ssl_options = {'server_hostname': '127.0.0.1'}
        +
        +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
        +session = cluster.connect()
        +
        +
        +
        +
        +

        Server verifies client

        +

        If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

        +

        The cassandra configuration:

        +
        client_encryption_options:
        +  enabled: true
        +  keystore: /path/to/127.0.0.1.keystore
        +  keystore_password: myStorePass
        +  require_client_auth: true
        +  truststore: /path/to/dse-truststore.jks
        +  truststore_password: myStorePass
        +
        +
        +

        The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

        +
        cat > gen_client_cert.conf <<EOF
        +[ req ]
        +distinguished_name = req_distinguished_name
        +prompt = no
        +output_password = ${ROOT_CERT_PASS}
        +default_bits = 2048
        +
        +[ req_distinguished_name ]
        +C = ${CERT_COUNTRY}
        +O = ${CERT_ORG_NAME}
        +OU = ${CERT_OU}
        +CN = client
        +EOF
        +
        +
        +

        Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

        +
        openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
        +
        +
        +

        And generate the client signed certificate:

        +
        openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
        +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
        +
        +
        +

        Finally, you can use that configuration with the following driver code:

        +
        from cassandra.cluster import Cluster, Session
        +from ssl import SSLContext, PROTOCOL_TLSv1
        +
        +ssl_context = SSLContext(PROTOCOL_TLSv1)
        +ssl_context.load_cert_chain(
        +    certfile='/path/to/client.crt_signed',
        +    keyfile='/path/to/client.key')
        +
        +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
        +session = cluster.connect()
        +
        +
        +
        +
        +

        Server verifies client and client verifies server

        +

        See the previous section for examples of Cassandra configuration and preparing +the client certificates.

        +

        The following driver code specifies that the connection should use two-way verification:

        +
        from cassandra.cluster import Cluster, Session
        +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
        +
        +ssl_context = SSLContext(PROTOCOL_TLSv1)
        +ssl_context.load_verify_locations('/path/to/rootca.crt')
        +ssl_context.verify_mode = CERT_REQUIRED
        +ssl_context.load_cert_chain(
        +    certfile='/path/to/client.crt_signed',
        +    keyfile='/path/to/client.key')
        +
        +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
        +session = cluster.connect()
        +
        +
        +

        The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

        +

        Server verifies client and client verifies server using Twisted and pyOpenSSL

        +
        from OpenSSL import SSL, crypto
        +from cassandra.cluster import Cluster
        +from cassandra.io.twistedreactor import TwistedConnection
        +
        +ssl_context = SSL.Context(SSL.TLSv1_METHOD)
        +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
        +ssl_context.use_certificate_file('/path/to/client.crt_signed')
        +ssl_context.use_privatekey_file('/path/to/client.key')
        +ssl_context.load_verify_locations('/path/to/rootca.crt')
        +
        +cluster = Cluster(
        +    contact_points=['127.0.0.1'],
        +    connection_class=TwistedConnection,
        +    ssl_context=ssl_context,
        +    ssl_options={'check_hostname': True}
        +)
        +session = cluster.connect()
        +
        +
        +

        Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

        +
        +
        +
        +

        Versions 3.16.0 and lower

        +

        To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

        +

        By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLSv1 to match +Cassandra’s default protocol.

        +

        For example:

        +
        from cassandra.cluster import Cluster
        +from ssl import PROTOCOL_TLSv1, CERT_REQUIRED
        +
        +ssl_opts = {
        +    'ca_certs': '/path/to/my/ca.certs',
        +    'ssl_version': PROTOCOL_TLSv1,
        +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
        +}
        +cluster = Cluster(ssl_options=ssl_opts)
        +
        +
        +

        This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

        +
        +

        SSL with Twisted

        +

        In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

        +
        +
        +
        +
        +

        DSE Authentication

        +

        When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

        +
        from cassandra.auth import DSEGSSAPIAuthProvider
        +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
        +cluster = Cluster(auth_provider=auth_provider)
        +session = cluster.connect()
        +
        +
        +

        Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

        +
        +

        DSE Unified Authentication

        +

        With DSE (>=5.1), unified Authentication allows you to:

        +
          +
        • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

        • +
        • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

        • +
        +
        +

        Proxy Login

        +

        Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

        +
        GRANT PROXY.LOGIN on role user1 to server
        +
        +
        +

        then you can do the proxy authentication….

        +
        from cassandra.cluster import Cluster
        +from cassandra.auth import SaslAuthProvider
        +
        +sasl_kwargs = {
        +  "service": 'dse',
        +  "mechanism":"PLAIN",
        +  "username": 'server',
        +  'password': 'server',
        +  'authorization_id': 'user1'
        +}
        +
        +auth_provider = SaslAuthProvider(**sasl_kwargs)
        +c = Cluster(auth_provider=auth_provider)
        +s = c.connect()
        +s.execute(...)  # all requests will be executed as 'user1'
        +
        +
        +

        If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

        +
        from cassandra.cluster import Cluster
        +from cassandra.auth import DSEGSSAPIAuthProvider
        +
        +# Ensure the kerberos ticket of the server user is set with the kinit utility.
        +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
        +                                      authorization_id='user1@DATASTAX.COM')
        +c = Cluster(auth_provider=auth_provider)
        +s = c.connect()
        +s.execute(...)  # all requests will be executed as 'user1'
        +
        +
        +
        +
        +

        Proxy Execute

        +

        Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

        +
        GRANT PROXY.EXECUTE on role user1 to server
        +
        +
        +

        then you can do a proxy execute…

        +
        from cassandra.cluster import Cluster
        +from cassandra.auth import DSEPlainTextAuthProvider,
        +
        +auth_provider = DSEPlainTextAuthProvider('server', 'server')
        +
        +c = Cluster(auth_provider=auth_provider)
        +s = c.connect()
        +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
        +
        +
        +

        Please see the official documentation for more details on the feature and configuration process.

        +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/sitemap.xml b/3.22.3-scylla/sitemap.xml new file mode 100644 index 0000000000..044a528e90 --- /dev/null +++ b/3.22.3-scylla/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade_guide.htmlhttps://python-driver.docs.scylladb.com/stable/user_defined_types.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/dates_and_times.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/execution_profiles.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/getting_started.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third_party.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/object_mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query_paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_specific.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/3.22.3-scylla/upgrading.html b/3.22.3-scylla/upgrading.html new file mode 100644 index 0000000000..0307e05d02 --- /dev/null +++ b/3.22.3-scylla/upgrading.html @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrading

        +
        +
        +
        +

        Upgrading from dse-driver

        +

        Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes.

        +
        +

        Installation

        +

        Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

        +
        pip install scylla-driver
        +
        +
        +

        If you need the Graph Fluent API (features provided by dse-graph):

        +
        pip install scylla-driver[graph]
        +
        +
        +

        See Installation for more details.

        +
        +
        +

        Import from the cassandra module

        +

        There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

        +
        from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
        +from dse.auth import PlainTextAuthProvider
        +from dse.policies import WhiteListRoundRobinPolicy
        +
        +# becomes
        +
        +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
        +from cassandra.auth import PlainTextAuthProvider
        +from cassandra.policies import WhiteListRoundRobinPolicy
        +
        +
        +

        Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

        +
        +
        +

        dse-graph

        +

        dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

        +
        from dse_graph import ..
        +from dse_graph.query import ..
        +
        +# becomes
        +
        +from cassandra.datastax.graph.fluent import ..
        +from cassandra.datastax.graph.fluent.query import ..
        +
        +
        +

        See fluent.

        +
        +
        +

        Session.execute and Session.execute_async API

        +

        Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

        +

        See Session.execute().

        +
        +
        +

        Deprecations

        +

        These changes are optional, but recommended:

        +
          +
        • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

        • +
        • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

        • +
        +
        +
        +
        +

        Upgrading to 3.0

        +

        Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

        +
        +

        Default consistency is now LOCAL_ONE

        +

        Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

        +
        +
        +

        Execution API Updates

        +
        +

        Result return normalization

        +

        PYTHON-368

        +

        Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

        +

        Now, all results are returned as an iterable ResultSet.

        +

        The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

        +
        results = session.execute("SELECT * FROM system.local")
        +for row in results:
        +    process(row)
        +
        +
        +

        If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

        +
        results = session.execute("SELECT * FROM system.local")
        +row_list = list(results)
        +
        +
        +

        For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

        +
        results = session.execute("SELECT * FROM system.local")
        +first_result = results[0]  # materializes results, fetching all pages
        +
        +
        +

        This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

        +
        +
        +

        Trace information is not attached to executed Statements

        +

        PYTHON-318

        +

        Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

        +

        Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

        +

        ResponseFuture.get_query_trace()

        +

        ResponseFuture.get_all_query_traces()

        +

        ResultSet.get_query_trace()

        +

        ResultSet.get_all_query_traces()

        +
        +
        +

        Binding named parameters now ignores extra names

        +

        PYTHON-178

        +

        Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

        +

        Behavior in 3.0+ is to ignore extra names.

        +
        +
        +
        +

        blist removed as soft dependency

        +

        PYTHON-385

        +

        Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

        +

        Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

        +
        +
        +

        Metadata API Updates

        +

        PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

        +

        Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

        +

        The present API is documented: cassandra.metadata. Changes highlighted below:

        +
          +
        • All types are now exposed as CQL types instead of types derived from the internal server implementation

        • +
        • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

        • +
        • Some metadata attributes removed

          +
            +
          • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

          • +
          • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

          • +
          +
        • +
        +
        +
        +

        Several deprecated features are removed

        +

        PYTHON-292

        +
          +
        • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

        • +
        • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

        • +
        • Cluster.submit_schema_refresh removed (574266d)

        • +
        • cqltypes time/date functions removed, use util entry points instead (bb984ee)

        • +
        • decoder module removed (e16a073)

        • +
        • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

        • +
        • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

        • +
        • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

        • +
        • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

        • +
        • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

        • +
        • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

        • +
        +
        +
        +
        +

        Upgrading to 2.1 from 2.0

        +

        Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

        +

        Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

        +
        +

        Using the v3 Native Protocol

        +

        By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster(protocol_version=3)
        +
        +
        +

        Note that protocol version 3 is only supported by Cassandra 2.1+.

        +

        In future releases, the driver may default to using protocol version +3.

        +
        +
        +

        Working with User-Defined Types

        +

        Cassandra 2.1 introduced the ability to define new types:

        +
        USE KEYSPACE mykeyspace;
        +
        +CREATE TYPE address (street text, city text, zip int);
        +
        +
        +

        The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

        +
        cluster = Cluster()
        +
        +class Address(object):
        +
        +    def __init__(self, street, city, zipcode):
        +        self.street = street
        +        self.city = text
        +        self.zipcode = zipcode
        +
        +cluster.register_user_type('mykeyspace', 'address', Address)
        +
        +
        +

        When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

        +

        If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

        +

        See User Defined Types for more details.

        +
        +
        +

        Customizing Encoders for Non-prepared Statements

        +

        Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

        +
        cluster = Cluster()
        +session = cluster.connect()
        +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
        +
        +
        +

        See Type Conversions for the table of default CQL literal conversions.

        +
        +
        +

        Using Client-Side Protocol-Level Timestamps

        +

        With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

        +

        When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

        +
        +
        +
        +

        Upgrading to 2.0 from 1.x

        +

        Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

        +
        +

        Using the v2 Native Protocol

        +

        By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster(protocol_version=2)
        +
        +
        +

        When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

        +
        from cassandra.cluster import Cluster
        +
        +cluster = Cluster(protocol_version=1)
        +
        +
        +
        +
        +

        Automatic Query Paging

        +

        Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

        +

        See Paging Large Queries for full details.

        +
        +
        +

        Protocol-Level Batch Statements

        +

        With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

        +

        See BatchStatement for details and usage examples.

        +
        +
        +

        SASL-based Authentication

        +

        Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

        +
        +
        +

        Lightweight Transactions

        +

        Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

        +
        +
        +

        Calling Cluster.shutdown()

        +

        In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

        +
        +
        +

        Deprecations

        +

        The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

        + +
        +
        +

        Dependency Changes

        +

        The following dependencies have officially been made optional:

        +
          +
        • scales

        • +
        • blist

        • +
        +

        And one new dependency has been added (to enable Python 3 support):

        +
          +
        • six

        • +
        +
        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.22.3-scylla/user_defined_types.html b/3.22.3-scylla/user_defined_types.html new file mode 100644 index 0000000000..b436f18e39 --- /dev/null +++ b/3.22.3-scylla/user_defined_types.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        User Defined Types

        +

        Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

        +
        CREATE TYPE address (street text, zip int);
        +
        +
        +

        Version 2.1 of the Python driver adds support for user-defined types.

        +
        +

        Registering a UDT

        +

        You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

        +
        +

        Map a Class to a UDT

        +
        cluster = Cluster(protocol_version=3)
        +session = cluster.connect()
        +session.set_keyspace('mykeyspace')
        +session.execute("CREATE TYPE address (street text, zipcode int)")
        +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
        +
        +# create a class to map to the "address" UDT
        +class Address(object):
        +
        +    def __init__(self, street, zipcode):
        +        self.street = street
        +        self.zipcode = zipcode
        +
        +cluster.register_user_type('mykeyspace', 'address', Address)
        +
        +# insert a row using an instance of Address
        +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
        +                (0, Address("123 Main St.", 78723)))
        +
        +# results will include Address instances
        +results = session.execute("SELECT * FROM users")
        +row = results[0]
        +print(row.id, row.location.street, row.location.zipcode)
        +
        +
        +
        +
        +

        Map a dict to a UDT

        +
        cluster = Cluster(protocol_version=3)
        +session = cluster.connect()
        +session.set_keyspace('mykeyspace')
        +session.execute("CREATE TYPE address (street text, zipcode int)")
        +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
        +
        +cluster.register_user_type('mykeyspace', 'address', dict)
        +
        +# insert a row using a prepared statement and a tuple
        +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
        +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
        +
        +# results will include dict instances
        +results = session.execute("SELECT * FROM users")
        +row = results[0]
        +print(row.id, row.location['street'], row.location['zipcode'])
        +
        +
        +
        +
        +
        +

        Using UDTs Without Registering Them

        +

        Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

        +

        When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

        +
        cluster = Cluster(protocol_version=3)
        +session = cluster.connect()
        +session.set_keyspace('mykeyspace')
        +session.execute("CREATE TYPE address (street text, zipcode int)")
        +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
        +
        +class Foo(object):
        +
        +    def __init__(self, street, zipcode, otherstuff):
        +        self.street = street
        +        self.zipcode = zipcode
        +        self.otherstuff = otherstuff
        +
        +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
        +
        +# since we're using a prepared statement, we don't *have* to register
        +# a class to map to the UDT to insert data.  The object just needs to have
        +# "street" and "zipcode" attributes (which Foo does):
        +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
        +
        +# when we query data, UDT columns that don't have a class registered
        +# will be returned as namedtuples:
        +results = session.execute("SELECT * FROM users")
        +first_row = results[0]
        +address = first_row.location
        +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
        +street = address.street
        +zipcode = address.street
        +
        +
        +

        As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

        +

        * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

        +
        +
        + + +
        + + + + + + +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/.buildinfo b/3.24.8-scylla/.buildinfo new file mode 100644 index 0000000000..c85092e3c9 --- /dev/null +++ b/3.24.8-scylla/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 41e5d44a54168b647a4e97ddfb9a0203 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/3.24.8-scylla/.doctrees/CHANGELOG.doctree b/3.24.8-scylla/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..19ced94589 Binary files /dev/null and b/3.24.8-scylla/.doctrees/CHANGELOG.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra.doctree b/3.24.8-scylla/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..ca82cf19f5 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/auth.doctree b/3.24.8-scylla/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..d97a61f059 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/auth.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cluster.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..4f8c9c3ee4 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cluster.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/concurrent.doctree b/3.24.8-scylla/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..e40b9da420 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/connection.doctree b/3.24.8-scylla/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..2259b2dd06 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/connection.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..9915e3eaf5 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..2f52272fb3 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/management.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..896873fbee Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/models.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..564e770fe4 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/query.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..3a1ac5fa29 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..0603b7fe9c Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..90840f24fc Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..c26e40c354 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..2b18691b21 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..3a2d84b8bb Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/decoder.doctree b/3.24.8-scylla/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..1d76b2996f Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/decoder.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/encoder.doctree b/3.24.8-scylla/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..918cf01a12 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/encoder.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/graph.doctree b/3.24.8-scylla/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..839c434708 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/graph.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree b/3.24.8-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..55116932e3 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree b/3.24.8-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..110e0dc789 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree b/3.24.8-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..9219929aa6 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/io/geventreactor.doctree b/3.24.8-scylla/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..9dfe5c7d8c Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/io/libevreactor.doctree b/3.24.8-scylla/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..0cff622e1d Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree b/3.24.8-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..1381054045 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/metadata.doctree b/3.24.8-scylla/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..59da5c425b Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/metadata.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/metrics.doctree b/3.24.8-scylla/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..641d09d8e1 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/metrics.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/policies.doctree b/3.24.8-scylla/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..f550cb54d2 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/policies.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/pool.doctree b/3.24.8-scylla/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..5920fd70c8 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/pool.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/protocol.doctree b/3.24.8-scylla/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..7b49e8dcc6 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/protocol.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/query.doctree b/3.24.8-scylla/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..00f96794a1 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/query.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/timestamps.doctree b/3.24.8-scylla/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..4743fa13e8 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/cassandra/util.doctree b/3.24.8-scylla/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..c03b420f65 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/cassandra/util.doctree differ diff --git a/3.24.8-scylla/.doctrees/api/index.doctree b/3.24.8-scylla/.doctrees/api/index.doctree new file mode 100644 index 0000000000..94e5b70608 Binary files /dev/null and b/3.24.8-scylla/.doctrees/api/index.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/batches.doctree b/3.24.8-scylla/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..c06b2e129b Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/batches.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/connections.doctree b/3.24.8-scylla/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..f86c2c4e88 Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/connections.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/faq.doctree b/3.24.8-scylla/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..b00a72ac65 Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/faq.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/models.doctree b/3.24.8-scylla/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..c459960e83 Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/models.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/queryset.doctree b/3.24.8-scylla/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..b4efe0544f Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/queryset.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/third_party.doctree b/3.24.8-scylla/.doctrees/cqlengine/third_party.doctree new file mode 100644 index 0000000000..53e8e89e5e Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/third_party.doctree differ diff --git a/3.24.8-scylla/.doctrees/cqlengine/upgrade_guide.doctree b/3.24.8-scylla/.doctrees/cqlengine/upgrade_guide.doctree new file mode 100644 index 0000000000..84138a2554 Binary files /dev/null and b/3.24.8-scylla/.doctrees/cqlengine/upgrade_guide.doctree differ diff --git a/3.24.8-scylla/.doctrees/dates_and_times.doctree b/3.24.8-scylla/.doctrees/dates_and_times.doctree new file mode 100644 index 0000000000..23deab7fd6 Binary files /dev/null and b/3.24.8-scylla/.doctrees/dates_and_times.doctree differ diff --git a/3.24.8-scylla/.doctrees/environment.pickle b/3.24.8-scylla/.doctrees/environment.pickle new file mode 100644 index 0000000000..ceecbd0875 Binary files /dev/null and b/3.24.8-scylla/.doctrees/environment.pickle differ diff --git a/3.24.8-scylla/.doctrees/execution_profiles.doctree b/3.24.8-scylla/.doctrees/execution_profiles.doctree new file mode 100644 index 0000000000..cfd78b35a7 Binary files /dev/null and b/3.24.8-scylla/.doctrees/execution_profiles.doctree differ diff --git a/3.24.8-scylla/.doctrees/faq.doctree b/3.24.8-scylla/.doctrees/faq.doctree new file mode 100644 index 0000000000..41569bd979 Binary files /dev/null and b/3.24.8-scylla/.doctrees/faq.doctree differ diff --git a/3.24.8-scylla/.doctrees/getting_started.doctree b/3.24.8-scylla/.doctrees/getting_started.doctree new file mode 100644 index 0000000000..1ae913116d Binary files /dev/null and b/3.24.8-scylla/.doctrees/getting_started.doctree differ diff --git a/3.24.8-scylla/.doctrees/index.doctree b/3.24.8-scylla/.doctrees/index.doctree new file mode 100644 index 0000000000..3b26864d60 Binary files /dev/null and b/3.24.8-scylla/.doctrees/index.doctree differ diff --git a/3.24.8-scylla/.doctrees/installation.doctree b/3.24.8-scylla/.doctrees/installation.doctree new file mode 100644 index 0000000000..9ef65bf0ce Binary files /dev/null and b/3.24.8-scylla/.doctrees/installation.doctree differ diff --git a/3.24.8-scylla/.doctrees/lwt.doctree b/3.24.8-scylla/.doctrees/lwt.doctree new file mode 100644 index 0000000000..8c7ace8e5f Binary files /dev/null and b/3.24.8-scylla/.doctrees/lwt.doctree differ diff --git a/3.24.8-scylla/.doctrees/object_mapper.doctree b/3.24.8-scylla/.doctrees/object_mapper.doctree new file mode 100644 index 0000000000..f7e9d488c3 Binary files /dev/null and b/3.24.8-scylla/.doctrees/object_mapper.doctree differ diff --git a/3.24.8-scylla/.doctrees/performance.doctree b/3.24.8-scylla/.doctrees/performance.doctree new file mode 100644 index 0000000000..f2f0e299cc Binary files /dev/null and b/3.24.8-scylla/.doctrees/performance.doctree differ diff --git a/3.24.8-scylla/.doctrees/query_paging.doctree b/3.24.8-scylla/.doctrees/query_paging.doctree new file mode 100644 index 0000000000..b9c14265af Binary files /dev/null and b/3.24.8-scylla/.doctrees/query_paging.doctree differ diff --git a/3.24.8-scylla/.doctrees/scylla_cloud.doctree b/3.24.8-scylla/.doctrees/scylla_cloud.doctree new file mode 100644 index 0000000000..10979edc76 Binary files /dev/null and b/3.24.8-scylla/.doctrees/scylla_cloud.doctree differ diff --git a/3.24.8-scylla/.doctrees/scylla_specific.doctree b/3.24.8-scylla/.doctrees/scylla_specific.doctree new file mode 100644 index 0000000000..3bd8fdc63e Binary files /dev/null and b/3.24.8-scylla/.doctrees/scylla_specific.doctree differ diff --git a/3.24.8-scylla/.doctrees/security.doctree b/3.24.8-scylla/.doctrees/security.doctree new file mode 100644 index 0000000000..9c59d4667d Binary files /dev/null and b/3.24.8-scylla/.doctrees/security.doctree differ diff --git a/3.24.8-scylla/.doctrees/upgrading.doctree b/3.24.8-scylla/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..f1230a92ff Binary files /dev/null and b/3.24.8-scylla/.doctrees/upgrading.doctree differ diff --git a/3.24.8-scylla/.doctrees/user_defined_types.doctree b/3.24.8-scylla/.doctrees/user_defined_types.doctree new file mode 100644 index 0000000000..6bab2c0ac1 Binary files /dev/null and b/3.24.8-scylla/.doctrees/user_defined_types.doctree differ diff --git a/3.24.8-scylla/.nojekyll b/3.24.8-scylla/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.24.8-scylla/404.html b/3.24.8-scylla/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/3.24.8-scylla/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
        +

        404

        +

        The ScyllaDB monster ate your page!

        +

        + Home +

        +
        + + + \ No newline at end of file diff --git a/3.24.8-scylla/CHANGELOG.html b/3.24.8-scylla/CHANGELOG.html new file mode 100644 index 0000000000..46a028d3d3 --- /dev/null +++ b/3.24.8-scylla/CHANGELOG.html @@ -0,0 +1,2871 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        CHANGELOG

        +
        +

        3.24.0

        +

        June 18, 2020

        +
        +

        Features

        +
          +
        • Make geomet an optional dependency at runtime (PYTHON-1237)

        • +
        • Add use_default_tempdir cloud config options (PYTHON-1245)

        • +
        • Tcp flow control for libevreactor (PYTHON-1248)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Unable to connect to a cloud cluster using Ubuntu 20.04 (PYTHON-1238)

        • +
        • PlainTextAuthProvider fails with unicode chars and Python3 (PYTHON-1241)

        • +
        • [GRAPH] Graph execution profiles consistency level are not set to LOCAL_QUORUM with a cloud cluster (PYTHON-1240)

        • +
        • [GRAPH] Can’t write data in a Boolean field using the Fluent API (PYTHON-1239)

        • +
        • [GRAPH] Fix elementMap() result deserialization (PYTHON-1233)

        • +
        +
        +
        +

        Others

        +
          +
        • Bump geomet dependency version to 0.2 (PYTHON-1243)

        • +
        • Bump gremlinpython dependency version to 3.4.6 (PYTHON-1212)

        • +
        • Improve fluent graph documentation for core graphs (PYTHON-1244)

        • +
        +
        +
        +
        +

        3.23.0

        +

        April 6, 2020

        +
        +

        Features

        +
          +
        • Transient Replication Support (PYTHON-1207)

        • +
        • Support system.peers_v2 and port discovery for C* 4.0 (PYTHON-700)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Asyncore logging exception on shutdown (PYTHON-1228)

        • +
        +
        +
        +
        +

        3.22.0

        +

        February 26, 2020

        +
        +

        Features

        +
          +
        • Add all() function to the ResultSet API (PYTHON-1203)

        • +
        • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

        • +
        • Add GraphSON3 support (PYTHON-788)

        • +
        • Use GraphSON3 as default for Native graphs (PYTHON-1004)

        • +
        • Add Tuple and UDT types for native graph (PYTHON-1005)

        • +
        • Add Duration type for native graph (PYTHON-1000)

        • +
        • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

        • +
        • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

        • +
        • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

        • +
        • Resolve the row_factory automatically for native graphs (PYTHON-1056)

        • +
        • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

        • +
        • Add g:BulkSet graph deserializers (PYTHON-1060)

        • +
        • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

        • +
        • Update Native to Core Graph Engine

        • +
        • Add graphson3 and native graph support (PYTHON-1039)

        • +
        • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

        • +
        • Expose filter predicates for cql collections (PYTHON-1019)

        • +
        • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

        • +
        • Make graph metadata handling more robust (PYTHON-1204)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

        • +
        +
        +
        +
        +

        3.21.0

        +

        January 15, 2020

        +
        +

        Features

        +
          +
        • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

        • +
        • Add Python 3.8 support (PYTHON-1189)

        • +
        • Allow passing ssl context for Twisted (PYTHON-1161)

        • +
        • Ssl context and cloud support for Eventlet (PYTHON-1162)

        • +
        • Cloud Twisted support (PYTHON-1163)

        • +
        • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

        • +
        • Flexible version parsing (PYTHON-1174)

        • +
        • Support NULL in collection deserializer (PYTHON-1123)

        • +
        • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

        • +
        • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

        • +
        • asyncio message chunks can be processed discontinuously (PYTHON-1185)

        • +
        • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

        • +
        • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

        • +
        • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

        • +
        • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

        • +
        +
        +
        +

        Others

        +
          +
        • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

        • +
        • Remove *read_repair_chance table options (PYTHON-1140)

        • +
        • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

        • +
        • Add new DSE CQL keywords (PYTHON-1122)

        • +
        • Publish binary wheel distributions (PYTHON-1013)

        • +
        +
        +
        +

        Deprecations

        +
          +
        • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

        • +
        +

        Merged from dse-driver:

        +
        +
        +

        Features

        +
          +
        • Insights integration (PYTHON-1047)

        • +
        • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

        • +
        • Add NodeSync metadata (PYTHON-799)

        • +
        • Add new NodeSync failure values (PYTHON-934)

        • +
        • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

        • +
        • GraphOptions should show a warning for unknown parameters (PYTHON-819)

        • +
        • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

        • +
        • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

        • +
        • Add graph-results payload option for GraphSON format (PYTHON-773)

        • +
        • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

        • +
        • Implement serializers for the Graph String API (PYTHON-778)

        • +
        • Provide deserializers for GraphSON types (PYTHON-782)

        • +
        • Add Graph DurationType support (PYTHON-607)

        • +
        • Support DSE DateRange type (PYTHON-668)

        • +
        • RLAC CQL output for materialized views (PYTHON-682)

        • +
        • Add Geom Types wkt deserializer

        • +
        • DSE Graph Client timeouts in custom payload (PYTHON-589)

        • +
        • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

        • +
        • Add config profiles to DSE graph execution (PYTHON-570)

        • +
        • DSE Driver version checking (PYTHON-568)

        • +
        • Distinct default timeout for graph queries (PYTHON-477)

        • +
        • Graph result parsing for known types (PYTHON-479,487)

        • +
        • Distinct read/write CL for graph execution (PYTHON-509)

        • +
        • Target graph analytics query to spark master when available (PYTHON-510)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

        • +
        • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

        • +
        • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

        • +
        • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

        • +
        • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

        • +
        • Update date serialization to isoformat in graph (PYTHON-805)

        • +
        • DateRange Parse Error (PYTHON-729)

        • +
        • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

        • +
        • metadata.get_host returning None unexpectedly (PYTHON-709)

        • +
        • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

        • +
        • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

        • +
        • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

        • +
        • Correctly handle other types in geo type equality (PYTHON-508)

        • +
        +
        +
        +

        Other

        +
          +
        • Add tests around cqlengine and continuous paging (PYTHON-872)

        • +
        • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

        • +
        • Write documentation examples for DSE 2.0 features (PYTHON-732)

        • +
        • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

        • +
        +
        +
        +
        +

        3.20.2

        +

        November 19, 2019

        +
        +

        Bug Fixes

        +
          +
        • Fix import error for old python installation without SSLContext (PYTHON-1183)

        • +
        +
        +
        +
        +

        3.20.1

        +

        November 6, 2019

        +
        +

        Bug Fixes

        +
          +
        • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

        • +
        +
        +
        +
        +

        3.20.0

        +

        October 28, 2019

        +
        +

        Features

        +
          +
        • DataStax Astra Support (PYTHON-1074)

        • +
        • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

        • +
        • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

        • +
        • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

        • +
        +
        +
        +
        +

        3.19.0

        +

        August 26, 2019

        +
        +

        Features

        +
          +
        • Add Python 3.7 support (PYTHON-1016)

        • +
        • Future-proof Mapping imports (PYTHON-1023)

        • +
        • Include param values in cqlengine logging (PYTHON-1105)

        • +
        • NTS Token Replica Map Generation is slow (PYTHON-622)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

        • +
        • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

        • +
        • Fix incorrect metadata for compact counter tables (PYTHON-1100)

        • +
        • Call ConnectionException with correct kwargs (PYTHON-1117)

        • +
        • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

        • +
        • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

        • +
        • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

        • +
        +
        +
        +

        Other

        +
          +
        • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

        • +
        • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

        • +
        +
        +
        +
        +

        3.18.0

        +

        May 27, 2019

        +
        +

        Features

        +
          +
        • Abstract Host Connection information (PYTHON-1079)

        • +
        • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

        • +
        • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

        • +
        • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

        • +
        • Accept legacy empty strings as column names (PYTHON-1082)

        • +
        • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

        • +
        +
        +
        +
        +

        3.17.1

        +

        May 2, 2019

        +
        +

        Bug Fixes

        +
          +
        • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

        • +
        +
        +
        +
        +

        3.17.0

        +

        February 19, 2019

        +
        +

        Features

        +
          +
        • Send driver name and version in startup message (PYTHON-1068)

        • +
        • Add Cluster ssl_context option to enable SSL (PYTHON-995)

        • +
        • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

        • +
        • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

        • +
        • Add Session.get_execution_profile (PYTHON-932)

        • +
        • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

        • +
        • Serial consistency level is not used (PYTHON-1007)

        • +
        +
        +
        +

        Other

        +
          +
        • Fail faster on incorrect lz4 import (PYTHON-1042)

        • +
        • Bump Cython dependency version to 0.29 (PYTHON-1036)

        • +
        • Expand Driver SSL Documentation (PYTHON-740)

        • +
        +
        +
        +

        Deprecations

        +
          +
        • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

        • +
        • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

        • +
        +
        +
        +
        +

        3.16.0

        +

        November 12, 2018

        +
        +

        Bug Fixes

        +
          +
        • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

        • +
        • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

        • +
        • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

        • +
        • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

        • +
        • Log profile name on attempt to create existing profile (PYTHON-944)

        • +
        • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

        • +
        +
        +
        +

        Other

        +
          +
        • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

        • +
        • Fix wrong use of ResultSet indexing (PYTHON-1015)

        • +
        +
        +
        +
        +

        3.15.1

        +

        September 6, 2018

        +
        +

        Bug Fixes

        +
          +
        • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

        • +
        +
        +
        +
        +

        3.15.0

        +

        August 30, 2018

        +
        +

        Features

        +
          +
        • Parse Virtual Keyspace Metadata (PYTHON-992)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

        • +
        • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

        • +
        • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

        • +
        • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

        • +
        +
        +
        +

        Other

        +
          +
        • Use global variable for libev loops so it can be subclassed (PYTHON-973)

        • +
        • Update SchemaParser for V4 (PYTHON-1006)

        • +
        • Bump Cython dependency version to 0.28 (PYTHON-1012)

        • +
        +
        +
        +
        +

        3.14.0

        +

        April 17, 2018

        +
        +

        Features

        +
          +
        • Add one() function to the ResultSet API (PYTHON-947)

        • +
        • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

        • +
        • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

        • +
        • Twisted SSL Support (PYTHON-343)

        • +
        • Support IS NOT NULL operator in cqlengine (PYTHON-968)

        • +
        +
        +
        +

        Other

        +
          +
        • Fix Broken Links in Docs (PYTHON-916)

        • +
        • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

        • +
        • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

        • +
        • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

        • +
        • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

        • +
        • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

        • +
        • Add DSE smoke test to OSS driver tests (PYTHON-894)

        • +
        • Document long compilation times and workarounds (PYTHON-868)

        • +
        • Improve error for batch WriteTimeouts (PYTHON-941)

        • +
        • Deprecate ResultSet indexing (PYTHON-945)

        • +
        +
        +
        +
        +

        3.13.0

        +

        January 30, 2018

        +
        +

        Features

        +
          +
        • cqlengine: LIKE filter operator (PYTHON-512)

        • +
        • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

        • +
        • Support retry_policy in PreparedStatement (PYTHON-861)

        • +
        • __del__ method in Session is throwing an exception (PYTHON-813)

        • +
        • LZ4 import issue with recent versions (PYTHON-897)

        • +
        • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

        • +
        • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

        • +
        +
        +
        +

        Other

        +
          +
        • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

        • +
        • Fix DeprecationWarning of log.warn (PYTHON-846)

        • +
        • Fix example_mapper.py for python3 (PYTHON-860)

        • +
        • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

        • +
        • Add some known deprecated warnings for 4.x (PYTHON-877)

        • +
        • Remove copyright dates from copyright notices (PYTHON-863)

        • +
        • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

        • +
        • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

        • +
        • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

        • +
        • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

        • +
        +
        +
        +
        +

        3.12.0

        +

        November 6, 2017

        +
        +

        Features

        +
          +
        • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

        • +
        • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

        • +
        • WriteType.CDC and VIEW missing (PYTHON-794)

        • +
        • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

        • +
        • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

        • +
        • Include hash of result set metadata in prepared stmt id (PYTHON-808)

        • +
        • Add NO_COMPACT startup option (PYTHON-839)

        • +
        • Add new exception type for CDC (PYTHON-837)

        • +
        • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

        • +
        • Add asyncio reactor (PYTHON-507)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

        • +
        • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

        • +
        • Not create two sessions by default in CQLEngine (PYTHON-814)

        • +
        • Bug when subclassing AyncoreConnection (PYTHON-827)

        • +
        • Error at cleanup when closing the asyncore connections (PYTHON-829)

        • +
        • Fix sites where sessions can change during iteration (PYTHON-793)

        • +
        • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

        • +
        • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

        • +
        • Dont set the session keyspace when preparing statements (PYTHON-843)

        • +
        • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

        • +
        +
        +
        +

        Other

        +
          +
        • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

        • +
        • Bump Cython dependency version to 0.27 (PYTHON-833)

        • +
        +
        +
        +
        +

        3.11.0

        +

        July 24, 2017

        +
        +

        Features

        +
          +
        • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

        • +
        • Add HostFilterPolicy (PYTHON-761)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

        • +
        • Fix asyncore hang on exit (PYTHON-767)

        • +
        • Driver takes several minutes to remove a bad host from session (PYTHON-762)

        • +
        • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

        • +
        • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

        • +
        • request_ids may not be returned to the pool (PYTHON-739)

        • +
        • Fix murmur3 on big-endian systems (PYTHON-653)

        • +
        • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

        • +
        • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

        • +
        +
        +
        +

        Other

        +
          +
        • Bump Cython dependency version to 0.25.2 (PYTHON-754)

        • +
        • Fix DeprecationWarning when using lz4 (PYTHON-769)

        • +
        • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

        • +
        • Improve upgrade guide for materializing pages (PYTHON-464)

        • +
        • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

        • +
        • Point to DSA Slack, not IRC, in docs index

        • +
        +
        +
        +
        +

        3.10.0

        +

        May 24, 2017

        +
        +

        Features

        +
          +
        • Add Duration type to cqlengine (PYTHON-750)

        • +
        • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

        • +
        • get_query_trace() contract is ambiguous (PYTHON-196)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Queries using speculative execution policy timeout prematurely (PYTHON-755)

        • +
        • Fix map where results are not consumed (PYTHON-749)

        • +
        • Driver fails to encode Duration’s with large values (PYTHON-747)

        • +
        • UDT values are not updated correctly in CQLEngine (PYTHON-743)

        • +
        • UDT types are not validated in CQLEngine (PYTHON-742)

        • +
        • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

        • +
        • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

        • +
        • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

        • +
        • Memory grows and doesn’t get removed (PYTHON-720)

        • +
        • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

        • +
        • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

        • +
        • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

        • +
        +
        +
        +

        Other

        +
          +
        • Update README (PYTHON-746)

        • +
        • Test python versions 3.5 and 3.6 (PYTHON-737)

        • +
        • Docs Warning About Prepare select * (PYTHON-626)

        • +
        • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

        • +
        • Example SSL connection code does not verify server certificates (PYTHON-469)

        • +
        +
        +
        +
        +

        3.9.0

        +
        +

        Features

        +
          +
        • cqlengine: remove elements by key from a map (PYTHON-688)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • improve error handling when connecting to non-existent keyspace (PYTHON-665)

        • +
        • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

        • +
        • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

        • +
        • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

        • +
        • race where callback or errback for request may not be called (PYTHON-733)

        • +
        • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

        • +
        • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

        • +
        +
        +
        +

        Other

        +
          +
        • Connection not closed in example_mapper (PYTHON-723)

        • +
        • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

        • +
        +
        +
        +
        +

        3.8.1

        +

        March 16, 2017

        +
        +

        Bug Fixes

        +
          +
        • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

        • +
        • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

        • +
        • Fix DecimalType regression (PYTHON-724)

        • +
        +
        +
        +
        +

        3.8.0

        +
        +

        Features

        +
          +
        • Quote index names in metadata CQL generation (PYTHON-616)

        • +
        • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

        • +
        • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

        • +
        • Added cql types to result set (PYTHON-648)

        • +
        • Add __len__ to BatchStatement (PYTHON-650)

        • +
        • Duration Type for Cassandra (PYTHON-655)

        • +
        • Send flags with PREPARE message in v5 (PYTHON-684)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

        • +
        • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

        • +
        • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

        • +
        • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

        • +
        • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

        • +
        • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

        • +
        • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

        • +
        • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

        • +
        • Make client timestamps strictly monotonic (PYTHON-676)

        • +
        • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

        • +
        +
        +
        +

        Other

        +
          +
        • Create a cqlengine doc section explaining None semantics (PYTHON-623)

        • +
        • Resolve warnings in documentation generation (PYTHON-645)

        • +
        • Cython dependency (PYTHON-686)

        • +
        • Drop Support for Python 2.6 (PYTHON-690)

        • +
        +
        +
        +
        +

        3.7.1

        +

        October 26, 2016

        +
        +

        Bug Fixes

        +
          +
        • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

        • +
        +
        +
        +
        +

        3.7.0

        +

        September 13, 2016

        +
        +

        Features

        +
          +
        • Add v5 protocol failure map (PYTHON-619)

        • +
        • Don’t return from initial connect on first error (PYTHON-617)

        • +
        • Indicate failed column when deserialization fails (PYTHON-361)

        • +
        • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

        • +
        • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

        • +
        • EC2 Address Resolver (PYTHON-198)

        • +
        • Speculative query retries (PYTHON-218)

        • +
        • Expose paging state in API (PYTHON-200)

        • +
        • Don’t mark host down while one connection is active (PYTHON-498)

        • +
        • Query request size information (PYTHON-284)

        • +
        • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

        • +
        • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

        • +
        • Add beta version native protocol flag (PYTHON-614)

        • +
        • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Race when adding a pool while setting keyspace (PYTHON-628)

        • +
        • Update results_metadata when prepared statement is reprepared (PYTHON-621)

        • +
        • CQL Export for Thrift Tables (PYTHON-213)

        • +
        • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

        • +
        • cqlengine: columns are no longer hashable (PYTHON-618)

        • +
        • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

        • +
        +
        +
        +
        +

        3.6.0

        +

        August 1, 2016

        +
        +

        Features

        +
          +
        • Handle null values in NumpyProtocolHandler (PYTHON-553)

        • +
        • Collect greplin scales stats per cluster (PYTHON-561)

        • +
        • Update mock unit test dependency requirement (PYTHON-591)

        • +
        • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

        • +
        • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

        • +
        • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

        • +
        • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

        • +
        • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

        • +
        • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix geventreactor with SSL support (PYTHON-600)

        • +
        • Don’t downgrade protocol version if explicitly set (PYTHON-537)

        • +
        • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

        • +
        • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

        • +
        • Libev loop shutdown race (PYTHON-578)

        • +
        • Include aliases in DCT type string (PYTHON-579)

        • +
        • cqlengine: Comparison operators for Columns (PYTHON-595)

        • +
        • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

        • +
        • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

        • +
        • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

        • +
        • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

        • +
        • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

        • +
        • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

        • +
        +
        +
        +
        +

        3.5.0

        +

        June 27, 2016

        +
        +

        Features

        +
          +
        • Optional Execution Profiles for the core driver (PYTHON-569)

        • +
        • API to get the host metadata associated with the control connection node (PYTHON-583)

        • +
        • Expose CDC option in table metadata CQL (PYTHON-593)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Clean up Asyncore socket map when fork is detected (PYTHON-577)

        • +
        • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

        • +
        +
        +
        +
        +

        3.4.1

        +

        May 26, 2016

        +
        +

        Bug Fixes

        +
          +
        • Gevent connection closes on IO timeout (PYTHON-573)

        • +
        • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

        • +
        +
        +
        +
        +

        3.4.0

        +

        May 24, 2016

        +
        +

        Features

        +
          +
        • Include DSE version and workload in Host data (PYTHON-555)

        • +
        • Add a context manager to Cluster and Session (PYTHON-521)

        • +
        • Better Error Message for Unsupported Protocol Version (PYTHON-157)

        • +
        • Make the error message explicitly state when an error comes from the server (PYTHON-412)

        • +
        • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

        • +
        • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

        • +
        • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

        • +
        • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

        • +
        • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

        • +
        • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

        • +
        • Write docs around working with datetime and timezones (PYTHON-394)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • High CPU utilization when using asyncore event loop (PYTHON-239)

        • +
        • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

        • +
        • Make stress scripts Python 2.6 compatible (PYTHON-434)

        • +
        • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

        • +
        • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

        • +
        • Cluster and Session do not GC after leaving scope (PYTHON-135)

        • +
        • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

        • +
        • Reprepare on_up with many clients causes node overload (PYTHON-556)

        • +
        • None inserted into host map when control connection node is decommissioned (PYTHON-548)

        • +
        • weakref.ref does not accept keyword arguments (github #585)

        • +
        +
        +
        +
        +

        3.3.0

        +

        May 2, 2016

        +
        +

        Features

        +
          +
        • Add an AddressTranslator interface (PYTHON-69)

        • +
        • New Retry Policy Decision - try next host (PYTHON-285)

        • +
        • Don’t mark host down on timeout (PYTHON-286)

        • +
        • SSL hostname verification (PYTHON-296)

        • +
        • Add C* version to metadata or cluster objects (PYTHON-301)

        • +
        • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

        • +
        • Expose listen_address of node we get ring information from (PYTHON-332)

        • +
        • Use A-record with multiple IPs for contact points (PYTHON-415)

        • +
        • Custom consistency level for populating query traces (PYTHON-435)

        • +
        • Normalize Server Exception Types (PYTHON-443)

        • +
        • Propagate exception message when DDL schema agreement fails (PYTHON-444)

        • +
        • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

        • +
        • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

        • +
        • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

        • +
        • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

        • +
        • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

        • +
        • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

        • +
        +
        +
        +
        +

        3.2.2

        +

        April 19, 2016

        +
          +
        • Fix counter save-after-no-update (PYTHON-547)

        • +
        +
        +
        +

        3.2.1

        +

        April 13, 2016

        +
          +
        • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

        • +
        +
        +
        +

        3.2.0

        +

        April 12, 2016

        +
        +

        Features

        +
          +
        • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

        • +
        • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

        • +
        • cqlengine: support non-equal conditions for LWT (PYTHON-528)

        • +
        • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

        • +
        • cqlengine: token-aware routing for mapper statements (PYTHON-535)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

        • +
        • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

        • +
        • comparing models with datetime fields fail #79 (PYTHON-273)

        • +
        • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

        • +
        • db_field is not always respected with UpdateStatement (PYTHON-530)

        • +
        • Sync_table fails on column.Set with secondary index (PYTHON-533)

        • +
        +
        +
        +
        +

        3.1.1

        +

        March 14, 2016

        +
        +

        Bug Fixes

        +
          +
        • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

        • +
        +
        +
        +
        +

        3.1.0

        +

        March 10, 2016

        +
        +

        Features

        +
          +
        • Pass name of server auth class to AuthProvider (PYTHON-454)

        • +
        • Surface schema agreed flag for DDL statements (PYTHON-458)

        • +
        • Automatically convert float and int to Decimal on serialization (PYTHON-468)

        • +
        • Eventlet Reactor IO improvement (PYTHON-495)

        • +
        • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

        • +
        • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

        • +
        • Add Session.default_serial_consistency_level (github #510)

        • +
        • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

        • +
        • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

        • +
        • cqlengine: Add DISTINCT query operator (PYTHON-266)

        • +
        • cqlengine: Tuple cqlengine api (PYTHON-306)

        • +
        • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

        • +
        • cqlengine: Allow nested container types (PYTHON-478)

        • +
        • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

        • +
        • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

        • +
        • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

        • +
        • Overflow when decoding large collections (cython) (PYTHON-459)

        • +
        • Timer heap comparison issue with Python 3 (github #466)

        • +
        • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

        • +
        • Decode error encountered when cython deserializing large map results (PYTHON-459)

        • +
        • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

        • +
        • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

        • +
        • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

        • +
        • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

        • +
        • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

        • +
        • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

        • +
        • cqlengine: db_field breaks UserType (PYTHON-346)

        • +
        • cqlengine: UDT badly quoted (PYTHON-347)

        • +
        • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

        • +
        • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

        • +
        • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

        • +
        • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

        • +
        • cqlengine: Better error for management functions when no connection set (PYTHON-451)

        • +
        • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

        • +
        • cqlengine: Fix inserting None for model save (PYTHON-475)

        • +
        • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

        • +
        • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

        • +
        • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

        • +
        +
        +
        +

        Other

        +
          +
        • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

        • +
        • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

        • +
        +
        +
        +
        +

        3.0.0

        +

        November 24, 2015

        +
        +

        Features

        +
          +
        • Support datetime.date objects as a DateType (PYTHON-212)

        • +
        • Add Cluster.update_view_metadata (PYTHON-407)

        • +
        • QueryTrace option to populate partial trace sessions (PYTHON-438)

        • +
        • Attach column names to ResultSet (PYTHON-439)

        • +
        • Change default consistency level to LOCAL_ONE

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

        • +
        • Evict UDTs from UserType cache on change (PYTHON-226)

        • +
        • Make sure query strings are always encoded UTF-8 (PYTHON-334)

        • +
        • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

        • +
        • UDT CQL encoding does not work for unicode values (PYTHON-353)

        • +
        • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

        • +
        • Cython integer overflow on decimal type deserialization (PYTHON-433)

        • +
        • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

        • +
        +
        +
        +
        +

        3.0.0rc1

        +

        November 9, 2015

        +
        +

        Features

        +
          +
        • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

        • +
        • Remove deprecated features (PYTHON-292)

        • +
        • Don’t assign trace data to Statements (PYTHON-318)

        • +
        • Normalize results return (PYTHON-368)

        • +
        • Process Materialized View Metadata/Events (PYTHON-371)

        • +
        • Remove blist as soft dependency (PYTHON-385)

        • +
        • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

        • +
        • Normalize CQL query/export in metadata model (PYTHON-405)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Implementation of named arguments bind is non-pythonic (PYTHON-178)

        • +
        • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

        • +
        • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

        • +
        • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

        • +
        • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

        • +
        +
        +
        +
        +

        2.7.2

        +

        September 14, 2015

        +
        +

        Bug Fixes

        +
          +
        • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

        • +
        • Remove futures dep. for Python 3 (PYTHON-393)

        • +
        • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

        • +
        • Unit test runtime issues (PYTHON-397,398)

        • +
        +
        +
        +
        +

        2.7.1

        +

        August 25, 2015

        +
        +

        Bug Fixes

        +
          +
        • Explicitly include extension source files in Manifest

        • +
        +
        +
        +
        +

        2.7.0

        +

        August 25, 2015

        +

        Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

        +
        +

        Features

        +
          +
        • General Performance Improvements for Throughput (PYTHON-283)

        • +
        • Improve synchronous request performance with Timers (PYTHON-108)

        • +
        • Enable C Extensions for PyPy Runtime (PYTHON-357)

        • +
        • Refactor SerDes functionality for pluggable interface (PYTHON-313)

        • +
        • Cython SerDes Extension (PYTHON-377)

        • +
        • Accept iterators/generators for execute_concurrent() (PYTHON-123)

        • +
        • cythonize existing modules (PYTHON-342)

        • +
        • Pure Python murmur3 implementation (PYTHON-363)

        • +
        • Make driver tolerant of inconsistent metadata (PYTHON-370)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

        • +
        • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

        • +
        • Blocking connect does not use connect_timeout (PYTHON-381)

        • +
        • Properly protect partition key in CQL export (PYTHON-375)

        • +
        • Trigger error callbacks on timeout (PYTHON-294)

        • +
        +
        +
        +
        +

        2.6.0

        +

        July 20, 2015

        +
        +

        Bug Fixes

        +
          +
        • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

        • +
        +
        +
        +
        +

        2.6.0c2

        +

        June 24, 2015

        +
        +

        Features

        +
          +
        • Automatic Protocol Version Downgrade (PYTHON-240)

        • +
        • cqlengine Python 2.6 compatibility (PYTHON-288)

        • +
        • Double-dollar string quote UDF body (PYTHON-345)

        • +
        • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Avoid stall while connecting to mixed version cluster (PYTHON-303)

        • +
        • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

        • +
        • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

        • +
        • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

        • +
        • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

        • +
        +
        +
        +
        +

        2.6.0c1

        +

        June 4, 2015

        +

        This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

        +
        +

        Features

        +
          +
        • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

        • +
        • Configuration option for connection timeout (PYTHON-206)

        • +
        • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

        • +
        • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

        • +
        • Implement new request failure messages in protocol v4+ (PYTHON-238)

        • +
        • Metadata model now maps index meta by index name (PYTHON-241)

        • +
        • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

        • +
        • cqle: add Double column type and remove Float overload (PYTHON-246)

        • +
        • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

        • +
        • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

        • +
        • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

        • +
        • Save trace id even when trace complete times out (PYTHON-302)

        • +
        • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

        • +
        • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

        • +
        • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

        • +
        • Expose CQL keywords in API (PYTHON-324)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • IPv6 address support on Windows (PYTHON-20)

        • +
        • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

        • +
        • cqle: Quote keywords properly in table management functions (PYTHON-244)

        • +
        • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

        • +
        • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

        • +
        • Make protocol read_inet work for Windows (PYTHON-309)

        • +
        • cqle: Correct encoding for nested types (PYTHON-311)

        • +
        • Update list of CQL keywords used quoting identifiers (PYTHON-319)

        • +
        • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

        • +
        • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

        • +
        +
        +
        +
        +

        2.5.1

        +

        April 23, 2015

        +
        +

        Bug Fixes

        +
          +
        • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

        • +
        • Fix race condition in node/token rebuild (PYTHON-298)

        • +
        • Set and send serial consistency parameter (PYTHON-299)

        • +
        +
        +
        +
        +

        2.5.0

        +

        March 30, 2015

        +
        +

        Features

        +
          +
        • Integrated cqlengine object mapping package

        • +
        • Utility functions for converting timeuuids and datetime (PYTHON-99)

        • +
        • Schema metadata fetch window randomized, config options added (PYTHON-202)

        • +
        • Support for new Date and Time Cassandra types (PYTHON-190)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

        • +
        • Thread exception during GIL cleanup (PYTHON-229)

        • +
        • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

        • +
        • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

        • +
        • Support reading CompositeType data (PYTHON-234)

        • +
        • Preserve float precision in CQL encoding (PYTHON-243)

        • +
        +
        +
        +
        +

        2.1.4

        +

        January 26, 2015

        +
        +

        Features

        +
          +
        • SaslAuthenticator for Kerberos support (PYTHON-109)

        • +
        • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

        • +
        • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

        • +
        • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

        • +
        • Add eventlet connection support (PYTHON-194)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Schema meta fix for complex thrift tables (PYTHON-191)

        • +
        • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

        • +
        • Resolve stream ID leak on set_keyspace (PYTHON-195)

        • +
        • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

        • +
        • Resolve stream id collision when using SASL auth (PYTHON-210)

        • +
        • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

        • +
        +
        +
        +
        +

        2.1.3

        +

        December 16, 2014

        +
        +

        Features

        +
          +
        • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

        • +
        • Avoid connecting to peer with incomplete metadata (PYTHON-163)

        • +
        • Add SSL support to gevent reactor (PYTHON-174)

        • +
        • Use control connection timeout in wait for schema agreement (PYTHON-175)

        • +
        • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

        • +
        • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Support large negative timestamps on Windows (PYTHON-119)

        • +
        • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

        • +
        • Retain table metadata following keyspace meta refresh (PYTHON-173)

        • +
        • Use a timeout when preparing a statement for all nodes (PYTHON-179)

        • +
        • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

        • +
        • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

        • +
        • Correct routing key encoding for composite keys (PYTHON-184)

        • +
        • Include compression option in schema export string when disabled (PYTHON-187)

        • +
        +
        +
        +
        +

        2.1.2

        +

        October 16, 2014

        +
        +

        Features

        +
          +
        • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

        • +
        • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

        • +
        • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

        • +
        • Handle Unauthorized message on schema_triggers query (PYTHON-155)

        • +
        • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

        • +
        • Support CUSTOM index metadata and string export (PYTHON-165)

        • +
        +
        +
        +
        +

        2.1.1

        +

        September 11, 2014

        +
        +

        Features

        +
          +
        • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

        • +
        • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

        • +
        • Keep timeout for paged results (PYTHON-150)

        • +
        +
        +
        +

        Other

        +
          +
        • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

        • +
        +
        +
        +
        +

        2.1.0

        +

        August 7, 2014

        +
        +

        Bug Fixes

        +
          +
        • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

        • +
        • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

        • +
        +
        +
        +
        +

        2.1.0c1

        +

        July 25, 2014

        +
        +

        Bug Fixes

        +
          +
        • Properly specify UDTs for columns in CREATE TABLE statements

        • +
        • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

        • +
        • Don’t ignore fetch_size arguments to Statement constructors (github-151)

        • +
        • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

        • +
        • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

        • +
        • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

        • +
        • Raise TypeError when a string is used for contact_points (github #164)

        • +
        • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

        • +
        +
        +
        +

        Other

        +
          +
        • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

        • +
        +
        +
        +
        +

        2.1.0b1

        +

        July 11, 2014

        +

        This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

        +
        +

        Features

        +
          +
        • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

        • +
        • Support for user-defined types (Cassandra 2.1+)

        • +
        • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

        • +
        • Protocol-level client-side timestamps (see Session.use_client_timestamp)

        • +
        • Overridable type encoding for non-prepared statements (see Session.encoders)

        • +
        • Configurable serial consistency levels for batch statements

        • +
        • Use io.BytesIO for reduced CPU consumption (github #143)

        • +
        • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

        • +
        • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

        • +
        • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

        • +
        • Don’t share prepared statement lock across Cluster instances

        • +
        • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

        • +
        • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

        • +
        • Properly defunct connections after protocol errors

        • +
        • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

        • +
        • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

        • +
        • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

        • +
        • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

        • +
        • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

        • +
        • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

        • +
        • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

        • +
        +
        +
        +
        +

        2.0.2

        +

        June 10, 2014

        +
        +

        Bug Fixes

        +
          +
        • Add six to requirements.txt

        • +
        • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

        • +
        • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

        • +
        • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

        • +
        • Add python-six to debian dependencies, move python-blist to recommends

        • +
        • Fix memory leak when libev connections are created and +destroyed (github #93)

        • +
        • Ensure token map is rebuilt when hosts are removed from the cluster

        • +
        +
        +
        +
        +

        2.0.1

        +

        May 28, 2014

        +
        +

        Bug Fixes

        +
          +
        • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

        • +
        +
        +
        +
        +

        2.0.0

        +

        May 28, 2014

        +
        +

        Features

        +
          +
        • Make libev C extension Python3-compatible (PYTHON-70)

        • +
        • Support v2 protocol authentication (PYTHON-73, github #125)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix murmur3 C extension compilation under Python3.4 (github #124)

        • +
        +
        +
        +

        Merged From 1.x

        +
        +

        Features

        +
          +
        • Add Session.default_consistency_level (PYTHON-14)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

        • +
        • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

        • +
        • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

        • +
        • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

        • +
        • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

        • +
        • Avoid rebuilding token metadata when cluster topology has not +actually changed

        • +
        • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

        • +
        +
        +
        +

        Other

        +
          +
        • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

        • +
        +
        +
        +
        +
        +

        2.0.0b1

        +

        May 6, 2014

        +
        +

        Upgrading from 1.x

        +

        Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

        +

        If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

        +
        +

        cluster = Cluster(…, protocol_version=1)

        +
        +
        +
        +

        Features

        +
          +
        • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

        • +
        • Support for Python 3.3 and 3.4

        • +
        • Allow a default query timeout to be set per-Session

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

        • +
        +
        +
        +

        Deprecations

        +

        The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

        +
          +
        • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

        • +
        • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

        • +
        • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

        • +
        • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

        • +
        +

        Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

        +
        +
        +
        +

        1.1.2

        +

        May 8, 2014

        +
        +

        Features

        +
          +
        • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

        • +
        • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

        • +
        • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

        • +
        • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

        • +
        • Handle exhausted ReconnectionPolicy schedule correctly

        • +
        +
        +
        +

        Other

        +
          +
        • Don’t log at ERROR when a connection is closed during the startup +communications

        • +
        • Mke scales, blist optional dependencies

        • +
        +
        +
        +
        +

        1.1.1

        +

        April 16, 2014

        +
        +

        Bug Fixes

        +
          +
        • Fix unconditional import of nose in setup.py (github #111)

        • +
        +
        +
        +
        +

        1.1.0

        +

        April 16, 2014

        +
        +

        Features

        +
          +
        • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

        • +
        • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

        • +
        • Add debian packaging (github issue #101)

        • +
        • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

        • +
        • Lowercase boolean literals when generating schemas

        • +
        • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

        • +
        • Don’t reconnect the control connection every time Cluster.connect() is +called

        • +
        • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

        • +
        • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

        • +
        • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

        • +
        • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

        • +
        • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

        • +
        +
        +
        +

        Other

        +
          +
        • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

        • +
        • Better error message when libevwrapper is not found

        • +
        • Only try to import scales when metrics are enabled (github issue #92)

        • +
        • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

        • +
        • Issue warning log when schema versions do not match

        • +
        +
        +
        +
        +

        1.0.2

        +

        March 4, 2014

        +
        +

        Bug Fixes

        +
          +
        • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

        • +
        • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

        • +
        • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

        • +
        • Handle latest table options when parsing the schema and generating +CREATE statements.

        • +
        • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

        • +
        +
        +
        +

        Other

        +
          +
        • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

        • +
        • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

        • +
        • More consistent type checking for query parameters

        • +
        • Add option to a return special object for empty string values for non-string +columns

        • +
        +
        +
        +
        +

        1.0.1

        +

        Feb 19, 2014

        +
        +

        Bug Fixes

        +
          +
        • Include table indexes in KeyspaceMetadata.export_as_string()

        • +
        • Fix broken token awareness on ByteOrderedPartitioner

        • +
        • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

        • +
        • Handle “custom” types (such as the replaced DateType) correctly

        • +
        • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

        • +
        • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

        • +
        • Handle data that is already utf8-encoded for UTF8Type values

        • +
        • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

        • +
        • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

        • +
        +
        +
        +

        Other

        +
          +
        • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

        • +
        • Add details about errors and the last queried host to OperationTimedOut

        • +
        +
        +
        +
        +

        1.0.0 Final

        +

        Jan 29, 2014

        +
        +

        Bug Fixes

        +
          +
        • Prevent leak of Scheduler thread (even with proper shutdown)

        • +
        • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

        • +
        • Hold strong reference to prepared statement while executing it to avoid +garbage collection

        • +
        • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

        • +
        • Fix bad handling of nodes that have been removed from the cluster

        • +
        • Properly escape string types within cql collections

        • +
        • Handle setting the same keyspace twice in a row

        • +
        • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

        • +
        • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

        • +
        • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

        • +
        • Fix endless hanging of some requests when using the libev reactor

        • +
        • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

        • +
        • Generators map to CQL lists, not key sequences

        • +
        • Always defunct connections when an internal operation fails

        • +
        • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

        • +
        • Avoid potential double-erroring of callbacks when a connection +becomes defunct

        • +
        +
        +
        +

        Features

        +
          +
        • Add default query timeout to Session

        • +
        • Add timeout parameter to Session.execute()

        • +
        • Add WhiteListRoundRobinPolicy as a load balancing policy option

        • +
        • Support for consistency level LOCAL_ONE

        • +
        • Make the backoff for fetching traces exponentially increasing and +configurable

        • +
        +
        +
        +

        Other

        +
          +
        • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

        • +
        • Add encoder mapping for OrderedDict

        • +
        • Use timeouts on all control connection queries

        • +
        • Benchmark improvements, including command line options and eay +multithreading support

        • +
        • Reduced lock contention when using the asyncore reactor

        • +
        • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

        • +
        • Add requirements.txt and test-requirements.txt

        • +
        • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

        • +
        +
        +
        +
        +

        1.0.0b7

        +

        Nov 12, 2013

        +

        This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

        +
        +

        Features

        +
          +
        • Add timeout kwarg to ResponseFuture.result()

        • +
        • Create connection pools to all hosts in parallel when initializing +new Sesssions.

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Properly set exception on ResponseFuture when a query fails +against all hosts

        • +
        • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

        • +
        • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

        • +
        • Better error messages for failed Session.prepare() opertaions

        • +
        • Prepare new statements against all hosts in parallel (formerly +sequential)

        • +
        • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

        • +
        • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

        • +
        • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

        • +
        • Throttle trashing of underutilized connections to avoid trashing newly +created connections

        • +
        • Fix race condition which could result in trashed connections being closed +before the last operations had completed

        • +
        • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

        • +
        • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

        • +
        • Correctly handle large messages through libev

        • +
        • Add timeout to schema agreement check queries

        • +
        • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

        • +
        +
        +
        +

        Other

        +
          +
        • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

        • +
        • Better debug logging around connection management

        • +
        • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

        • +
        +
        +
        +
        +

        1.0.0b6

        +

        Oct 22, 2013

        +
        +

        Bug Fixes

        +
          +
        • Use lazy string formatting when logging

        • +
        • Avoid several deadlock scenarios, especially when nodes go down

        • +
        • Avoid trashing newly created connections due to insufficient traffic

        • +
        • Gracefully handle un-handled Exceptions when erroring callbacks

        • +
        +
        +
        +

        Other

        +
          +
        • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

        • +
        +
        +
        +
        +

        1.0.0b5

        +

        Oct 10, 2013

        +
        +

        Features

        +
          +
        • SSL support

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Avoid KeyError when building replica map for NetworkTopologyStrategy

        • +
        • Work around python bug which causes deadlock when a thread imports +the utf8 module

        • +
        • Handle no blist library, which is not compatible with pypy

        • +
        • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

        • +
        +
        +
        +

        Other

        +
          +
        • Switch packaging from Distribute to setuptools, improved C extension +support

        • +
        • Use PEP 386 compliant beta and post-release versions

        • +
        +
        +
        +
        +

        1.0.0-beta4

        +

        Sep 24, 2013

        +
        +

        Features

        +
          +
        • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

        • +
        • Add cql_version kwarg to Cluster.__init__

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

        • +
        • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

        • +
        +
        +
        +
        +

        1.0.0-beta3

        +

        Sep 20, 2013

        +
        +

        Features

        +
          +
        • Support for LZ4 compression (Cassandra 2.0+)

        • +
        • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

        • +
        +
        +
        +

        Bug Fixes

        +
          +
        • Fix libev include path for CentOS

        • +
        • Fix varint packing of the value 0

        • +
        • Correctly pack unicode values

        • +
        • Don’t attempt to return failed connections to the pool when a final result +is set

        • +
        • Fix bad iteration of connection credentials

        • +
        • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

        • +
        • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

        • +
        • Boolean constants shouldn’t be surrounded by single quotes

        • +
        • Avoid a potential loss of precision on float constants due to string +formatting

        • +
        • Actually utilize non-standard ports set on Cluster objects

        • +
        • Fix export of schema as a set of CQL queries

        • +
        +
        +
        +

        Other

        +
          +
        • Use cStringIO for connection buffer for better performance

        • +
        • Add __repr__ method for Statement classes

        • +
        • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

        • +
        • Make all tests compatible with Python 2.6

        • +
        • Add 1s timeout for opening new connections

        • +
        +
        +
        +
        +

        1.0.0-beta2

        +

        Aug 19, 2013

        +
        +

        Bug Fixes

        +
          +
        • Fix pip packaging

        • +
        +
        +
        +
        +

        1.0.0-beta

        +

        Aug 16, 2013

        +

        Initial release

        +
        +
        + + +
        + + + + + +
        + + +
        +
        +

        +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

        +
        +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/CNAME b/3.24.8-scylla/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/3.24.8-scylla/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/3.24.8-scylla/_sources/CHANGELOG.rst.txt b/3.24.8-scylla/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/3.24.8-scylla/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/3.24.8-scylla/_sources/api/cassandra.rst.txt b/3.24.8-scylla/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/auth.rst.txt b/3.24.8-scylla/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/cluster.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..2b3d7828a8 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/3.24.8-scylla/_sources/api/cassandra/concurrent.rst.txt b/3.24.8-scylla/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/3.24.8-scylla/_sources/api/cassandra/connection.rst.txt b/3.24.8-scylla/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/3.24.8-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/3.24.8-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/3.24.8-scylla/_sources/api/cassandra/cqlengine/management.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/3.24.8-scylla/_sources/api/cassandra/cqlengine/models.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/3.24.8-scylla/_sources/api/cassandra/cqlengine/query.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/3.24.8-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt b/3.24.8-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..dafd5f65fd --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,121 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: T + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/decoder.rst.txt b/3.24.8-scylla/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/3.24.8-scylla/_sources/api/cassandra/encoder.rst.txt b/3.24.8-scylla/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/3.24.8-scylla/_sources/api/cassandra/graph.rst.txt b/3.24.8-scylla/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt b/3.24.8-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt b/3.24.8-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt b/3.24.8-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/io/geventreactor.rst.txt b/3.24.8-scylla/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/io/libevreactor.rst.txt b/3.24.8-scylla/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/3.24.8-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt b/3.24.8-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/3.24.8-scylla/_sources/api/cassandra/metadata.rst.txt b/3.24.8-scylla/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..7c1280bcf7 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,93 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: ReplicationFactor + :members: + :exclude-members: create + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/3.24.8-scylla/_sources/api/cassandra/metrics.rst.txt b/3.24.8-scylla/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/policies.rst.txt b/3.24.8-scylla/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/pool.rst.txt b/3.24.8-scylla/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/3.24.8-scylla/_sources/api/cassandra/protocol.rst.txt b/3.24.8-scylla/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/3.24.8-scylla/_sources/api/cassandra/query.rst.txt b/3.24.8-scylla/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/3.24.8-scylla/_sources/api/cassandra/timestamps.rst.txt b/3.24.8-scylla/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/3.24.8-scylla/_sources/api/cassandra/util.rst.txt b/3.24.8-scylla/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/3.24.8-scylla/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/3.24.8-scylla/_sources/api/index.rst.txt b/3.24.8-scylla/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/3.24.8-scylla/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/3.24.8-scylla/_sources/cqlengine/batches.rst.txt b/3.24.8-scylla/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/3.24.8-scylla/_sources/cqlengine/connections.rst.txt b/3.24.8-scylla/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/3.24.8-scylla/_sources/cqlengine/faq.rst.txt b/3.24.8-scylla/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/3.24.8-scylla/_sources/cqlengine/models.rst.txt b/3.24.8-scylla/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/3.24.8-scylla/_sources/cqlengine/queryset.rst.txt b/3.24.8-scylla/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/3.24.8-scylla/_sources/cqlengine/third_party.rst.txt b/3.24.8-scylla/_sources/cqlengine/third_party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/third_party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/3.24.8-scylla/_sources/cqlengine/upgrade_guide.rst.txt b/3.24.8-scylla/_sources/cqlengine/upgrade_guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/3.24.8-scylla/_sources/cqlengine/upgrade_guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/3.24.8-scylla/_sources/dates_and_times.rst.txt b/3.24.8-scylla/_sources/dates_and_times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/3.24.8-scylla/_sources/dates_and_times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/3.24.8-scylla/_sources/execution_profiles.rst.txt b/3.24.8-scylla/_sources/execution_profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/3.24.8-scylla/_sources/execution_profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/3.24.8-scylla/_sources/faq.rst.txt b/3.24.8-scylla/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/3.24.8-scylla/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/3.24.8-scylla/_sources/getting_started.rst.txt b/3.24.8-scylla/_sources/getting_started.rst.txt new file mode 100644 index 0000000000..8cb86a5504 --- /dev/null +++ b/3.24.8-scylla/_sources/getting_started.rst.txt @@ -0,0 +1,473 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to Cassandra +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +The simplest way to create a :class:`~.Cluster` is like this: +First, make sure you have the Cassandra driver properly :doc:`installed `. + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +^^^^^^^^^^^^^^^^ +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +^^^^^^^^^^^^^^^^^^^^ +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +^^^^^^^^^^^^^^^^^^^^^ + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/3.24.8-scylla/_sources/index.rst.txt b/3.24.8-scylla/_sources/index.rst.txt new file mode 100644 index 0000000000..2fda976914 --- /dev/null +++ b/3.24.8-scylla/_sources/index.rst.txt @@ -0,0 +1,105 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting_started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla_specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution_profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object_mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query_paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user_defined_types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates_and_times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla_cloud` + Connect to Scylla Cloud + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting_started + scylla_specific + upgrading + execution_profiles + performance + query_paging + lwt + security + user_defined_types + object_mapper + dates_and_times + scylla_cloud + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. + + diff --git a/3.24.8-scylla/_sources/installation.rst.txt b/3.24.8-scylla/_sources/installation.rst.txt new file mode 100644 index 0000000000..be6aacd9b3 --- /dev/null +++ b/3.24.8-scylla/_sources/installation.rst.txt @@ -0,0 +1,234 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/3.24.8-scylla/_sources/lwt.rst.txt b/3.24.8-scylla/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/3.24.8-scylla/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/3.24.8-scylla/_sources/object_mapper.rst.txt b/3.24.8-scylla/_sources/object_mapper.rst.txt new file mode 100644 index 0000000000..50d3cbf320 --- /dev/null +++ b/3.24.8-scylla/_sources/object_mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade_guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third_party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade_guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third_party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/3.24.8-scylla/_sources/performance.rst.txt b/3.24.8-scylla/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/3.24.8-scylla/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/3.24.8-scylla/_sources/query_paging.rst.txt b/3.24.8-scylla/_sources/query_paging.rst.txt new file mode 100644 index 0000000000..23ee2c1129 --- /dev/null +++ b/3.24.8-scylla/_sources/query_paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_state'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/3.24.8-scylla/_sources/scylla_cloud.rst.txt b/3.24.8-scylla/_sources/scylla_cloud.rst.txt new file mode 100644 index 0000000000..62aaf76433 --- /dev/null +++ b/3.24.8-scylla/_sources/scylla_cloud.rst.txt @@ -0,0 +1,5 @@ +Scylla Cloud +------------ + +To connect to a `Scylla Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/3.24.8-scylla/_sources/scylla_specific.rst.txt b/3.24.8-scylla/_sources/scylla_specific.rst.txt new file mode 100644 index 0000000000..366628e59b --- /dev/null +++ b/3.24.8-scylla/_sources/scylla_specific.rst.txt @@ -0,0 +1,84 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/design-notes/protocol-extensions.md + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Table Attributes +-------------------- + +* ``in_memory`` flag + + New flag available on ``TableMetadata.options`` to indicate that it is an `In Memory `_ table + +.. note:: in memory tables is a feature existing only in Scylla Enterprise + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; + """) + + session.execute(""" + CREATE TABLE IF NOT EXISTS keyspace1.standard1 ( + key blob PRIMARY KEY, + "C0" blob + ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'} + """) + + cluster.refresh_table_metadata("keyspace1", "standard1") + assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True diff --git a/3.24.8-scylla/_sources/security.rst.txt b/3.24.8-scylla/_sources/security.rst.txt new file mode 100644 index 0000000000..0276f6fc51 --- /dev/null +++ b/3.24.8-scylla/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1 + + ssl_context = SSLContext(PROTOCOL_TLSv1) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLSv1) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLSv1) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLSv1`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLSv1, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLSv1, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/3.24.8-scylla/_sources/upgrading.rst.txt b/3.24.8-scylla/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..9559fa3579 --- /dev/null +++ b/3.24.8-scylla/_sources/upgrading.rst.txt @@ -0,0 +1,388 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Upgrading from dse-driver +------------------------- + +Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes. + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/3.24.8-scylla/_sources/user_defined_types.rst.txt b/3.24.8-scylla/_sources/user_defined_types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/3.24.8-scylla/_sources/user_defined_types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
        )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
        )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
        )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/3.24.8-scylla/_static/basic.css b/3.24.8-scylla/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/3.24.8-scylla/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/3.24.8-scylla/_static/check-solid.svg b/3.24.8-scylla/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/3.24.8-scylla/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.24.8-scylla/_static/clipboard.min.js b/3.24.8-scylla/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/3.24.8-scylla/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/3.24.8-scylla/_static/copybutton.css b/3.24.8-scylla/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/3.24.8-scylla/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

        Short

        + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/3.24.8-scylla/_static/copybutton.js b/3.24.8-scylla/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/3.24.8-scylla/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/3.24.8-scylla/_static/copybutton_funcs.js b/3.24.8-scylla/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/3.24.8-scylla/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/3.24.8-scylla/_static/css/main.css b/3.24.8-scylla/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/3.24.8-scylla/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/3.24.8-scylla/_static/doctools.js b/3.24.8-scylla/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/3.24.8-scylla/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/3.24.8-scylla/_static/documentation_options.js b/3.24.8-scylla/_static/documentation_options.js new file mode 100644 index 0000000000..cf7e8730c4 --- /dev/null +++ b/3.24.8-scylla/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.24.8', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/3.24.8-scylla/_static/file.png b/3.24.8-scylla/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/3.24.8-scylla/_static/file.png differ diff --git a/3.24.8-scylla/_static/img/banner-background.svg b/3.24.8-scylla/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/3.24.8-scylla/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/favicon-228x228.png b/3.24.8-scylla/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/3.24.8-scylla/_static/img/favicon-228x228.png differ diff --git a/3.24.8-scylla/_static/img/favicon-32x32.png b/3.24.8-scylla/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/3.24.8-scylla/_static/img/favicon-32x32.png differ diff --git a/3.24.8-scylla/_static/img/favicon.ico b/3.24.8-scylla/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/3.24.8-scylla/_static/img/favicon.ico differ diff --git a/3.24.8-scylla/_static/img/icons/icon-about-team.svg b/3.24.8-scylla/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/3.24.8-scylla/_static/img/icons/icon-about-us-m.svg b/3.24.8-scylla/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-about-us.svg b/3.24.8-scylla/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-alternator.svg b/3.24.8-scylla/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-apps.svg b/3.24.8-scylla/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-architecture.svg b/3.24.8-scylla/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/3.24.8-scylla/_static/img/icons/icon-benchmarks.svg b/3.24.8-scylla/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/3.24.8-scylla/_static/img/icons/icon-blog.svg b/3.24.8-scylla/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/3.24.8-scylla/_static/img/icons/icon-careers.svg b/3.24.8-scylla/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/3.24.8-scylla/_static/img/icons/icon-chevron-left.svg b/3.24.8-scylla/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-chevron-right.svg b/3.24.8-scylla/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-circe.svg b/3.24.8-scylla/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-clock.svg b/3.24.8-scylla/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-close.svg b/3.24.8-scylla/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-cloud-docs.svg b/3.24.8-scylla/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-cloud.svg b/3.24.8-scylla/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-comparison.svg b/3.24.8-scylla/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/3.24.8-scylla/_static/img/icons/icon-contact-us.svg b/3.24.8-scylla/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/3.24.8-scylla/_static/img/icons/icon-developers-blog.svg b/3.24.8-scylla/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/3.24.8-scylla/_static/img/icons/icon-docs.svg b/3.24.8-scylla/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/3.24.8-scylla/_static/img/icons/icon-enterprise-m.svg b/3.24.8-scylla/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-enterprise.svg b/3.24.8-scylla/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-events.svg b/3.24.8-scylla/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/3.24.8-scylla/_static/img/icons/icon-exclamation.svg b/3.24.8-scylla/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-expand.svg b/3.24.8-scylla/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-forum.svg b/3.24.8-scylla/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-getting-started.svg b/3.24.8-scylla/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-glossary.svg b/3.24.8-scylla/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-home.svg b/3.24.8-scylla/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-infoworld.svg b/3.24.8-scylla/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/3.24.8-scylla/_static/img/icons/icon-integrations.svg b/3.24.8-scylla/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-knowledge-base.svg b/3.24.8-scylla/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-less.svg b/3.24.8-scylla/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-live-test.svg b/3.24.8-scylla/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/3.24.8-scylla/_static/img/icons/icon-mail-list.svg b/3.24.8-scylla/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-manager.svg b/3.24.8-scylla/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/3.24.8-scylla/_static/img/icons/icon-memory-management.svg b/3.24.8-scylla/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/3.24.8-scylla/_static/img/icons/icon-modeling.svg b/3.24.8-scylla/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-monitoring.svg b/3.24.8-scylla/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/3.24.8-scylla/_static/img/icons/icon-networking.svg b/3.24.8-scylla/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/3.24.8-scylla/_static/img/icons/icon-news.svg b/3.24.8-scylla/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/3.24.8-scylla/_static/img/icons/icon-newsletter.svg b/3.24.8-scylla/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/3.24.8-scylla/_static/img/icons/icon-nsql-guides.svg b/3.24.8-scylla/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/3.24.8-scylla/_static/img/icons/icon-open-source.svg b/3.24.8-scylla/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/3.24.8-scylla/_static/img/icons/icon-operator.svg b/3.24.8-scylla/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-overview.svg b/3.24.8-scylla/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/3.24.8-scylla/_static/img/icons/icon-partners.svg b/3.24.8-scylla/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/3.24.8-scylla/_static/img/icons/icon-plus.svg b/3.24.8-scylla/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-pricing.svg b/3.24.8-scylla/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/3.24.8-scylla/_static/img/icons/icon-release-notes.svg b/3.24.8-scylla/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/3.24.8-scylla/_static/img/icons/icon-resource-center.svg b/3.24.8-scylla/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/3.24.8-scylla/_static/img/icons/icon-roadmap.svg b/3.24.8-scylla/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/3.24.8-scylla/_static/img/icons/icon-search.svg b/3.24.8-scylla/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-slack.svg b/3.24.8-scylla/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-stack-overflow.svg b/3.24.8-scylla/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-summit.svg b/3.24.8-scylla/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/icons/icon-support.svg b/3.24.8-scylla/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/3.24.8-scylla/_static/img/icons/icon-tech-talks.svg b/3.24.8-scylla/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/3.24.8-scylla/_static/img/icons/icon-testing.svg b/3.24.8-scylla/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/3.24.8-scylla/_static/img/icons/icon-thumbs-down.svg b/3.24.8-scylla/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-thumbs-up.svg b/3.24.8-scylla/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.24.8-scylla/_static/img/icons/icon-tip.svg b/3.24.8-scylla/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-training.svg b/3.24.8-scylla/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/3.24.8-scylla/_static/img/icons/icon-triangle-down.svg b/3.24.8-scylla/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-university.svg b/3.24.8-scylla/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/3.24.8-scylla/_static/img/icons/icon-users-blog.svg b/3.24.8-scylla/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/3.24.8-scylla/_static/img/icons/icon-warning.svg b/3.24.8-scylla/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/icons/icon-webinars.svg b/3.24.8-scylla/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/3.24.8-scylla/_static/img/icons/icon-whitepapers.svg b/3.24.8-scylla/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/3.24.8-scylla/_static/img/icons/icon-workshop.svg b/3.24.8-scylla/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/3.24.8-scylla/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/3.24.8-scylla/_static/img/logo-docs.svg b/3.24.8-scylla/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/3.24.8-scylla/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/logo-scylla-horizontal-RGB.svg b/3.24.8-scylla/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/3.24.8-scylla/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.24.8-scylla/_static/img/mascots/404.jpg b/3.24.8-scylla/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/404.jpg differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-3monsters.png b/3.24.8-scylla/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-3monsters.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-advisor-crystal.png b/3.24.8-scylla/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-alternator.svg b/3.24.8-scylla/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/3.24.8-scylla/_static/img/mascots/scylla-cloud.svg b/3.24.8-scylla/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/3.24.8-scylla/_static/img/mascots/scylla-computer-3-monsters.png b/3.24.8-scylla/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-computer-headset.png b/3.24.8-scylla/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-computer-headset.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-cup-number-one.png b/3.24.8-scylla/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-docs.svg b/3.24.8-scylla/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/3.24.8-scylla/_static/img/mascots/scylla-drivers.svg b/3.24.8-scylla/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/3.24.8-scylla/_static/img/mascots/scylla-enterprise.svg b/3.24.8-scylla/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/3.24.8-scylla/_static/img/mascots/scylla-forklift-boxes.png b/3.24.8-scylla/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-forklift-migration.png b/3.24.8-scylla/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-gear.png b/3.24.8-scylla/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-gear.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-hardhat.png b/3.24.8-scylla/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-hardhat.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-headband.png b/3.24.8-scylla/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-headband.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-headset.png b/3.24.8-scylla/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-headset.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-hearts.png b/3.24.8-scylla/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-hearts.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-looking-down.png b/3.24.8-scylla/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-looking-down.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-looking-up.png b/3.24.8-scylla/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-looking-up.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png b/3.24.8-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-magnifying-glass.png b/3.24.8-scylla/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-manager.svg b/3.24.8-scylla/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/3.24.8-scylla/_static/img/mascots/scylla-monitor.svg b/3.24.8-scylla/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/3.24.8-scylla/_static/img/mascots/scylla-movement-fast.png b/3.24.8-scylla/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-movement-fast.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-movement.png b/3.24.8-scylla/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-movement.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-onpremise.png b/3.24.8-scylla/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-onpremise.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-opensource.svg b/3.24.8-scylla/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/3.24.8-scylla/_static/img/mascots/scylla-operator.svg b/3.24.8-scylla/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/3.24.8-scylla/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/3.24.8-scylla/_static/img/mascots/scylla-plugin.png b/3.24.8-scylla/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-plugin.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-release-mascot.png b/3.24.8-scylla/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-release-mascot.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-repair.png b/3.24.8-scylla/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-repair.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-server.png b/3.24.8-scylla/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-server.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-sleeping.png b/3.24.8-scylla/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-sleeping.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-tall-measure.png b/3.24.8-scylla/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-tall-measure.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-university.png b/3.24.8-scylla/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-university.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-weights.png b/3.24.8-scylla/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-weights.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-window-cleaning.png b/3.24.8-scylla/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-with-computer-2.png b/3.24.8-scylla/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-with-computer.png b/3.24.8-scylla/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-with-computer.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-with-linux.png b/3.24.8-scylla/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-with-linux.png differ diff --git a/3.24.8-scylla/_static/img/mascots/scylla-writting.png b/3.24.8-scylla/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/3.24.8-scylla/_static/img/mascots/scylla-writting.png differ diff --git a/3.24.8-scylla/_static/img/menu.svg b/3.24.8-scylla/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/3.24.8-scylla/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.24.8-scylla/_static/js/main.bundle.js b/3.24.8-scylla/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/3.24.8-scylla/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
      • Back
      • ',backButtonPosition:"top",wrapper:"
        ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
          "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
          ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
          ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
          ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
          ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra - Exceptions and Enums

          +
          +
          +cassandra.__version_info__
          +

          The version of the driver in a tuple format

          +
          + +
          +
          +cassandra.__version__
          +

          The version of the driver in a string format

          +
          + +
          +
          +class cassandra.ConsistencyLevel
          +

          Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

          +
          +
          +ANY = 0
          +

          Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

          +
          + +
          +
          +ONE = 1
          +

          Only one replica needs to respond to consider the operation a success

          +
          + +
          +
          +TWO = 2
          +

          Two replicas must respond to consider the operation a success

          +
          + +
          +
          +THREE = 3
          +

          Three replicas must respond to consider the operation a success

          +
          + +
          +
          +QUORUM = 4
          +

          ceil(RF/2) + 1 replicas must respond to consider the operation a success

          +
          + +
          +
          +ALL = 5
          +

          All replicas must respond to consider the operation a success

          +
          + +
          +
          +LOCAL_QUORUM = 6
          +

          Requires a quorum of replicas in the local datacenter

          +
          + +
          +
          +EACH_QUORUM = 7
          +

          Requires a quorum of replicas in each datacenter

          +
          + +
          +
          +SERIAL = 8
          +

          For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

          +
          + +
          +
          +LOCAL_SERIAL = 9
          +

          Like SERIAL, but only requires consensus +among replicas in the local datacenter.

          +
          + +
          +
          +LOCAL_ONE = 10
          +

          Sends a request only to replicas in the local datacenter and waits for +one response.

          +
          + +
          + +
          +
          +class cassandra.ProtocolVersion
          +

          Defines native protocol versions supported by this driver.

          +
          +
          +V1 = 1
          +

          v1, supported in Cassandra 1.2–>2.2

          +
          + +
          +
          +V2 = 2
          +

          v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

          +
          + +
          +
          +V3 = 3
          +

          v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

          +
          + +
          +
          +V4 = 4
          +

          v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

          +
          + +
          +
          +V5 = 5
          +

          v5, in beta from 3.x+. Finalised in 4.0-beta5

          +
          + +
          +
          +V6 = 6
          +

          v6, in beta from 4.0-beta5

          +
          + +
          +
          +DSE_V1 = 65
          +

          DSE private protocol v1, supported in DSE 5.1+

          +
          + +
          +
          +DSE_V2 = 66
          +

          DSE private protocol v2, supported in DSE 6.0+

          +
          + +
          +
          +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
          +

          A tuple of all supported protocol versions

          +
          + +
          +
          +BETA_VERSIONS = (6,)
          +

          A tuple of all beta protocol versions

          +
          + +
          +
          +MIN_SUPPORTED = 1
          +

          Minimum protocol version supported by this driver.

          +
          + +
          +
          +MAX_SUPPORTED = 66
          +

          Maximum protocol version supported by this driver.

          +
          + +
          +
          +classmethod get_lower_supported(previous_version)
          +

          Return the lower supported protocol version. Beta versions are omitted.

          +
          + +
          + +
          +
          +class cassandra.UserFunctionDescriptor(name, argument_types)
          +

          Describes a User function by name and argument signature

          +
          +
          +name = None
          +

          name of the function

          +
          + +
          +
          +argument_types = None
          +

          Ordered list of CQL argument type names comprising the type signature

          +
          + +
          +
          +property signature
          +

          function signature string in the form ‘name([type0[,type1[…]]])’

          +

          can be used to uniquely identify overloaded function names within a keyspace

          +
          + +
          + +
          +
          +class cassandra.UserAggregateDescriptor(name, argument_types)
          +

          Describes a User aggregate function by name and argument signature

          +
          +
          +name = None
          +

          name of the aggregate

          +
          + +
          +
          +argument_types = None
          +

          Ordered list of CQL argument type names comprising the type signature

          +
          + +
          +
          +property signature
          +

          function signature string in the form ‘name([type0[,type1[…]]])’

          +

          can be used to uniquely identify overloaded function names within a keyspace

          +
          + +
          + +
          +
          +exception cassandra.DriverException
          +

          Base for all exceptions explicitly raised by the driver.

          +
          + +
          +
          +exception cassandra.RequestExecutionException
          +

          Base for request execution exceptions returned from the server.

          +
          + +
          +
          +exception cassandra.Unavailable
          +

          There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

          +
          +
          +consistency = None
          +

          The requested ConsistencyLevel

          +
          + +
          +
          +required_replicas = None
          +

          The number of replicas that needed to be live to complete the operation

          +
          + +
          +
          +alive_replicas = None
          +

          The number of replicas that were actually alive

          +
          + +
          + +
          +
          +exception cassandra.Timeout
          +

          Replicas failed to respond to the coordinator node before timing out.

          +
          +
          +consistency = None
          +

          The requested ConsistencyLevel

          +
          + +
          +
          +required_responses = None
          +

          The number of required replica responses

          +
          + +
          +
          +received_responses = None
          +

          The number of replicas that responded before the coordinator timed out +the operation

          +
          + +
          + +
          +
          +exception cassandra.ReadTimeout
          +

          A subclass of Timeout for read operations.

          +

          This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

          +
          +
          +data_retrieved = None
          +

          A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

          +
          + +
          + +
          +
          +exception cassandra.WriteTimeout
          +

          A subclass of Timeout for write operations.

          +

          This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

          +
          +
          +write_type = None
          +

          The type of write operation, enum on WriteType

          +
          + +
          + +
          +
          +exception cassandra.CoordinationFailure
          +

          Replicas sent a failure to the coordinator.

          +
          +
          +consistency = None
          +

          The requested ConsistencyLevel

          +
          + +
          +
          +required_responses = None
          +

          The number of required replica responses

          +
          + +
          +
          +received_responses = None
          +

          The number of replicas that responded before the coordinator timed out +the operation

          +
          + +
          +
          +failures = None
          +

          The number of replicas that sent a failure message

          +
          + +
          +
          +error_code_map = None
          +

          A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

          +
          + +
          + +
          +
          +exception cassandra.ReadFailure
          +

          A subclass of CoordinationFailure for read operations.

          +

          This indicates that the replicas sent a failure message to the coordinator.

          +
          +
          +data_retrieved = None
          +

          A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

          +
          + +
          + +
          +
          +exception cassandra.WriteFailure
          +

          A subclass of CoordinationFailure for write operations.

          +

          This indicates that the replicas sent a failure message to the coordinator.

          +
          +
          +write_type = None
          +

          The type of write operation, enum on WriteType

          +
          + +
          + +
          +
          +exception cassandra.FunctionFailure
          +

          User Defined Function failed during execution

          +
          +
          +keyspace = None
          +

          Keyspace of the function

          +
          + +
          +
          +function = None
          +

          Name of the function

          +
          + +
          +
          +arg_types = None
          +

          List of argument type names of the function

          +
          + +
          + +
          +
          +exception cassandra.RequestValidationException
          +

          Server request validation failed

          +
          + +
          +
          +exception cassandra.ConfigurationException
          +

          Server indicated request errro due to current configuration

          +
          + +
          +
          +exception cassandra.AlreadyExists
          +

          An attempt was made to create a keyspace or table that already exists.

          +
          +
          +keyspace = None
          +

          The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

          +
          + +
          +
          +table = None
          +

          The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

          +
          + +
          + +
          +
          +exception cassandra.InvalidRequest
          +

          A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

          +
          + +
          +
          +exception cassandra.Unauthorized
          +

          The current user is not authorized to perform the requested operation.

          +
          + +
          +
          +exception cassandra.AuthenticationFailed
          +

          Failed to authenticate.

          +
          + +
          +
          +exception cassandra.OperationTimedOut
          +

          The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

          +
          +
          +errors = None
          +

          A dict of errors keyed by the Host against which they occurred.

          +
          + +
          +
          +last_host = None
          +

          The last Host this operation was attempted against.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/auth.html b/3.24.8-scylla/api/cassandra/auth.html new file mode 100644 index 0000000000..8b3be63092 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/auth.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.auth - Authentication

          +
          +
          +class cassandra.auth.AuthProvider
          +

          An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

          +
          +

          New in version 2.0.0.

          +
          +
          +
          +new_authenticator(host)
          +

          Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

          +
          + +
          + +
          +
          +class cassandra.auth.Authenticator
          +

          An abstract class that handles SASL authentication with Cassandra servers.

          +

          Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

          +

          1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

          +

          2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

          +

          3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

          +

          The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

          +
          +

          New in version 2.0.0.

          +
          +
          +
          +server_authenticator_class = None
          +

          Set during the connection AUTHENTICATE phase

          +
          + +
          +
          +initial_response()
          +

          Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

          +
          + +
          +
          +evaluate_challenge(challenge)
          +

          Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

          +
          + +
          +
          +on_authentication_success(token)
          +

          Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

          +
          + +
          + +
          +
          +class cassandra.auth.PlainTextAuthProvider(username, password)
          +

          An AuthProvider that works with Cassandra’s PasswordAuthenticator.

          +

          Example usage:

          +
          from cassandra.cluster import Cluster
          +from cassandra.auth import PlainTextAuthProvider
          +
          +auth_provider = PlainTextAuthProvider(
          +        username='cassandra', password='cassandra')
          +cluster = Cluster(auth_provider=auth_provider)
          +
          +
          +
          +

          New in version 2.0.0.

          +
          +
          +
          +new_authenticator(host)
          +

          Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

          +
          + +
          + +
          +
          +class cassandra.auth.PlainTextAuthenticator(username, password)
          +
          +
          +evaluate_challenge(challenge)
          +

          Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

          +
          + +
          + +
          +
          +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
          +

          An AuthProvider supporting general SASL auth mechanisms

          +

          Suitable for GSSAPI or other SASL mechanisms

          +

          Example usage:

          +
          from cassandra.cluster import Cluster
          +from cassandra.auth import SaslAuthProvider
          +
          +sasl_kwargs = {'service': 'something',
          +               'mechanism': 'GSSAPI',
          +               'qops': 'auth'.split(',')}
          +auth_provider = SaslAuthProvider(**sasl_kwargs)
          +cluster = Cluster(auth_provider=auth_provider)
          +
          +
          +
          +

          New in version 2.1.4.

          +
          +
          +
          +new_authenticator(host)
          +

          Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

          +
          + +
          + +
          +
          +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
          +

          A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

          +
          +

          New in version 2.1.4.

          +
          +
          +
          +initial_response()
          +

          Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

          +
          + +
          +
          +evaluate_challenge(challenge)
          +

          Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cluster.html b/3.24.8-scylla/api/cassandra/cluster.html new file mode 100644 index 0000000000..3e5046632c --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cluster.html @@ -0,0 +1,1904 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cluster - Clusters and Sessions

          +
          +
          +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
          +

          The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

          +

          Example usage:

          +
          >>> from cassandra.cluster import Cluster
          +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
          +>>> session = cluster.connect()
          +>>> session.execute("CREATE KEYSPACE ...")
          +>>> ...
          +>>> cluster.shutdown()
          +
          +
          +

          Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

          +

          executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

          +

          Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

          +
          +
          +contact_points = ['127.0.0.1']
          +
          + +
          +
          +port = 9042
          +
          + +
          +
          +cql_version = None
          +
          + +
          +
          +protocol_version = 66
          +
          + +
          +
          +compression = True
          +
          + +
          +
          +auth_provider
          +

          When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

          +

          When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

          +

          When not using authentication, this should be left as None.

          +
          + +
          +
          +load_balancing_policy
          +

          An instance of policies.LoadBalancingPolicy or +one of its subclasses.

          +
          +

          Changed in version 2.6.0.

          +
          +

          Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

          +

          Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

          +
          + +
          +
          +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
          +
          + +
          +
          +default_retry_policy = <cassandra.policies.RetryPolicy object>
          +

          A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

          +
          + +
          +
          +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
          +
          + +
          +
          +address_translator = <cassandra.policies.IdentityTranslator object>
          +
          + +
          +
          +metrics_enabled = False
          +
          + +
          +
          +metrics = None
          +
          + +
          +
          +ssl_context = None
          +
          + +
          +
          +ssl_options = None
          +
          + +
          +
          +sockopts = None
          +
          + +
          +
          +max_schema_agreement_wait = 10
          +
          + +
          +
          +metadata = None
          +
          + +
          +
          +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
          +
          + +
          +
          +control_connection_timeout = 2.0
          +
          + +
          +
          +idle_heartbeat_interval = 30
          +
          + +
          +
          +idle_heartbeat_timeout = 30
          +
          + +
          +
          +schema_event_refresh_window = 2
          +
          + +
          +
          +topology_event_refresh_window = 10
          +
          + +
          +
          +status_event_refresh_window = 2
          +
          + +
          +
          +prepare_on_all_hosts = True
          +
          + +
          +
          +reprepare_on_up = True
          +
          + +
          +
          +connect_timeout = 5
          +
          + +
          +
          +schema_metadata_enabled = True
          +

          Flag indicating whether internal schema metadata is updated.

          +

          When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

          +
          + +
          +
          +token_metadata_enabled = True
          +

          Flag indicating whether internal token metadata is updated.

          +

          When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

          +
          + +
          +
          +timestamp_generator = None
          +
          + +
          +
          +endpoint_factory = None
          +
          + +
          +
          +cloud = None
          +
          + +
          +
          +connect(keyspace=None, wait_for_all_pools=False)
          +

          Creates and returns a new Session object.

          +

          If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

          +

          wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

          +
          + +
          +
          +shutdown()
          +

          Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

          +

          Once shutdown, a Cluster should not be used for any purpose.

          +
          + +
          +
          +register_user_type(keyspace, user_type, klass)
          +

          Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

          +

          keyspace is the name of the keyspace that the UDT is defined in.

          +

          user_type is the string name of the UDT to register the mapping +for.

          +

          klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

          +

          This method should only be called after the type has been created +within Cassandra.

          +

          Example:

          +
          cluster = Cluster(protocol_version=3)
          +session = cluster.connect()
          +session.set_keyspace('mykeyspace')
          +session.execute("CREATE TYPE address (street text, zipcode int)")
          +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
          +
          +# create a class to map to the "address" UDT
          +class Address(object):
          +
          +    def __init__(self, street, zipcode):
          +        self.street = street
          +        self.zipcode = zipcode
          +
          +cluster.register_user_type('mykeyspace', 'address', Address)
          +
          +# insert a row using an instance of Address
          +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
          +                (0, Address("123 Main St.", 78723)))
          +
          +# results will include Address instances
          +results = session.execute("SELECT * FROM users")
          +row = results[0]
          +print row.id, row.location.street, row.location.zipcode
          +
          +
          +
          + +
          +
          +register_listener(listener)
          +

          Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

          +
          + +
          +
          +unregister_listener(listener)
          +

          Removes a registered listener.

          +
          + +
          +
          +add_execution_profile(name, profile, pool_wait_timeout=5)
          +

          Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

          +

          Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

          +

          Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

          +
          + +
          +
          +set_max_requests_per_connection(host_distance, max_requests)
          +

          Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

          +

          Pertains to connection pool management in protocol versions {1,2}.

          +
          + +
          +
          +get_max_requests_per_connection(host_distance)
          +
          + +
          +
          +set_min_requests_per_connection(host_distance, min_requests)
          +

          Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

          +

          Pertains to connection pool management in protocol versions {1,2}.

          +
          + +
          +
          +get_min_requests_per_connection(host_distance)
          +
          + +
          +
          +get_core_connections_per_host(host_distance)
          +

          Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

          +

          This property is ignored if protocol_version is +3 or higher.

          +
          + +
          +
          +set_core_connections_per_host(host_distance, core_connections)
          +

          Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

          +

          Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

          +

          If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

          +
          + +
          +
          +get_max_connections_per_host(host_distance)
          +

          Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

          +

          This property is ignored if protocol_version is +3 or higher.

          +
          + +
          +
          +set_max_connections_per_host(host_distance, max_connections)
          +

          Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

          +

          If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

          +
          + +
          +
          +get_control_connection_host()
          +

          Returns the control connection host metadata.

          +
          + +
          +
          +refresh_schema_metadata(max_schema_agreement_wait=None)
          +

          Synchronously refresh all schema metadata.

          +

          By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

          +

          Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

          +

          Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

          +

          An Exception is raised if schema refresh fails for any reason.

          +
          + +
          +
          +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
          +

          Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

          +

          See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

          +
          + +
          +
          +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
          +

          Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

          +

          See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

          +
          + +
          +
          +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
          +

          Synchronously refresh user defined type metadata.

          +

          See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

          +
          + +
          +
          +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
          +

          Synchronously refresh user defined function metadata.

          +

          function is a cassandra.UserFunctionDescriptor.

          +

          See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

          +
          + +
          +
          +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
          +

          Synchronously refresh user defined aggregate metadata.

          +

          aggregate is a cassandra.UserAggregateDescriptor.

          +

          See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

          +
          + +
          +
          +refresh_nodes(force_token_rebuild=False)
          +

          Synchronously refresh the node list and token metadata

          +

          force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

          +

          An Exception is raised if node refresh fails for any reason.

          +
          + +
          +
          +set_meta_refresh_enabled(enabled)
          +

          Deprecated: set schema_metadata_enabled token_metadata_enabled instead

          +

          Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

          +

          Disabling this is useful to minimize refreshes during multiple changes.

          +

          Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

          +
          + +
          + +
          +
          +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
          +
          +
          +consistency_level = LOCAL_ONE
          +
          + +
          +
          +static row_factory(colnames, rows)
          +

          Returns each row as a namedtuple. +This is the default row factory.

          +

          Example:

          +
          >>> from cassandra.query import named_tuple_factory
          +>>> session = cluster.connect('mykeyspace')
          +>>> session.row_factory = named_tuple_factory
          +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
          +>>> user = rows[0]
          +
          +>>> # you can access field by their name:
          +>>> print "name: %s, age: %d" % (user.name, user.age)
          +name: Bob, age: 42
          +
          +>>> # or you can access fields by their position (like a tuple)
          +>>> name, age = user
          +>>> print "name: %s, age: %d" % (name, age)
          +name: Bob, age: 42
          +>>> name = user[0]
          +>>> age = user[1]
          +>>> print "name: %s, age: %d" % (name, age)
          +name: Bob, age: 42
          +
          +
          +
          +

          Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

          +
          +
          + +
          + +
          +
          +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
          +

          Default execution profile for graph execution.

          +

          See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

          +

          In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

          +
          + +
          +
          +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
          +

          Execution profile with timeout and load balancing appropriate for graph analytics queries.

          +

          See also GraphExecutionPolicy.

          +

          In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

          +

          Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

          +
          + +
          +
          +cassandra.cluster.EXEC_PROFILE_DEFAULT
          +

          The base class of the class hierarchy.

          +

          When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

          +
          + +
          +
          +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
          +

          The base class of the class hierarchy.

          +

          When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

          +
          + +
          +
          +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
          +

          The base class of the class hierarchy.

          +

          When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

          +
          + +
          +
          +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
          +

          The base class of the class hierarchy.

          +

          When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

          +
          + +
          +
          +class cassandra.cluster.Session
          +

          A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

          +

          Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

          +

          Example usage:

          +
          >>> session = cluster.connect()
          +>>> session.set_keyspace("mykeyspace")
          +>>> session.execute("SELECT * FROM mycf")
          +
          +
          +
          +
          +default_timeout = 10.0
          +

          A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

          +

          Setting this to None will cause no timeouts to be set by default.

          +

          Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

          +
          +

          New in version 2.0.0.

          +
          +
          + +
          +
          +default_consistency_level = LOCAL_ONE
          +

          Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

          +
          +

          New in version 1.2.0.

          +
          +
          +

          Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

          +
          +
          + +
          +
          +default_serial_consistency_level = None
          +

          The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

          +

          Only valid for protocol_version >= 2.

          +
          + +
          +
          +row_factory = <function named_tuple_factory>
          +

          The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

          + +
          + +
          +
          +default_fetch_size = 5000
          +
          + +
          +
          +use_client_timestamp = True
          +
          + +
          +
          +timestamp_generator = None
          +
          + +
          +
          +encoder = None
          +
          + +
          +
          +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
          +
          + +
          +
          +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
          +

          Execute the given query and synchronously wait for the response.

          +

          If an error is encountered while executing the query, an Exception +will be raised.

          +

          query may be a query string or an instance of cassandra.query.Statement.

          +

          parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

          +

          timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

          +

          If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

          +

          custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

          +

          execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

          +

          paging_state is an optional paging state, reused from a previous ResultSet.

          +

          host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

          +

          execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

          +
          + +
          +
          +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
          +

          Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

          +

          See Session.execute() for parameter definitions.

          +

          Example usage:

          +
          >>> session = cluster.connect()
          +>>> future = session.execute_async("SELECT * FROM mycf")
          +
          +>>> def log_results(results):
          +...     for row in results:
          +...         log.info("Results: %s", row)
          +
          +>>> def log_error(exc):
          +>>>     log.error("Operation failed: %s", exc)
          +
          +>>> future.add_callbacks(log_results, log_error)
          +
          +
          +

          Async execution with blocking wait for results:

          +
          >>> future = session.execute_async("SELECT * FROM mycf")
          +>>> # do other stuff...
          +
          +>>> try:
          +...     results = future.result()
          +... except Exception:
          +...     log.exception("Operation failed:")
          +
          +
          +
          + +
          +
          +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
          +

          Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

          +

          parameters is dict of named parameters to bind. The values must be +JSON-serializable.

          +

          execution_profile: Selects an execution profile for the request.

          +

          execute_as the user that will be used on the server to execute the request.

          +
          + +
          +
          +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
          +

          Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

          +
          + +
          +
          +prepare(statement)
          +

          Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

          +
          >>> session = cluster.connect("mykeyspace")
          +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
          +>>> prepared = session.prepare(query)
          +>>> session.execute(prepared, (user.id, user.name, user.age))
          +
          +
          +

          Or you may bind values to the prepared statement ahead of time:

          +
          >>> prepared = session.prepare(query)
          +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
          +>>> session.execute(bound_stmt)
          +
          +
          +

          Of course, prepared statements may (and should) be reused:

          +
          >>> prepared = session.prepare(query)
          +>>> for user in users:
          +...     bound = prepared.bind((user.id, user.name, user.age))
          +...     session.execute(bound)
          +
          +
          +

          Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

          +
          >>> analyticskeyspace_prepared = session.prepare(
          +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
          +...     keyspace="analyticskeyspace")  # note the different keyspace
          +
          +
          +

          Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

          +

          custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

          +
          + +
          +
          +shutdown()
          +

          Close all connections. Session instances should not be used +for any purpose after being shutdown.

          +
          + +
          +
          +set_keyspace(keyspace)
          +

          Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

          +
          + +
          +
          +get_execution_profile(name)
          +

          Returns the execution profile associated with the provided name.

          +
          +
          Parameters:
          +

          name – The name (or key) of the execution profile.

          +
          +
          +
          + +
          +
          +execution_profile_clone_update(ep, **kwargs)
          +

          Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

          +

          This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

          +
          + +
          +
          +add_request_init_listener(fn, *args, **kwargs)
          +

          Adds a callback with arguments to be called when any request is created.

          +

          It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

          +

          response_future is the ResponseFuture for the request.

          +

          Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

          +

          See this example in the +source tree for an example.

          +
          + +
          +
          +remove_request_init_listener(fn, *args, **kwargs)
          +

          Removes a callback and arguments from the list.

          +

          See Session.add_request_init_listener().

          +
          + +
          + +
          +
          +class cassandra.cluster.ResponseFuture
          +

          An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

          +
          +
          There are two ways for results to be delivered:
          +
          +
          +
          +
          +query = None
          +
          + +
          +
          +result()
          +

          Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

          +

          Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

          +

          Example usage:

          +
          >>> future = session.execute_async("SELECT * FROM mycf")
          +>>> # do other stuff...
          +
          +>>> try:
          +...     rows = future.result()
          +...     for row in rows:
          +...         ... # process results
          +... except Exception:
          +...     log.exception("Operation failed:")
          +
          +
          +
          + +
          +
          +get_query_trace()
          +

          Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

          +

          Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

          +

          If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

          +

          query_cl is the consistency level used to poll the trace tables.

          +
          + +
          +
          +get_all_query_traces()
          +

          Fetches and returns the query traces for all query pages, if tracing was enabled.

          +

          See note in get_query_trace() regarding possible exceptions.

          +
          + +
          +
          +custom_payload
          +

          The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

          +

          Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

          +
          +
          Returns:
          +

          Custom Payloads.

          +
          +
          +
          + +
          +
          +is_schema_agreed = True
          +
          + +
          +
          +has_more_pages
          +

          Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

          +
          +

          New in version 2.0.0.

          +
          +
          + +
          +
          +warnings
          +

          Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

          +

          Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

          +

          Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

          +
          + +
          +
          +start_fetching_next_page()
          +

          If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

          +

          This should only be called after the first page has been returned.

          +
          +

          New in version 2.0.0.

          +
          +
          + +
          +
          +add_callback(fn, *args, **kwargs)
          +

          Attaches a callback function to be called when the final results arrive.

          +

          By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

          +

          If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

          +

          If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

          +

          Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

          +

          Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

          +

          Usage example:

          +
          >>> session = cluster.connect("mykeyspace")
          +
          +>>> def handle_results(rows, start_time, should_log=False):
          +...     if should_log:
          +...         log.info("Total time: %f", time.time() - start_time)
          +...     ...
          +
          +>>> future = session.execute_async("SELECT * FROM users")
          +>>> future.add_callback(handle_results, time.time(), should_log=True)
          +
          +
          +
          + +
          +
          +add_errback(fn, *args, **kwargs)
          +

          Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

          +
          + +
          +
          +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None)
          +

          A convenient combination of add_callback() and +add_errback().

          +

          Example usage:

          +
          >>> session = cluster.connect()
          +>>> query = "SELECT * FROM mycf"
          +>>> future = session.execute_async(query)
          +
          +>>> def log_results(results, level='debug'):
          +...     for row in results:
          +...         log.log(level, "Result: %s", row)
          +
          +>>> def log_error(exc, query):
          +...     log.error("Query '%s' failed: %s", query, exc)
          +
          +>>> future.add_callbacks(
          +...     callback=log_results, callback_kwargs={'level': 'info'},
          +...     errback=log_error, errback_args=(query,))
          +
          +
          +
          + +
          + +
          +
          +class cassandra.cluster.ResultSet
          +

          An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

          +

          You can treat this as a normal iterator over rows:

          +
          >>> from cassandra.query import SimpleStatement
          +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
          +>>> for user_row in session.execute(statement):
          +...     process_user(user_row)
          +
          +
          +

          Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

          +
          +
          +all()
          +

          Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

          +

          This function is not recommended for queries that return a large number of elements.

          +
          + +
          +
          +property current_rows
          +

          The list of current page rows. May be empty if the result was empty, +or this is the last page.

          +
          + +
          +
          +fetch_next_page()
          +

          Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

          +
          + +
          +
          +get_all_query_traces(max_wait_sec_per=None)
          +

          Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

          +
          + +
          +
          +get_query_trace(max_wait_sec=None)
          +

          Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

          +
          + +
          +
          +property has_more_pages
          +

          True if the last response indicated more pages; False otherwise

          +
          + +
          +
          +one()
          +

          Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

          +
          + +
          +
          +property paging_state
          +

          Server paging state of the query. Can be None if the query was not paged.

          +

          The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

          +
          + +
          +
          +property was_applied
          +

          For LWT results, returns whether the transaction was applied.

          +

          Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

          +

          Only valid when one of the of the internal row factories is in use.

          +
          + +
          + +
          +
          +exception cassandra.cluster.QueryExhausted
          +

          Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

          +
          +

          New in version 2.0.0.

          +
          +
          + +
          +
          +exception cassandra.cluster.NoHostAvailable
          +

          Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

          +
          + +
          +
          +exception cassandra.cluster.UserTypeDoesNotExist
          +

          An attempt was made to use a user-defined type that does not exist.

          +
          +

          New in version 2.1.0.

          +
          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/concurrent.html b/3.24.8-scylla/api/cassandra/concurrent.html new file mode 100644 index 0000000000..2bc478caa4 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/concurrent.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.concurrent - Utilities for Concurrent Statement Execution

          +
          +
          +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
          +

          Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

          +

          The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

          +

          If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

          +

          results_generator controls how the results are returned.

          +
            +
          • If False, the results are returned only after all requests have completed.

          • +
          • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

          • +
          +

          execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

          +

          A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

          +

          Example usage:

          +
          select_statement = session.prepare("SELECT * FROM users WHERE id=?")
          +
          +statements_and_params = []
          +for user_id in user_ids:
          +    params = (user_id, )
          +    statements_and_params.append((select_statement, params))
          +
          +results = execute_concurrent(
          +    session, statements_and_params, raise_on_first_error=False)
          +
          +for (success, result) in results:
          +    if not success:
          +        handle_error(result)  # result will be an Exception
          +    else:
          +        process_user(result[0])  # result will be a list of rows
          +
          +
          +

          Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

          +
          + +
          +
          +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
          +

          Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

          +

          Example usage:

          +
          statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
          +parameters = [(x,) for x in range(1000)]
          +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
          +
          +
          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/connection.html b/3.24.8-scylla/api/cassandra/connection.html new file mode 100644 index 0000000000..034e3f47e9 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/connection.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.connection - Low Level Connection Info

          +
          +
          +exception cassandra.connection.ConnectionException
          +

          An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

          +
          + +
          +
          +exception cassandra.connection.ConnectionShutdown
          +

          Raised when a connection has been marked as defunct or has been closed.

          +
          + +
          +
          +exception cassandra.connection.ConnectionBusy
          +

          An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

          +
          + +
          +
          +exception cassandra.connection.ProtocolError
          +

          Communication did not match the protocol that this driver expects.

          +
          + +
          +
          +class cassandra.connection.EndPoint
          +

          Represents the information to connect to a cassandra node.

          +
          +
          +property address
          +

          The IP address of the node. This is the RPC address the driver uses when connecting to the node

          +
          + +
          +
          +property port
          +

          The port of the node.

          +
          + +
          +
          +resolve()
          +

          Resolve the endpoint to an address/port. This is called +only on socket connection.

          +
          + +
          +
          +property socket_family
          +

          The socket family of the endpoint.

          +
          + +
          +
          +property ssl_options
          +

          SSL options specific to this endpoint.

          +
          + +
          + +
          +
          +class cassandra.connection.EndPointFactory
          +
          +
          +configure(cluster)
          +

          This is called by the cluster during its initialization.

          +
          + +
          +
          +create(row)
          +

          Create an EndPoint from a system.peers row.

          +
          + +
          + +
          +
          +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
          +

          SNI Proxy EndPoint implementation.

          +
          + +
          +
          +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
          +
          + +
          +
          +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
          +

          Unix Socket EndPoint implementation.

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cqlengine/columns.html b/3.24.8-scylla/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..cd783da30a --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cqlengine/columns.html @@ -0,0 +1,984 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cqlengine.columns - Column types for object mapping models

          +
          +

          Columns

          +

          Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

          +

          Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

          +

          Each column on your model definitions needs to be an instance of a Column class.

          +
          +
          +class cassandra.cqlengine.columns.Column(**kwargs)
          +
          +
          +primary_key = False
          +

          bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

          +
          + +
          +
          +partition_key = False
          +

          indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

          +
          + +
          +
          +index = False
          +

          bool flag, indicates an index should be created for this column

          +
          + +
          +
          +custom_index = False
          +

          bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

          +
          + +
          +
          +db_field = None
          +

          the fieldname this field will map to in the database

          +
          + +
          +
          +default = None
          +

          the default value, can be a value or a callable (no args)

          +
          + +
          +
          +required = False
          +

          boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

          +
          + +
          +
          +clustering_order = None
          +

          only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

          +
          + +
          +
          +discriminator_column = False
          +

          boolean, if set to True, this column will be used for discriminating records +of inherited models.

          +

          Should only be set on a column of an abstract model being used for inheritance.

          +

          There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

          +
          + +
          +
          +static = False
          +

          boolean, if set to True, this is a static column, with a single value per partition

          +
          + +
          + +
          +
          +

          Column Types

          +

          Columns of all types are initialized by passing Column attributes to the constructor by keyword.

          +
          +
          +class cassandra.cqlengine.columns.Ascii(**kwargs)
          +

          Stores a US-ASCII character string

          +
          +
          Parameters:
          +
            +
          • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

          • +
          • max_length (int) – Sets the maximum length of this string, for validation purposes.

          • +
          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.columns.BigInt(**kwargs)
          +

          Stores a 64-bit signed integer value

          +
          + +
          +
          +class cassandra.cqlengine.columns.Blob(**kwargs)
          +

          Stores a raw binary value

          +
          + +
          +
          +cassandra.cqlengine.columns.Bytes
          +

          alias of Blob

          +
          + +
          +
          +class cassandra.cqlengine.columns.Boolean(**kwargs)
          +

          Stores a boolean True or False value

          +
          + +
          +
          +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
          +

          Stores a counter that can be incremented and decremented

          +
          + +
          +
          +class cassandra.cqlengine.columns.Date(**kwargs)
          +

          Stores a simple date, with no time-of-day

          +
          +

          Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

          +
          +

          requires C* 2.2+ and protocol v4+

          +
          + +
          +
          +class cassandra.cqlengine.columns.DateTime(**kwargs)
          +

          Stores a datetime value

          +
          +
          +truncate_microseconds = False
          +

          Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

          +
          DateTime.truncate_microseconds = True
          +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
          +
          +
          +

          Defaults to False to preserve legacy behavior. May change in the future.

          +
          + +
          + +
          +
          +class cassandra.cqlengine.columns.Decimal(**kwargs)
          +

          Stores a variable precision decimal value

          +
          + +
          +
          +class cassandra.cqlengine.columns.Double(**kwargs)
          +

          Stores a double-precision floating-point value

          +
          + +
          +
          +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
          +

          Stores a single-precision floating-point value

          +
          + +
          +
          +class cassandra.cqlengine.columns.Integer(**kwargs)
          +

          Stores a 32-bit signed integer value

          +
          + +
          +
          +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
          +

          Stores a list of ordered values

          +

          http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

          +
          +
          Parameters:
          +

          value_type – a column class indicating the types of the value

          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
          +

          Stores a key -> value map (dictionary)

          +

          https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

          +
          +
          Parameters:
          +
            +
          • key_type – a column class indicating the types of the key

          • +
          • value_type – a column class indicating the types of the value

          • +
          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
          +

          Stores a set of unordered, unique values

          +

          http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

          +
          +
          Parameters:
          +
            +
          • value_type – a column class indicating the types of the value

          • +
          • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

          • +
          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.columns.SmallInt(**kwargs)
          +

          Stores a 16-bit signed integer value

          +
          +

          New in version 2.6.0.

          +
          +

          requires C* 2.2+ and protocol v4+

          +
          + +
          +
          +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
          +

          Stores a UTF-8 encoded string

          +
          +
          Parameters:
          +
            +
          • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

          • +
          • max_length (int) – Sets the maximum length of this string, for validation purposes.

          • +
          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.columns.Time(**kwargs)
          +

          Stores a timezone-naive time-of-day, with nanosecond precision

          +
          +

          New in version 2.6.0.

          +
          +

          requires C* 2.2+ and protocol v4+

          +
          + +
          +
          +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
          +

          UUID containing timestamp

          +
          + +
          +
          +class cassandra.cqlengine.columns.TinyInt(**kwargs)
          +

          Stores an 8-bit signed integer value

          +
          +

          New in version 2.6.0.

          +
          +

          requires C* 2.2+ and protocol v4+

          +
          + +
          +
          +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
          +

          User Defined Type column

          +

          http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

          +

          These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

          +

          Please see User Defined Types for examples and discussion.

          +
          +
          Parameters:
          +

          user_type (type) – specifies the UserType model of the column

          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.columns.UUID(**kwargs)
          +

          Stores a type 1 or 4 UUID

          +
          + +
          +
          +class cassandra.cqlengine.columns.VarInt(**kwargs)
          +

          Stores an arbitrary-precision integer

          +
          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cqlengine/connection.html b/3.24.8-scylla/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..5f45cd57ce --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cqlengine/connection.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cqlengine.connection - Connection management for cqlengine

          +
          +
          +cassandra.cqlengine.connection.default()
          +

          Configures the default connection to localhost, using the driver defaults +(except for row_factory)

          +
          + +
          +
          +cassandra.cqlengine.connection.set_session(s)
          +

          Configures the default connection with a preexisting cassandra.cluster.Session

          +

          Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

          +
          + +
          +
          +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
          +

          Setup a the driver connection used by the mapper

          +
          +
          Parameters:
          +
            +
          • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

          • +
          • default_keyspace (str) – The default keyspace to use

          • +
          • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

          • +
          • lazy_connect (bool) – True if should not connect until first use

          • +
          • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

          • +
          • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

          • +
          +
          +
          +
          + +
          +
          +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
          +

          Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

          +
          +
          Parameters:
          +
            +
          • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

          • +
          • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

          • +
          • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

          • +
          • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

          • +
          • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

          • +
          • default (bool) – If True, set the new connection as the cqlengine +default

          • +
          • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

          • +
          +
          +
          +
          + +
          +
          +cassandra.cqlengine.connection.unregister_connection(name)
          +
          + +
          +
          +cassandra.cqlengine.connection.set_default_connection(name)
          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cqlengine/management.html b/3.24.8-scylla/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..a548e14624 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cqlengine/management.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cqlengine.management - Schema management for cqlengine

          +

          A collection of functions for managing keyspace and table schema.

          +
          +
          +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
          +

          Creates a keyspace with SimpleStrategy for replica placement

          +

          If the keyspace already exists, it will not be modified.

          +

          This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

          +

          There are plans to guard schema-modifying functions with an environment-driven conditional.

          +
          +
          Parameters:
          +
            +
          • name (str) – name of keyspace to create

          • +
          • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

          • +
          • durable_writes (bool) – Write log is bypassed if set to False

          • +
          • connections (list) – List of connection names

          • +
          +
          +
          +
          + +
          +
          +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
          +

          Creates a keyspace with NetworkTopologyStrategy for replica placement

          +

          If the keyspace already exists, it will not be modified.

          +

          This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

          +

          There are plans to guard schema-modifying functions with an environment-driven conditional.

          +
          +
          Parameters:
          +
            +
          • name (str) – name of keyspace to create

          • +
          • dc_replication_map (dict) – map of dc_names: replication_factor

          • +
          • durable_writes (bool) – Write log is bypassed if set to False

          • +
          • connections (list) – List of connection names

          • +
          +
          +
          +
          + +
          +
          +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
          +

          Drops a keyspace, if it exists.

          +

          There are plans to guard schema-modifying functions with an environment-driven conditional.

          +

          This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

          +
          +
          Parameters:
          +
            +
          • name (str) – name of keyspace to drop

          • +
          • connections (list) – List of connection names

          • +
          +
          +
          +
          + +
          +
          +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
          +

          Inspects the model and creates / updates the corresponding table and columns.

          +

          If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

          +

          If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

          +

          Any User Defined Types used in the table are implicitly synchronized.

          +

          This function can only add fields that are not part of the primary key.

          +

          Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

          +

          This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

          +

          There are plans to guard schema-modifying functions with an environment-driven conditional.

          +
          + +
          +
          +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
          +

          Inspects the type_model and creates / updates the corresponding type.

          +

          Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

          +

          This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

          +

          There are plans to guard schema-modifying functions with an environment-driven conditional.

          +
          + +
          +
          +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
          +

          Drops the table indicated by the model, if it exists.

          +

          If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

          +

          If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

          +

          This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

          +

          There are plans to guard schema-modifying functions with an environment-driven conditional.

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cqlengine/models.html b/3.24.8-scylla/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..d73688015d --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cqlengine/models.html @@ -0,0 +1,964 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cqlengine.models - Table models for object mapping

          +
          +

          Model

          +
          +
          +class cassandra.cqlengine.models.Model(\*\*kwargs)
          +

          The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

          +
          class Person(Model):
          +    id = columns.UUID(primary_key=True)
          +    first_name  = columns.Text()
          +    last_name = columns.Text()
          +
          +person = Person(first_name='Blake', last_name='Eggleston')
          +person.first_name  #returns 'Blake'
          +person.last_name  #returns 'Eggleston'
          +
          +
          +

          Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

          +
          +
          +__abstract__ = False
          +

          Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

          +
          + +
          +
          +__table_name__ = None
          +

          Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

          +
          + +
          +
          +__table_name_case_sensitive__ = False
          +

          Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

          +
          + +
          +
          +__keyspace__ = None
          +

          Sets the name of the keyspace used by this model.

          +
          + +
          +
          +__connection__ = None
          +

          Sets the name of the default connection used by this model.

          +
          + +
          +
          +__default_ttl__ = None
          +

          Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

          +
          + +
          +
          +__discriminator_value__ = None
          +

          Optional Specifies a value for the discriminator column when using model inheritance.

          +

          See Model Inheritance for usage examples.

          +
          + +

          Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

          +

          When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

          +

          Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

          +

          See the list of supported table properties for more information.

          +
          +
          +__options__
          +

          For example:

          +
          class User(Model):
          +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
          +                                  'sstable_size_in_mb': '64',
          +                                  'tombstone_threshold': '.2'},
          +                   'comment': 'User data stored here'}
          +
          +    user_id = columns.UUID(primary_key=True)
          +    name = columns.Text()
          +
          +
          +

          or :

          +
          class TimeData(Model):
          +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
          +                                  'bucket_low': '.3',
          +                                  'bucket_high': '2',
          +                                  'min_threshold': '2',
          +                                  'max_threshold': '64',
          +                                  'tombstone_compaction_interval': '86400'},
          +                   'gc_grace_seconds': '0'}
          +
          +
          +
          + +
          +
          +__compute_routing_key__ = True
          +

          Optional Setting False disables computing the routing key for TokenAwareRouting

          +
          + +

          The base methods allow creating, storing, and querying modeled objects.

          +
          +
          +classmethod create(**kwargs)
          +

          Create an instance of this model in the database.

          +

          Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

          +

          Returns the instance.

          +
          + +
          +
          +if_not_exists()
          +

          Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

          +

          If the insertion isn’t applied, a LWTException is raised.

          +
          try:
          +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
          +except LWTException as e:
          +    # handle failure case
          +    print e.existing  # dict containing LWT result fields
          +
          +
          +

          This method is supported on Cassandra 2.0 or later.

          +
          + +
          +
          +if_exists()
          +

          Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

          +

          If the update or delete isn’t applied, a LWTException is raised.

          +
          try:
          +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
          +except LWTException as e:
          +    # handle failure case
          +    pass
          +
          +
          +

          This method is supported on Cassandra 2.0 or later.

          +
          + +
          +
          +save()
          +

          Saves an object to the database.

          +
          #create a person instance
          +person = Person(first_name='Kimberly', last_name='Eggleston')
          +#saves it to Cassandra
          +person.save()
          +
          +
          +
          + +
          +
          +update(**values)
          +

          Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

          +

          It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

          +
          + +
          +
          +iff(**values)
          +

          Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

          +

          If the insertion isn’t applied, a LWTException is raised.

          +
          t = TestTransactionModel(text='some text', count=5)
          +try:
          +     t.iff(count=5).update('other text')
          +except LWTException as e:
          +    # handle failure case
          +    print e.existing # existing object
          +
          +
          +
          + +
          +
          +classmethod get(*args, **kwargs)
          +

          Returns a single object based on the passed filter constraints.

          +

          This is a pass-through to the model objects().:method:~cqlengine.queries.get.

          +
          + +
          +
          +classmethod filter(*args, **kwargs)
          +

          Returns a queryset based on filter parameters.

          +

          This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

          +
          + +
          +
          +classmethod all()
          +

          Returns a queryset representing all stored objects

          +

          This is a pass-through to the model objects().all()

          +
          + +
          +
          +delete()
          +

          Deletes the object from the database

          +
          + +
          +
          +batch(batch_object)
          +

          Sets the batch object to run instance updates and inserts queries with.

          +

          See Batch Queries for usage examples

          +
          + +
          +
          +timeout(timeout)
          +

          Sets a timeout for use in save(), update(), and delete() +operations

          +
          + +
          +
          +timestamp(timedelta_or_datetime)
          +

          Sets the timestamp for the query

          +
          + +
          +
          +ttl(ttl_in_sec)
          +

          Sets the ttl values to run instance updates and inserts queries with.

          +
          + +
          +
          +using(connection=None)
          +

          Change the context on the fly of the model instance (keyspace, connection)

          +
          + +
          +
          +classmethod column_family_name(include_keyspace=True)
          +

          Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

          +
          + +

          Models also support dict-like access:

          +
          +
          +len(m)
          +

          Returns the number of columns defined in the model

          +
          + +
          +
          +m[col_name]()
          +

          Returns the value of column col_name

          +
          + +
          +
          +m[col_name] = value
          +

          Set m[col_name] to value

          +
          + +
          +
          +keys()
          +

          Returns a list of column IDs.

          +
          + +
          +
          +values()
          +

          Returns list of column values.

          +
          + +
          +
          +items()
          +

          Returns a list of column ID/value tuples.

          +
          + +
          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cqlengine/query.html b/3.24.8-scylla/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..12bbcedd81 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cqlengine/query.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cqlengine.query - Query and filter model objects

          +
          +

          QuerySet

          +

          QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

          +
          +
          +class cassandra.cqlengine.query.ModelQuerySet(model)
          +
          +
          +all()
          +

          Returns a queryset matching all rows

          +
          for user in User.objects().all():
          +    print(user)
          +
          +
          +
          + +
          +
          +batch(batch_obj)
          +

          Set a batch object to run the query on.

          +

          Note: running a select query with a batch object will raise an exception

          +
          + +
          +
          +consistency(consistency)
          +

          Sets the consistency level for the operation. See ConsistencyLevel.

          +
          for user in User.objects(id=3).consistency(CL.ONE):
          +    print(user)
          +
          +
          +
          + +
          +
          +count()
          +

          Returns the number of rows matched by this query.

          +

          Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

          +
          + +
          +
          +len(queryset)
          +

          Returns the number of rows matched by this query. This function uses count() internally.

          +

          Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

          +
          + +
          +
          +distinct(distinct_fields=None)
          +

          Returns the DISTINCT rows matched by this query.

          +

          distinct_fields default to the partition key fields if not specified.

          +

          Note: distinct_fields must be a partition key or a static column

          +
          class Automobile(Model):
          +    manufacturer = columns.Text(partition_key=True)
          +    year = columns.Integer(primary_key=True)
          +    model = columns.Text(primary_key=True)
          +    price = columns.Decimal()
          +
          +sync_table(Automobile)
          +
          +# create rows
          +
          +Automobile.objects.distinct()
          +
          +# or
          +
          +Automobile.objects.distinct(['manufacturer'])
          +
          +
          +
          + +
          +
          +filter(*args, **kwargs)
          +

          Adds WHERE arguments to the queryset, returning a new queryset

          +

          See Retrieving objects with filters

          +

          Returns a QuerySet filtered on the keyword arguments

          +
          + +
          +
          +get(*args, **kwargs)
          +

          Returns a single instance matching this query, optionally with additional filter kwargs.

          +

          See Retrieving objects with filters

          +

          Returns a single object matching the QuerySet.

          +
          user = User.get(id=1)
          +
          +
          +

          If no objects are matched, a DoesNotExist exception is raised.

          +

          If more than one object is found, a MultipleObjectsReturned exception is raised.

          +
          + +
          +
          +limit(v)
          +

          Limits the number of results returned by Cassandra. Use 0 or None to disable.

          +

          Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

          +
          # Fetch 100 users
          +for user in User.objects().limit(100):
          +    print(user)
          +
          +# Fetch all users
          +for user in User.objects().limit(None):
          +    print(user)
          +
          +
          +
          + +
          +
          +fetch_size(v)
          +

          Sets the number of rows that are fetched at a time.

          +

          Note that driver’s default fetch size is 5000.

          +
          for user in User.objects().fetch_size(500):
          +    print(user)
          +
          +
          +
          + +
          +
          +if_not_exists()
          +

          Check the existence of an object before insertion.

          +

          If the insertion isn’t applied, a LWTException is raised.

          +
          + +
          +
          +if_exists()
          +

          Check the existence of an object before an update or delete.

          +

          If the update or delete isn’t applied, a LWTException is raised.

          +
          + +
          +
          +order_by(*colnames)
          +

          Sets the column(s) to be used for ordering

          +

          Default order is ascending, prepend a ‘-’ to any column name for descending

          +

          Note: column names must be a clustering key

          +
          from uuid import uuid1,uuid4
          +
          +class Comment(Model):
          +    photo_id = UUID(primary_key=True)
          +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
          +    comment = Text()
          +
          +sync_table(Comment)
          +
          +u = uuid4()
          +for x in range(5):
          +    Comment.create(photo_id=u, comment="test %d" % x)
          +
          +print("Normal")
          +for comment in Comment.objects(photo_id=u):
          +    print comment.comment_id
          +
          +print("Reversed")
          +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
          +    print comment.comment_id
          +
          +
          +
          + +
          +
          +allow_filtering()
          +

          Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

          +
          + +
          +
          +only(fields)
          +

          Load only these fields for the returned query

          +
          + +
          +
          +defer(fields)
          +

          Don’t load these fields for the returned query

          +
          + +
          +
          +timestamp(timestamp)
          +

          Allows for custom timestamps to be saved with the record.

          +
          + +
          +
          +ttl(ttl)
          +

          Sets the ttl (in seconds) for modified data.

          +

          Note that running a select query with a ttl value will raise an exception

          +
          + +
          +
          +using(keyspace=None, connection=None)
          +

          Change the context on-the-fly of the Model class (keyspace, connection)

          +
          + +
          +
          +update(**values)
          +

          Performs an update on the row selected by the queryset. Include values to update in the +update like so:

          +
          Model.objects(key=n).update(value='x')
          +
          +
          +

          Passing in updates for columns which are not part of the model will raise a ValidationError.

          +

          Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

          +

          For example:

          +
          class User(Model):
          +    id = Integer(primary_key=True)
          +    name = Text()
          +
          +setup(["localhost"], "test")
          +sync_table(User)
          +
          +u = User.create(id=1, name="jon")
          +
          +User.objects(id=1).update(name="Steve")
          +
          +# sets name to null
          +User.objects(id=1).update(name=None)
          +
          +
          +

          Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

          +

          Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

          +

          Given the model below, here are the operations that can be performed on the different container columns:

          +
          class Row(Model):
          +    row_id      = columns.Integer(primary_key=True)
          +    set_column  = columns.Set(Integer)
          +    list_column = columns.List(Integer)
          +    map_column  = columns.Map(Integer, Integer)
          +
          +
          +

          Set

          +
            +
          • add: adds the elements of the given set to the column

          • +
          • remove: removes the elements of the given set to the column

          • +
          +
          # add elements to a set
          +Row.objects(row_id=5).update(set_column__add={6})
          +
          +# remove elements to a set
          +Row.objects(row_id=5).update(set_column__remove={4})
          +
          +
          +

          List

          +
            +
          • append: appends the elements of the given list to the end of the column

          • +
          • prepend: prepends the elements of the given list to the beginning of the column

          • +
          +
          # append items to a list
          +Row.objects(row_id=5).update(list_column__append=[6, 7])
          +
          +# prepend items to a list
          +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
          +
          +
          +

          Map

          +
            +
          • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

          • +
          +
          # add items to a map
          +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
          +
          +# remove items from a map
          +Row.objects(row_id=5).update(map_column__remove={1, 2})
          +
          +
          +
          + +
          + +
          +
          +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
          +

          Handles the batching of queries

          +

          http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

          +

          See Batch Queries for more details.

          +
          +
          Parameters:
          +
            +
          • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

          • +
          • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

          • +
          • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

          • +
          • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

          • +
          • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

          • +
          • connection (str) – Connection name to use for the batch execution

          • +
          +
          +
          +
          +
          +add_query(query)
          +
          + +
          +
          +execute()
          +
          + +
          +
          +add_callback(fn, *args, **kwargs)
          +

          Add a function and arguments to be passed to it to be executed after the batch executes.

          +

          A batch can support multiple callbacks.

          +

          Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

          +
          +
          Parameters:
          +
            +
          • fn (callable) – Callable object

          • +
          • *args – Positional arguments to be passed to the callback at the time of execution

          • +
          • **kwargs – Named arguments to be passed to the callback at the time of execution

          • +
          +
          +
          +
          + +
          + +
          +
          +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
          +

          A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

          +
          +
          Parameters:
          +
            +
          • *args – One or more models. A model should be a class type, not an instance.

          • +
          • **kwargs – (optional) Context parameters: can be keyspace or connection

          • +
          +
          +
          +

          For example:

          +
          with ContextQuery(Automobile, keyspace='test2') as A:
          +    A.objects.create(manufacturer='honda', year=2008, model='civic')
          +    print len(A.objects.all())  # 1 result
          +
          +with ContextQuery(Automobile, keyspace='test4') as A:
          +    print len(A.objects.all())  # 0 result
          +
          +# Multiple models
          +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
          +    print len(A.objects.all())
          +    print len(A2.objects.all())
          +
          +
          +
          + +
          +
          +class cassandra.cqlengine.query.DoesNotExist
          +
          + +
          +
          +class cassandra.cqlengine.query.MultipleObjectsReturned
          +
          + +
          +
          +class cassandra.cqlengine.query.LWTException(existing)
          +

          Lightweight conditional exception.

          +

          This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

          +
          +
          Parameters:
          +

          existing – The current state of the data which prevented the write.

          +
          +
          +
          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/cqlengine/usertype.html b/3.24.8-scylla/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..ff45b8cca3 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.cqlengine.usertype - Model classes for User Defined Types

          +
          +

          UserType

          +
          +
          +class cassandra.cqlengine.usertype.UserType(**values)
          +

          This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

          +
          # connect with default keyspace ...
          +
          +from cassandra.cqlengine.columns import Text, Integer
          +from cassandra.cqlengine.usertype import UserType
          +
          +class address(UserType):
          +    street = Text()
          +    zipcode = Integer()
          +
          +from cassandra.cqlengine import management
          +management.sync_type(address)
          +
          +
          +

          Please see User Defined Types for a complete example and discussion.

          +
          +
          +__type_name__ = None
          +

          Optional. Sets the name of the CQL type for this type.

          +

          If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

          +
          + +
          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/datastax/graph/fluent/index.html b/3.24.8-scylla/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..646d09eb0e --- /dev/null +++ b/3.24.8-scylla/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.datastax.graph.fluent

          +
          +
          +class cassandra.datastax.graph.fluent.DseGraph
          +

          Dse Graph utility class for GraphTraversal construction and execution.

          +
          +
          +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
          +

          Graph query language, Default is ‘bytecode-json’ (GraphSON).

          +
          + +
          +
          +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
          +

          Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

          +
          +
          Parameters:
          +
            +
          • graph_name – The graph name

          • +
          • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

          • +
          +
          +
          +
          + +
          +
          +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
          +

          From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

          +
          +
          Parameters:
          +
            +
          • traversal – The GraphTraversal object

          • +
          • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

          • +
          • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

          • +
          +
          +
          +
          + +
          +
          +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
          +

          Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

          +
          +
          Parameters:
          +
            +
          • session – (Optional) A DSE session

          • +
          • graph_name – (Optional) DSE Graph name

          • +
          • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

          • +
          • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

          • +
          +
          +
          +
          from cassandra.cluster import Cluster
          +from cassandra.datastax.graph.fluent import DseGraph
          +
          +c = Cluster()
          +session = c.connect()
          +
          +g = DseGraph.traversal_source(session, 'my_graph')
          +print g.V().valueMap().toList()
          +
          +
          +
          + +
          +
          +static batch(session=None, execution_profile=None)
          +

          Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
          +

          A Tinkerpop RemoteConnection to execute traversal queries on DSE.

          +
          +
          Parameters:
          +
            +
          • session – A DSE session

          • +
          • graph_name – (Optional) DSE Graph name.

          • +
          • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

          • +
          +
          +
          +
          + +
          +
          +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
          +

          Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

          +
          +
          Currently supported:
            +
          • bulk results

          • +
          +
          +
          +
          + +
          +
          +cassandra.datastax.graph.fluent.graph_traversal_row_factory
          +

          alias of _GremlinGraphSON2RowFactory

          +
          + +
          +
          +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
          +

          alias of _DseGraphSON2RowFactory

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/datastax/graph/fluent/predicates.html b/3.24.8-scylla/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..a4e72af183 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.datastax.graph.fluent.predicates

          +
          +
          +class cassandra.datastax.graph.fluent.predicates.Search
          +
          +
          +static token(value)
          +

          Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

          +
          + +
          +
          +static token_prefix(value)
          +

          Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

          +
          + +
          +
          +static token_regex(value)
          +

          Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

          +
          + +
          +
          +static prefix(value)
          +

          Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

          +
          + +
          +
          +static regex(value)
          +

          Search for this regular expression inside the text property targeted. +:param value: the value to look for.

          +
          + +
          +
          +static fuzzy(value, distance)
          +

          Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

          +
          + +
          +
          +static token_fuzzy(value, distance)
          +

          Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

          +
          + +
          +
          +static phrase(value, proximity)
          +

          Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.fluent.predicates.CqlCollection
          +
          +
          +static contains(value)
          +

          Search for a value inside a cql list/set column. +:param value: the value to look for.

          +
          + +
          +
          +static contains_value(value)
          +

          Search for a map value. +:param value: the value to look for.

          +
          + +
          +
          +static contains_key(value)
          +

          Search for a map key. +:param value: the value to look for.

          +
          + +
          +
          +static entry_eq(value)
          +

          Search for a map entry. +:param value: the value to look for.

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.fluent.predicates.Geo
          +
          +
          +static inside(value, units=1)
          +

          Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/datastax/graph/fluent/query.html b/3.24.8-scylla/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..1abce69adb --- /dev/null +++ b/3.24.8-scylla/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.datastax.graph.fluent.query

          +
          +
          +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
          +

          A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

          +

          If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

          +
          +
          Parameters:
          +
            +
          • session – (Optional) A DSE session

          • +
          • execution_profile – (Optional) The execution profile to use for the batch execution

          • +
          +
          +
          +
          +
          +add(traversal)
          +

          Add a traversal to the batch.

          +
          +
          Parameters:
          +

          traversal – A gremlin GraphTraversal

          +
          +
          +
          + +
          +
          +add_all(traversals)
          +

          Adds a sequence of traversals to the batch.

          +
          +
          Parameters:
          +

          traversals – A sequence of gremlin GraphTraversal

          +
          +
          +
          + +
          +
          +execute()
          +

          Execute the traversal batch if bounded to a DSE Session.

          +
          + +
          +
          +as_graph_statement(graph_protocol=b'graphson-2.0')
          +

          Return the traversal batch as GraphStatement.

          +
          +
          Parameters:
          +

          graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

          +
          +
          +
          + +
          +
          +clear()
          +

          Clear a traversal batch for reuse.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/datastax/graph/index.html b/3.24.8-scylla/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..96ca9c7d46 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1111 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.datastax.graph - Graph Statements, Options, and Row Factories

          +
          +
          +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
          +

          returns the JSON string value of graph results

          +
          + +
          +
          +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
          +

          Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

          +
          + +
          +
          +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
          +

          Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

          +
          + +
          +
          +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
          +

          Row factory to deserialize GraphSON2 results.

          +
          + +
          +
          +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
          +

          Row factory to deserialize GraphSON3 results.

          +
          + +
          +
          +cassandra.datastax.graph.to_int(value)
          +

          Wraps a value to be explicitly serialized as a graphson Int.

          +
          + +
          +
          +cassandra.datastax.graph.to_bigint(value)
          +

          Wraps a value to be explicitly serialized as a graphson Bigint.

          +
          + +
          +
          +cassandra.datastax.graph.to_smallint(value)
          +

          Wraps a value to be explicitly serialized as a graphson Smallint.

          +
          + +
          +
          +cassandra.datastax.graph.to_float(value)
          +

          Wraps a value to be explicitly serialized as a graphson Float.

          +
          + +
          +
          +cassandra.datastax.graph.to_double(value)
          +

          Wraps a value to be explicitly serialized as a graphson Double.

          +
          + +
          +
          +class cassandra.datastax.graph.GraphProtocol
          +
          +
          +GRAPHSON_1_0 = b'graphson-1.0'
          +

          GraphSON1

          +
          + +
          +
          +GRAPHSON_2_0 = b'graphson-2.0'
          +

          GraphSON2

          +
          + +
          +
          +GRAPHSON_3_0 = b'graphson-3.0'
          +

          GraphSON3

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.GraphOptions(**kwargs)
          +

          Options for DSE Graph Query handler.

          +
          +
          +graph_name
          +

          name of the targeted graph.

          +
          + +
          +
          +graph_source
          +

          choose the graph traversal source, configured on the server side.

          +
          + +
          +
          +graph_language
          +

          the language used in the queries (default “gremlin-groovy”)

          +
          + +
          +
          +graph_read_consistency_level
          +

          read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

          +
          + +
          +
          +graph_write_consistency_level
          +

          write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

          +
          + +
          +
          +is_default_source
          +
          + +
          +
          +is_analytics_source
          +

          True if graph_source is set to the server-defined analytics traversal source (‘a’)

          +
          + +
          +
          +is_graph_source
          +

          True if graph_source is set to the server-defined graph traversal source (‘g’)

          +
          + +
          +
          +set_source_default()
          +

          Sets graph_source to the server-defined default traversal source (‘default’)

          +
          + +
          +
          +set_source_analytics()
          +

          Sets graph_source to the server-defined analytic traversal source (‘a’)

          +
          + +
          +
          +set_source_graph()
          +

          Sets graph_source to the server-defined graph traversal source (‘g’)

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
          +

          Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

          +

          query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

          +

          See Statement attributes for a description of the other parameters.

          +
          + +
          +
          +class cassandra.datastax.graph.Result(value)
          +

          Represents deserialized graph results. +Property and item getters are provided for convenience.

          +
          +
          +value = None
          +

          Deserialized value from the result

          +
          + +
          +
          +as_vertex()
          +

          Return a Vertex parsed from this result

          +

          Raises TypeError if parsing fails (i.e. the result structure is not valid).

          +
          + +
          +
          +as_edge()
          +

          Return a Edge parsed from this result

          +

          Raises TypeError if parsing fails (i.e. the result structure is not valid).

          +
          + +
          +
          +as_path()
          +

          Return a Path parsed from this result

          +

          Raises TypeError if parsing fails (i.e. the result structure is not valid).

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.Vertex(id, label, type, properties)
          +

          Represents a Vertex element from a graph query.

          +

          Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

          +
          + +
          +
          +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
          +

          Vertex properties have a top-level value and an optional dict of properties.

          +
          +
          +label = None
          +

          label of the property

          +
          + +
          +
          +value = None
          +

          Value of the property

          +
          + +
          +
          +properties = None
          +

          dict of properties attached to the property

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
          +

          Represents an Edge element from a graph query.

          +

          Attributes match initializer parameters.

          +
          + +
          +
          +class cassandra.datastax.graph.Path(labels, objects)
          +

          Represents a graph path.

          +

          Labels list is taken verbatim from the results.

          +

          Objects are either Result or Vertex/Edge for recognized types

          +
          +
          +labels = None
          +

          List of labels in the path

          +
          + +
          +
          +objects = None
          +

          List of objects in the path

          +
          + +
          + +
          +
          +class cassandra.datastax.graph.T(name, val)
          +

          Represents a collection of tokens for more concise Traversal definitions.

          +
          +
          +id = T.id
          +
          + +
          +
          +key = T.key
          +
          + +
          +
          +label = T.label
          +
          + +
          +
          +value = T.value
          +
          + +
          + +
          +
          +class cassandra.datastax.graph.GraphSON1Serializer
          +

          Serialize python objects to graphson types.

          +
          + +
          +
          +class cassandra.datastax.graph.GraphSON1Deserializer
          +

          Deserialize graphson1 types to python objects.

          +
          +
          +classmethod deserialize_date(value)
          +
          + +
          +
          +classmethod deserialize_timestamp(value)
          +
          + +
          +
          +classmethod deserialize_time(value)
          +
          + +
          +
          +classmethod deserialize_duration(value)
          +
          + +
          +
          +classmethod deserialize_int(value)
          +
          + +
          +
          +classmethod deserialize_bigint(value)
          +
          + +
          +
          +classmethod deserialize_double(value)
          +
          + +
          +
          +classmethod deserialize_float(value)
          +
          + +
          +
          +classmethod deserialize_uuid(value)
          +
          + +
          +
          +classmethod deserialize_blob(value)
          +
          + +
          +
          +classmethod deserialize_decimal(value)
          +
          + +
          +
          +classmethod deserialize_point(value)
          +
          + +
          +
          +classmethod deserialize_linestring(value)
          +
          + +
          +
          +classmethod deserialize_polygon(value)
          +
          + +
          + +
          +
          +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
          +

          GraphSON2 Reader that parse json and deserialize to python objects.

          +
          +
          Parameters:
          +

          extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

          +
          +
          +
          +
          +read(json_data)
          +

          Read and deserialize json_data.

          +
          + +
          +
          +deserialize(obj)
          +

          Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/decoder.html b/3.24.8-scylla/api/cassandra/decoder.html new file mode 100644 index 0000000000..96f3129418 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/decoder.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.decoder - Data Return Formats

          +
          +
          +cassandra.decoder.tuple_factory()
          +

          Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

          +
          + +
          +
          +cassandra.decoder.named_tuple_factory()
          +

          Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

          +
          + +
          +
          +cassandra.decoder.dict_factory()
          +

          Deprecated in 2.0.0. Use cassandra.query.dict_factory()

          +
          + +
          +
          +cassandra.decoder.ordered_dict_factory()
          +

          Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/encoder.html b/3.24.8-scylla/api/cassandra/encoder.html new file mode 100644 index 0000000000..8430195e7c --- /dev/null +++ b/3.24.8-scylla/api/cassandra/encoder.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.encoder - Encoders for non-prepared Statements

          +
          +
          +class cassandra.encoder.Encoder
          +

          A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

          +
          +
          +mapping = None
          +

          A map of python types to encoder functions.

          +
          + +
          +
          +cql_encode_none()
          +

          Converts None to the string ‘NULL’.

          +
          + +
          +
          +cql_encode_object()
          +

          Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

          +
          + +
          +
          +cql_encode_all_types()
          +

          Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

          +
          + +
          +
          +cql_encode_sequence()
          +

          Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

          +
          + +
          +
          +cql_encode_str()
          +

          Escapes quotes in str objects.

          +
          + +
          +
          +cql_encode_unicode()
          +

          Converts unicode objects to UTF-8 encoded strings with quote escaping.

          +
          + +
          +
          +cql_encode_bytes()
          +

          Converts strings, buffers, and bytearrays into CQL blob literals.

          +
          + +
          +
          +cql_encode_datetime()
          +

          Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

          +
          + +
          +
          +cql_encode_date()
          +

          Converts a datetime.date object to a string with format +YYYY-MM-DD.

          +
          + +
          +
          +cql_encode_map_collection()
          +

          Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

          +
          + +
          +
          +cql_encode_list_collection()
          +

          Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

          +
          + +
          +
          +cql_encode_set_collection()
          +

          Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

          +
          + +
          +
          +cql_encode_tuple()
          +

          Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/graph.html b/3.24.8-scylla/api/cassandra/graph.html new file mode 100644 index 0000000000..e0f77c75df --- /dev/null +++ b/3.24.8-scylla/api/cassandra/graph.html @@ -0,0 +1,1098 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.graph - Graph Statements, Options, and Row Factories

          +
          +

          Note

          +

          This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

          +
          +
          +
          +cassandra.graph.single_object_row_factory(column_names, rows)
          +

          returns the JSON string value of graph results

          +
          + +
          +
          +cassandra.graph.graph_result_row_factory(column_names, rows)
          +

          Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

          +
          + +
          +
          +cassandra.graph.graph_object_row_factory(column_names, rows)
          +

          Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

          +
          + +
          +
          +cassandra.graph.graph_graphson2_row_factory(cluster)
          +

          Row factory to deserialize GraphSON2 results.

          +
          + +
          +
          +cassandra.graph.graph_graphson3_row_factory(cluster)
          +

          Row factory to deserialize GraphSON3 results.

          +
          + +
          +
          +cassandra.graph.to_int(value)
          +

          Wraps a value to be explicitly serialized as a graphson Int.

          +
          + +
          +
          +cassandra.graph.to_bigint(value)
          +

          Wraps a value to be explicitly serialized as a graphson Bigint.

          +
          + +
          +
          +cassandra.graph.to_smallint(value)
          +

          Wraps a value to be explicitly serialized as a graphson Smallint.

          +
          + +
          +
          +cassandra.graph.to_float(value)
          +

          Wraps a value to be explicitly serialized as a graphson Float.

          +
          + +
          +
          +cassandra.graph.to_double(value)
          +

          Wraps a value to be explicitly serialized as a graphson Double.

          +
          + +
          +
          +class cassandra.graph.GraphProtocol
          +
          +
          +GRAPHSON_1_0 = b'graphson-1.0'
          +

          GraphSON1

          +
          + +
          +
          +GRAPHSON_2_0 = b'graphson-2.0'
          +

          GraphSON2

          +
          + +
          +
          +GRAPHSON_3_0 = b'graphson-3.0'
          +

          GraphSON3

          +
          + +
          + +
          +
          +class cassandra.graph.GraphOptions(**kwargs)
          +

          Options for DSE Graph Query handler.

          +
          +
          +graph_name
          +

          name of the targeted graph.

          +
          + +
          +
          +graph_source
          +

          choose the graph traversal source, configured on the server side.

          +
          + +
          +
          +graph_language
          +

          the language used in the queries (default “gremlin-groovy”)

          +
          + +
          +
          +graph_read_consistency_level
          +

          read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

          +
          + +
          +
          +graph_write_consistency_level
          +

          write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

          +
          + +
          +
          +is_default_source
          +
          + +
          +
          +is_analytics_source
          +

          True if graph_source is set to the server-defined analytics traversal source (‘a’)

          +
          + +
          +
          +is_graph_source
          +

          True if graph_source is set to the server-defined graph traversal source (‘g’)

          +
          + +
          +
          +set_source_default()
          +

          Sets graph_source to the server-defined default traversal source (‘default’)

          +
          + +
          +
          +set_source_analytics()
          +

          Sets graph_source to the server-defined analytic traversal source (‘a’)

          +
          + +
          +
          +set_source_graph()
          +

          Sets graph_source to the server-defined graph traversal source (‘g’)

          +
          + +
          + +
          +
          +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
          +

          Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

          +

          query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

          +

          See Statement attributes for a description of the other parameters.

          +
          + +
          +
          +class cassandra.graph.Result(value)
          +

          Represents deserialized graph results. +Property and item getters are provided for convenience.

          +
          +
          +value = None
          +

          Deserialized value from the result

          +
          + +
          +
          +as_vertex()
          +

          Return a Vertex parsed from this result

          +

          Raises TypeError if parsing fails (i.e. the result structure is not valid).

          +
          + +
          +
          +as_edge()
          +

          Return a Edge parsed from this result

          +

          Raises TypeError if parsing fails (i.e. the result structure is not valid).

          +
          + +
          +
          +as_path()
          +

          Return a Path parsed from this result

          +

          Raises TypeError if parsing fails (i.e. the result structure is not valid).

          +
          + +
          + +
          +
          +class cassandra.graph.Vertex(id, label, type, properties)
          +

          Represents a Vertex element from a graph query.

          +

          Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

          +
          + +
          +
          +class cassandra.graph.VertexProperty(label, value, properties=None)
          +

          Vertex properties have a top-level value and an optional dict of properties.

          +
          +
          +label = None
          +

          label of the property

          +
          + +
          +
          +value = None
          +

          Value of the property

          +
          + +
          +
          +properties = None
          +

          dict of properties attached to the property

          +
          + +
          + +
          +
          +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
          +

          Represents an Edge element from a graph query.

          +

          Attributes match initializer parameters.

          +
          + +
          +
          +class cassandra.graph.Path(labels, objects)
          +

          Represents a graph path.

          +

          Labels list is taken verbatim from the results.

          +

          Objects are either Result or Vertex/Edge for recognized types

          +
          +
          +labels = None
          +

          List of labels in the path

          +
          + +
          +
          +objects = None
          +

          List of objects in the path

          +
          + +
          + +
          +
          +class cassandra.graph.GraphSON1Serializer
          +

          Serialize python objects to graphson types.

          +
          + +
          +
          +class cassandra.graph.GraphSON1Deserializer
          +

          Deserialize graphson1 types to python objects.

          +
          +
          +classmethod deserialize_date(value)
          +
          + +
          +
          +classmethod deserialize_timestamp(value)
          +
          + +
          +
          +classmethod deserialize_time(value)
          +
          + +
          +
          +classmethod deserialize_duration(value)
          +
          + +
          +
          +classmethod deserialize_int(value)
          +
          + +
          +
          +classmethod deserialize_bigint(value)
          +
          + +
          +
          +classmethod deserialize_double(value)
          +
          + +
          +
          +classmethod deserialize_float(value)
          +
          + +
          +
          +classmethod deserialize_uuid(value)
          +
          + +
          +
          +classmethod deserialize_blob(value)
          +
          + +
          +
          +classmethod deserialize_decimal(value)
          +
          + +
          +
          +classmethod deserialize_point(value)
          +
          + +
          +
          +classmethod deserialize_linestring(value)
          +
          + +
          +
          +classmethod deserialize_polygon(value)
          +
          + +
          + +
          +
          +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
          +

          GraphSON2 Reader that parse json and deserialize to python objects.

          +
          +
          Parameters:
          +

          extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

          +
          +
          +
          +
          +read(json_data)
          +

          Read and deserialize json_data.

          +
          + +
          +
          +deserialize(obj)
          +

          Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

          +
          + +
          + +
          +
          +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
          +

          GraphSON3 Reader that parse json and deserialize to python objects.

          +
          +
          Parameters:
          +
            +
          • context – A dict of the context, mostly used as context for udt deserialization.

          • +
          • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

          • +
          +
          +
          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/io/asyncioreactor.html b/3.24.8-scylla/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..5432a61e47 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.io.asyncioreactor - asyncio Event Loop

          +
          +
          +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
          +

          An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

          +

          Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

          +
          +
          +classmethod initialize_reactor()
          +

          Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/io/asyncorereactor.html b/3.24.8-scylla/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..4c749e5bcf --- /dev/null +++ b/3.24.8-scylla/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.io.asyncorereactor - asyncore Event Loop

          +
          +
          +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
          +

          An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

          +
          +
          +classmethod initialize_reactor()
          +

          Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

          +
          + +
          +
          +classmethod handle_fork()
          +

          Called after a forking. This should cleanup any remaining reactor state +from the parent process.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/io/eventletreactor.html b/3.24.8-scylla/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..2919763ffc --- /dev/null +++ b/3.24.8-scylla/api/cassandra/io/eventletreactor.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.io.eventletreactor - eventlet-compatible Connection

          +
          +
          +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
          +

          An implementation of Connection that utilizes eventlet.

          +

          This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

          +
          +
          +classmethod initialize_reactor()
          +

          Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

          +
          + +
          +
          +classmethod service_timeouts()
          +

          cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/io/geventreactor.html b/3.24.8-scylla/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..867a1a9681 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/io/geventreactor.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.io.geventreactor - gevent-compatible Event Loop

          +
          +
          +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
          +

          An implementation of Connection that utilizes gevent.

          +

          This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

          +
          +
          +classmethod initialize_reactor()
          +

          Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/io/libevreactor.html b/3.24.8-scylla/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..34b85718e3 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/io/libevreactor.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.io.libevreactor - libev Event Loop

          +
          +
          +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
          +

          An implementation of Connection that uses libev for its event loop.

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/io/twistedreactor.html b/3.24.8-scylla/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..023e73a9ed --- /dev/null +++ b/3.24.8-scylla/api/cassandra/io/twistedreactor.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.io.twistedreactor - Twisted Event Loop

          +
          +
          +class cassandra.io.twistedreactor.TwistedConnection
          +

          An implementation of Connection that uses +Twisted’s reactor as its event loop.

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/metadata.html b/3.24.8-scylla/api/cassandra/metadata.html new file mode 100644 index 0000000000..82120bd9ba --- /dev/null +++ b/3.24.8-scylla/api/cassandra/metadata.html @@ -0,0 +1,1104 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.metadata - Schema and Ring Topology

          +
          +
          +cassandra.metadata.cql_keywords
          +

          set() -> new empty set object +set(iterable) -> new set object

          +

          Build an unordered collection of unique elements.

          +
          + +
          +
          +cassandra.metadata.cql_keywords_unreserved
          +

          set() -> new empty set object +set(iterable) -> new set object

          +

          Build an unordered collection of unique elements.

          +
          + +
          +
          +cassandra.metadata.cql_keywords_reserved
          +

          set() -> new empty set object +set(iterable) -> new set object

          +

          Build an unordered collection of unique elements.

          +
          + +
          +
          +class cassandra.metadata.Metadata
          +

          Holds a representation of the cluster schema and topology.

          +
          +
          +add_or_return_host(host)
          +

          Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

          +
          + +
          +
          +all_hosts()
          +

          Returns a list of all known Host instances in the cluster.

          +
          + +
          +
          +export_schema_as_string()
          +

          Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

          +
          + +
          +
          +get_host(endpoint_or_address, port=None)
          +

          Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

          +
          + +
          +
          +get_host_by_host_id(host_id)
          +

          Same as get_host() but use host_id for lookup.

          +
          + +
          +
          +get_replicas(keyspace, key)
          +

          Returns a list of Host instances that are replicas for a given +partition key.

          +
          + +
          + +
          +

          Schemas

          +
          +
          +class cassandra.metadata.KeyspaceMetadata
          +

          A representation of the schema for a single keyspace.

          +
          +
          +as_cql_query()
          +

          Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

          +
          + +
          +
          +export_as_string()
          +

          Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

          +
          + +
          + +
          +
          +class cassandra.metadata.UserType
          +

          A user defined type, as created by CREATE TYPE statements.

          +

          User-defined types were introduced in Cassandra 2.1.

          +
          +

          New in version 2.1.0.

          +
          +
          +
          +as_cql_query(formatted=False)
          +

          Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

          +
          + +
          + +
          +
          +class cassandra.metadata.Function
          +

          A user defined function, as created by CREATE FUNCTION statements.

          +

          User-defined functions were introduced in Cassandra 2.2

          +
          +

          New in version 2.6.0.

          +
          +
          +
          +as_cql_query(formatted=False)
          +

          Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

          +
          + +
          + +
          +
          +class cassandra.metadata.Aggregate
          +

          A user defined aggregate function, as created by CREATE AGGREGATE statements.

          +

          Aggregate functions were introduced in Cassandra 2.2

          +
          +

          New in version 2.6.0.

          +
          +
          +
          +as_cql_query(formatted=False)
          +

          Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

          +
          + +
          + +
          +
          +class cassandra.metadata.TableMetadata
          +

          A representation of the schema for a single table.

          +
          +
          +as_cql_query(formatted=False)
          +

          Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

          +
          + +
          +
          +export_as_string()
          +

          Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

          +
          + +
          +
          +property is_cql_compatible
          +

          A boolean indicating if this table can be represented as CQL in export

          +
          + +
          +
          +property primary_key
          +

          A list of ColumnMetadata representing the components of +the primary key for this table.

          +
          + +
          + +
          +
          +class cassandra.metadata.TableMetadataV3
          +

          For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

          +
          +
          +property is_cql_compatible
          +

          A boolean indicating if this table can be represented as CQL in export

          +
          + +
          + +
          +
          +class cassandra.metadata.TableMetadataDSE68
          +
          +
          +as_cql_query(formatted=False)
          +

          Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

          +
          + +
          + +
          +
          +class cassandra.metadata.ColumnMetadata
          +

          A representation of a single column in a table.

          +
          + +
          +
          +class cassandra.metadata.IndexMetadata
          +

          A representation of a secondary index on a column.

          +
          +
          +as_cql_query()
          +

          Returns a CQL query that can be used to recreate this index.

          +
          + +
          +
          +export_as_string()
          +

          Returns a CQL query string that can be used to recreate this index.

          +
          + +
          + +
          +
          +class cassandra.metadata.MaterializedViewMetadata
          +

          A representation of a materialized view on a table

          +
          +
          +as_cql_query(formatted=False)
          +

          Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

          +
          + +
          + +
          +
          +class cassandra.metadata.VertexMetadata
          +

          A representation of a vertex on a table

          +
          + +
          +
          +class cassandra.metadata.EdgeMetadata
          +

          A representation of an edge on a table

          +
          + +
          +
          +

          Tokens and Ring Topology

          +
          +
          +class cassandra.metadata.TokenMap
          +

          Information about the layout of the ring.

          +
          +
          +get_replicas(keyspace, token)
          +

          Get a set of Host instances representing all of the +replica nodes for a given Token.

          +
          + +
          + +
          +
          +class cassandra.metadata.Token
          +

          Abstract class representing a token.

          +
          + +
          +
          +class cassandra.metadata.Murmur3Token(token)
          +

          A token for Murmur3Partitioner.

          +

          token is an int or string representing the token.

          +
          + +
          +
          +class cassandra.metadata.MD5Token(token)
          +

          A token for RandomPartitioner.

          +
          + +
          +
          +class cassandra.metadata.BytesToken(token)
          +

          A token for ByteOrderedPartitioner.

          +
          +
          +classmethod from_string(token_string)
          +

          token_string should be the string representation from the server.

          +
          + +
          + +
          +
          +cassandra.metadata.ReplicationStrategy
          +

          alias of _ReplicationStrategy

          +
          + +
          +
          +class cassandra.metadata.ReplicationFactor(all_replicas, transient_replicas=None)
          +

          Represent the replication factor of a keyspace.

          +
          + +
          +
          +class cassandra.metadata.SimpleStrategy(options_map)
          +
          +
          +export_for_schema()
          +

          Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

          +
          + +
          +
          +property replication_factor
          +

          The replication factor for this keyspace.

          +

          For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

          +
          + +
          + +
          +
          +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
          +
          +
          +export_for_schema()
          +

          Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

          +
          + +
          + +
          +
          +class cassandra.metadata.LocalStrategy(options_map)
          +
          +
          +export_for_schema()
          +

          Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

          +
          + +
          + +
          +
          +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
          +

          Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

          +

          If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

          +

          Example usage:

          +
          >>> result = group_keys_by_replica(
          +...     session, "system", "peers",
          +...     (("127.0.0.1", ), ("127.0.0.2", )))
          +
          +
          +
          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/metrics.html b/3.24.8-scylla/api/cassandra/metrics.html new file mode 100644 index 0000000000..19c51ecbbd --- /dev/null +++ b/3.24.8-scylla/api/cassandra/metrics.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.metrics - Performance Metrics

          +
          +
          +class cassandra.metrics.Metrics
          +

          A collection of timers and counters for various performance metrics.

          +

          Timer metrics are represented as floating point seconds.

          +
          +
          +request_timer = None
          +

          A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

          +
            +
          • count - number of requests that have been timed

          • +
          • min - min latency

          • +
          • max - max latency

          • +
          • mean - mean latency

          • +
          • stddev - standard deviation for latencies

          • +
          • median - median latency

          • +
          • 75percentile - 75th percentile latencies

          • +
          • 95percentile - 95th percentile latencies

          • +
          • 98percentile - 98th percentile latencies

          • +
          • 99percentile - 99th percentile latencies

          • +
          • 999percentile - 99.9th percentile latencies

          • +
          +
          + +
          +
          +connection_errors = None
          +

          A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

          +
          + +
          +
          +write_timeouts = None
          +

          A greplin.scales.IntStat count of write requests that resulted +in a timeout.

          +
          + +
          +
          +read_timeouts = None
          +

          A greplin.scales.IntStat count of read requests that resulted +in a timeout.

          +
          + +
          +
          +unavailables = None
          +

          A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

          +
          + +
          +
          +other_errors = None
          +

          A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

          +
          + +
          +
          +retries = None
          +

          A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

          +
          + +
          +
          +ignores = None
          +

          A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

          +
          + +
          +
          +known_hosts = None
          +

          A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

          +
          + +
          +
          +connected_to = None
          +

          A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

          +
          + +
          +
          +open_connections = None
          +

          A greplin.scales.IntStat count of the number connections +the driver currently has open.

          +
          + +
          +
          +get_stats()
          +

          Returns the metrics for the registered cluster instance.

          +
          + +
          +
          +set_stats_name(stats_name)
          +

          Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/policies.html b/3.24.8-scylla/api/cassandra/policies.html new file mode 100644 index 0000000000..6dc67dcbf0 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/policies.html @@ -0,0 +1,1880 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.policies - Load balancing and Failure Handling Policies

          +
          +

          Load Balancing

          +
          +
          +class cassandra.policies.HostDistance
          +

          A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

          +
          +
          +IGNORED = -1
          +

          A node with this distance should never be queried or have +connections opened to it.

          +
          + +
          +
          +LOCAL = 0
          +

          Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

          +

          This distance is typically used for nodes within the same +datacenter as the client.

          +
          + +
          +
          +REMOTE = 1
          +

          Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

          +

          This distance is typically used for nodes outside of the +datacenter that the client is running in.

          +
          + +
          + +
          +
          +class cassandra.policies.LoadBalancingPolicy
          +

          Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

          +

          In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

          +

          You may also use subclasses of LoadBalancingPolicy for +custom behavior.

          +
          +
          +distance(host)
          +

          Returns a measure of how remote a Host is in +terms of the HostDistance enums.

          +
          + +
          +
          +populate(cluster, hosts)
          +

          This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

          +
          + +
          +
          +make_query_plan(working_keyspace=None, query=None)
          +

          Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

          +

          Note that the query argument may be None when preparing +statements.

          +

          working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

          +
          + +
          +
          +check_supported()
          +

          This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

          +
          + +
          + +
          +
          +class cassandra.policies.RoundRobinPolicy
          +

          A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

          +
          +
          +populate(cluster, hosts)
          +

          This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

          +
          + +
          +
          +distance(host)
          +

          Returns a measure of how remote a Host is in +terms of the HostDistance enums.

          +
          + +
          +
          +make_query_plan(working_keyspace=None, query=None)
          +

          Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

          +

          Note that the query argument may be None when preparing +statements.

          +

          working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

          +
          + +
          +
          +on_up(host)
          +

          Called when a node is marked up.

          +
          + +
          +
          +on_down(host)
          +

          Called when a node is marked down.

          +
          + +
          +
          +on_add(host)
          +

          Called when a node is added to the cluster. The newly added node +should be considered up.

          +
          + +
          +
          +on_remove(host)
          +

          Called when a node is removed from the cluster.

          +
          + +
          + +
          +
          +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
          +

          Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

          +

          The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

          +

          used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

          +
          +
          +populate(cluster, hosts)
          +

          This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

          +
          + +
          +
          +distance(host)
          +

          Returns a measure of how remote a Host is in +terms of the HostDistance enums.

          +
          + +
          +
          +make_query_plan(working_keyspace=None, query=None)
          +

          Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

          +

          Note that the query argument may be None when preparing +statements.

          +

          working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

          +
          + +
          +
          +on_up(host)
          +

          Called when a node is marked up.

          +
          + +
          +
          +on_down(host)
          +

          Called when a node is marked down.

          +
          + +
          +
          +on_add(host)
          +

          Called when a node is added to the cluster. The newly added node +should be considered up.

          +
          + +
          +
          +on_remove(host)
          +

          Called when a node is removed from the cluster.

          +
          + +
          + +
          +
          +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
          +

          A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

          +

          This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

          +

          The hosts parameter should be a sequence of hosts to permit +connections to.

          +
          +
          +populate(cluster, hosts)
          +

          This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

          +
          + +
          +
          +distance(host)
          +

          Returns a measure of how remote a Host is in +terms of the HostDistance enums.

          +
          + +
          +
          +on_up(host)
          +

          Called when a node is marked up.

          +
          + +
          +
          +on_add(host)
          +

          Called when a node is added to the cluster. The newly added node +should be considered up.

          +
          + +
          + +
          +
          +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
          +

          A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

          +

          This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

          +

          If no routing_key is set on the query, the child +policy’s query plan will be used as is.

          +
          +
          +shuffle_replicas = False
          +

          Yield local replicas in a random order.

          +
          + +
          +
          +populate(cluster, hosts)
          +

          This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

          +
          + +
          +
          +check_supported()
          +

          This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

          +
          + +
          +
          +distance(*args, **kwargs)
          +

          Returns a measure of how remote a Host is in +terms of the HostDistance enums.

          +
          + +
          +
          +make_query_plan(working_keyspace=None, query=None)
          +

          Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

          +

          Note that the query argument may be None when preparing +statements.

          +

          working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

          +
          + +
          +
          +on_up(*args, **kwargs)
          +

          Called when a node is marked up.

          +
          + +
          +
          +on_down(*args, **kwargs)
          +

          Called when a node is marked down.

          +
          + +
          +
          +on_add(*args, **kwargs)
          +

          Called when a node is added to the cluster. The newly added node +should be considered up.

          +
          + +
          +
          +on_remove(*args, **kwargs)
          +

          Called when a node is removed from the cluster.

          +
          + +
          + +
          +
          +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
          +

          A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

          +

          This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

          +
          def address_is_ignored(host):
          +    return host.address in [ignored_address0, ignored_address1]
          +
          +blacklist_filter_policy = HostFilterPolicy(
          +    child_policy=RoundRobinPolicy(),
          +    predicate=address_is_ignored
          +)
          +
          +cluster = Cluster(
          +    primary_host,
          +    load_balancing_policy=blacklist_filter_policy,
          +)
          +
          +
          +

          See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

          +

          Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

          +
          +
          Parameters:
          +
            +
          • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

          • +
          • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

          • +
          +
          +
          +
          +
          +predicate(host)
          +

          A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

          +

          This is a read-only value set in __init__, implemented as a +property.

          +
          + +
          +
          +distance(host)
          +

          Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

          +
          + +
          +
          +make_query_plan(working_keyspace=None, query=None)
          +

          Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

          +

          Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

          +
          + +
          + +
          +
          +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
          +

          A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

          +

          If no host is set on the query, the child policy’s query plan will be used as is.

          +
          +
          +populate(cluster, hosts)
          +

          This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

          +
          + +
          +
          +make_query_plan(working_keyspace=None, query=None)
          +

          Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

          +

          Note that the query argument may be None when preparing +statements.

          +

          working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

          +
          + +
          + +
          +
          +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
          +

          Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

          +
          + +
          +
          +

          Translating Server Node Addresses

          +
          +
          +class cassandra.policies.AddressTranslator
          +

          Interface for translating cluster-defined endpoints.

          +

          The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

          +

          Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

          +
          +
          +translate(addr)
          +

          Accepts the node ip address, and returns a translated address to be used connecting to this node.

          +
          + +
          + +
          +
          +class cassandra.policies.IdentityTranslator
          +

          Returns the endpoint with no translation

          +
          +
          +translate(addr)
          +

          Accepts the node ip address, and returns a translated address to be used connecting to this node.

          +
          + +
          + +
          +
          +class cassandra.policies.EC2MultiRegionTranslator
          +

          Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

          +
          +
          +translate(addr)
          +

          Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

          +
          + +
          + +
          +
          +

          Marking Hosts Up or Down

          +
          +
          +class cassandra.policies.ConvictionPolicy(host)
          +

          A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

          +

          If custom behavior is needed, this class may be subclassed.

          +

          host is an instance of Host.

          +
          +
          +add_failure(connection_exc)
          +

          Implementations should return True if the host should be +convicted, False otherwise.

          +
          + +
          +
          +reset()
          +

          Implementations should clear out any convictions or state regarding +the host.

          +
          + +
          + +
          +
          +class cassandra.policies.SimpleConvictionPolicy(host)
          +

          The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

          +

          host is an instance of Host.

          +
          +
          +add_failure(connection_exc)
          +

          Implementations should return True if the host should be +convicted, False otherwise.

          +
          + +
          +
          +reset()
          +

          Implementations should clear out any convictions or state regarding +the host.

          +
          + +
          + +
          +
          +

          Reconnecting to Dead Hosts

          +
          +
          +class cassandra.policies.ReconnectionPolicy
          +

          This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

          +

          If custom behavior is needed, this class may be subclassed.

          +
          +
          +new_schedule()
          +

          This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

          +
          + +
          + +
          +
          +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
          +

          A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

          +

          delay should be a floating point number of seconds to wait inbetween +each attempt.

          +

          max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

          +
          +
          +new_schedule()
          +

          This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

          +
          + +
          + +
          +
          +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
          +

          A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

          +

          A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

          +

          base_delay and max_delay should be in floating point units of +seconds.

          +

          max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

          +
          +
          +new_schedule()
          +

          This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

          +
          + +
          + +
          +
          +

          Retrying Failed Operations

          +
          +
          +class cassandra.policies.WriteType
          +

          For usage with RetryPolicy, this describe a type +of write operation.

          +
          +
          +SIMPLE = 0
          +

          A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

          +
          + +
          +
          +BATCH = 1
          +

          A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

          +
          + +
          +
          +UNLOGGED_BATCH = 2
          +

          A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

          +
          + +
          +
          +COUNTER = 3
          +

          A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

          +
          + +
          +
          +BATCH_LOG = 4
          +

          The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

          +
          + +
          +
          +CAS = 5
          +

          A lighweight-transaction write, such as “DELETE … IF EXISTS”.

          +
          + +
          +
          +VIEW = 6
          +

          This WriteType is only seen in results for requests that were unable to +complete MV operations.

          +
          + +
          +
          +CDC = 7
          +

          This WriteType is only seen in results for requests that were unable to +complete CDC operations.

          +
          + +
          + +
          +
          +class cassandra.policies.RetryPolicy
          +

          A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

          +

          To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

          +

          To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

          +

          If custom behavior is needed for retrying certain operations, +this class may be subclassed.

          +
          +
          +RETRY = 0
          +

          This should be returned from the below methods if the operation +should be retried on the same connection.

          +
          + +
          +
          +RETHROW = 1
          +

          This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

          +
          + +
          +
          +IGNORE = 2
          +

          This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

          +
          + +
          +
          +RETRY_NEXT_HOST = 3
          +

          This should be returned from the below methods if the operation +should be retried on another connection.

          +
          + +
          +
          +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
          +

          This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

          +
          + +
          +
          +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
          +

          This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          write_type is one of the WriteType enums describing the +type of write operation.

          +

          The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

          +
          + +
          +
          +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
          +

          This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

          +

          query is the Statement that failed.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

          +
          + +
          +
          +on_request_error(query, consistency, error, retry_num)
          +

          This is called when an unexpected error happens. This can be in the +following situations:

          +
            +
          • On a connection error

          • +
          • On server errors: overloaded, isBootstrapping, serverError, etc.

          • +
          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          error the instance of the exception.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          The default, it triggers a retry on the next host in the query plan +with the same consistency level.

          +
          + +
          + +
          +
          +class cassandra.policies.FallthroughRetryPolicy
          +

          A retry policy that never retries and always propagates failures to +the application.

          +
          +
          +on_read_timeout(*args, **kwargs)
          +

          This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

          +
          + +
          +
          +on_write_timeout(*args, **kwargs)
          +

          This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          write_type is one of the WriteType enums describing the +type of write operation.

          +

          The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

          +
          + +
          +
          +on_unavailable(*args, **kwargs)
          +

          This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

          +

          query is the Statement that failed.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

          +
          + +
          +
          +on_request_error(*args, **kwargs)
          +

          This is called when an unexpected error happens. This can be in the +following situations:

          +
            +
          • On a connection error

          • +
          • On server errors: overloaded, isBootstrapping, serverError, etc.

          • +
          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          error the instance of the exception.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          The default, it triggers a retry on the next host in the query plan +with the same consistency level.

          +
          + +
          + +
          +
          +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
          +

          Deprecated: This retry policy will be removed in the next major release.

          +

          A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

          +

          BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

          +

          This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

          +
            +
          • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

          • +
          • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

          • +
          • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

          • +
          +

          The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

          +
            +
          • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

          • +
          • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

          • +
          +

          In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

          +
          +
          +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
          +

          This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

          +
          + +
          +
          +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
          +

          This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

          +

          query is the Statement that timed out.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          write_type is one of the WriteType enums describing the +type of write operation.

          +

          The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

          +
          + +
          +
          +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
          +

          This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

          +

          query is the Statement that failed.

          +

          consistency is the ConsistencyLevel that the operation was +attempted at.

          +

          required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

          +

          retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

          +

          By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

          +
          + +
          + +
          +
          +

          Retrying Idempotent Operations

          +
          +
          +class cassandra.policies.SpeculativeExecutionPolicy
          +

          Interface for specifying speculative execution plans

          +
          +
          +new_plan(keyspace, statement)
          +

          Returns

          +
          +
          Parameters:
          +
            +
          • keyspace

          • +
          • statement

          • +
          +
          +
          Returns:
          +

          +
          +
          +
          + +
          + +
          +
          +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
          +

          A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

          +
          +
          +new_plan(keyspace, statement)
          +

          Returns

          +
          +
          Parameters:
          +
            +
          • keyspace

          • +
          • statement

          • +
          +
          +
          Returns:
          +

          +
          +
          +
          + +
          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/pool.html b/3.24.8-scylla/api/cassandra/pool.html new file mode 100644 index 0000000000..2ccd1a63b7 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/pool.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.pool - Hosts and Connection Pools

          +

          Connection pooling and host management.

          +
          +
          +class cassandra.pool.Host
          +

          Represents a single Cassandra node.

          +
          +
          +property address
          +

          The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

          +
          + +
          +
          +property datacenter
          +

          The datacenter the node is in.

          +
          + +
          +
          +property rack
          +

          The rack the node is in.

          +
          + +
          + +
          +
          +exception cassandra.pool.NoConnectionsAvailable
          +

          All existing connections to a given host are busy, or there are +no open connections.

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/protocol.html b/3.24.8-scylla/api/cassandra/protocol.html new file mode 100644 index 0000000000..3e4e1ce24d --- /dev/null +++ b/3.24.8-scylla/api/cassandra/protocol.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.protocol - Protocol Features

          +
          +

          Custom Payloads

          +

          Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

          +

          By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

          +

          See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

          +
          +
          +class cassandra.protocol._ProtocolHandler
          +

          _ProtocolHander handles encoding and decoding messages.

          +

          This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

          +

          Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

          +
          +
          +message_types_by_opcode = {default mapping}
          +
          + +
          +
          +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
          +

          Encodes a message using the specified frame parameters, and compressor

          +
          +
          Parameters:
          +
            +
          • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

          • +
          • stream_id – protocol stream id for the frame header

          • +
          • protocol_version – version for the frame header, and used encoding contents

          • +
          • compressor – optional compression function to be used on the body

          • +
          +
          +
          +
          + +
          +
          +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
          +

          Decodes a native protocol message body

          +
          +
          Parameters:
          +
            +
          • protocol_version – version to use decoding contents

          • +
          • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

          • +
          • stream_id – native protocol stream id from the frame header

          • +
          • flags – native protocol flags bitmap from the header

          • +
          • opcode – native protocol opcode from the header

          • +
          • body – frame body

          • +
          • decompressor – optional decompression function to inflate the body

          • +
          +
          +
          Returns:
          +

          a message decoded from the body and frame attributes

          +
          +
          +
          + +
          + +
          +
          +

          Faster Deserialization

          +

          When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

          +
          from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
          +from cassandra.query import tuple_factory
          +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
          +s.row_factory = tuple_factory  #required for Numpy results
          +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
          +
          +
          +

          These protocol handlers comprise different parsers, and return results as described below:

          +
            +
          • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

          • +
          • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

          • +
          • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

          • +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/query.html b/3.24.8-scylla/api/cassandra/query.html new file mode 100644 index 0000000000..faa2be9611 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/query.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

          +
          +
          +cassandra.query.tuple_factory(colnames, rows)
          +

          Returns each row as a tuple

          +

          Example:

          +
          >>> from cassandra.query import tuple_factory
          +>>> session = cluster.connect('mykeyspace')
          +>>> session.row_factory = tuple_factory
          +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
          +>>> print rows[0]
          +('Bob', 42)
          +
          +
          +
          +

          Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

          +
          +
          + +
          +
          +cassandra.query.named_tuple_factory(colnames, rows)
          +

          Returns each row as a namedtuple. +This is the default row factory.

          +

          Example:

          +
          >>> from cassandra.query import named_tuple_factory
          +>>> session = cluster.connect('mykeyspace')
          +>>> session.row_factory = named_tuple_factory
          +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
          +>>> user = rows[0]
          +
          +>>> # you can access field by their name:
          +>>> print "name: %s, age: %d" % (user.name, user.age)
          +name: Bob, age: 42
          +
          +>>> # or you can access fields by their position (like a tuple)
          +>>> name, age = user
          +>>> print "name: %s, age: %d" % (name, age)
          +name: Bob, age: 42
          +>>> name = user[0]
          +>>> age = user[1]
          +>>> print "name: %s, age: %d" % (name, age)
          +name: Bob, age: 42
          +
          +
          +
          +

          Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

          +
          +
          + +
          +
          +cassandra.query.dict_factory(colnames, rows)
          +

          Returns each row as a dict.

          +

          Example:

          +
          >>> from cassandra.query import dict_factory
          +>>> session = cluster.connect('mykeyspace')
          +>>> session.row_factory = dict_factory
          +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
          +>>> print rows[0]
          +{u'age': 42, u'name': u'Bob'}
          +
          +
          +
          +

          Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

          +
          +
          + +
          +
          +cassandra.query.ordered_dict_factory(colnames, rows)
          +

          Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

          +
          +

          Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

          +
          +
          + +
          +
          +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
          +

          A simple, un-prepared query.

          +

          query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

          +

          See Statement attributes for a description of the other parameters.

          +
          + +
          +
          +class cassandra.query.PreparedStatement
          +

          A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

          +

          A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

          +

          A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

          +
          +
          +bind(values)
          +

          Creates and returns a BoundStatement instance using values.

          +

          See BoundStatement.bind() for rules on input values.

          +
          + +
          + +
          +
          +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
          +

          A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

          +

          prepared_statement should be an instance of PreparedStatement.

          +

          See Statement attributes for a description of the other parameters.

          +
          +
          +bind(values)
          +

          Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

          +
            +
          • a sequence, even if you are only binding one value, or

          • +
          • a dict that relates 1-to-1 between dict keys and columns

          • +
          +
          +

          Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

          +
            +
          • short sequences will be extended to match bind parameters with UNSET_VALUE

          • +
          • names may be omitted from a dict with UNSET_VALUE implied.

          • +
          +
          +
          +

          Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

          +
          +
          + +
          +
          +property routing_key
          +

          The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

          +

          If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

          +
          + +
          + +
          +
          +class cassandra.query.Statement
          +

          An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

          +
          +
          +property routing_key
          +

          The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

          +

          If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

          +
          + +
          +
          +property serial_consistency_level
          +

          The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

          +

          The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

          +

          The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

          +

          Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

          +

          See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

          +
          +

          New in version 2.0.0.

          +
          +
          + +
          + +
          +
          +cassandra.query.UNSET_VALUE
          +

          The base class of the class hierarchy.

          +

          When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

          +
          + +
          +
          +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
          +

          A protocol-level batch of operations which are applied atomically +by default.

          +
          +

          New in version 2.0.0.

          +
          +

          batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

          +

          retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

          +

          consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

          +

          custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

          +

          Example usage:

          +
          insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
          +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
          +
          +for (name, age) in users_to_insert:
          +    batch.add(insert_user, (name, age))
          +
          +session.execute(batch)
          +
          +
          +

          You can also mix different types of operations within a batch:

          +
          batch = BatchStatement()
          +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
          +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
          +session.execute(batch)
          +
          +
          +
          +

          New in version 2.0.0.

          +
          +
          +

          Changed in version 2.1.0: Added serial_consistency_level as a parameter

          +
          +
          +

          Changed in version 2.6.0: Added custom_payload as a parameter

          +
          +
          +
          +add(statement, parameters=None)
          +

          Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

          +

          Like with other statements, parameters must be a sequence, even +if there is only one item.

          +
          + +
          +
          +add_all(statements, parameters)
          +

          Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

          +
          + +
          +
          +clear()
          +

          This is a convenience method to clear a batch statement for reuse.

          +

          Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

          +
          + +
          +
          +serial_consistency_level = None
          +
          + +
          + +
          +
          +class cassandra.query.BatchType
          +

          A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

          +
          +

          New in version 2.0.0.

          +
          +
          +
          +LOGGED = BatchType.LOGGED
          +
          + +
          +
          +UNLOGGED = BatchType.UNLOGGED
          +
          + +
          +
          +COUNTER = BatchType.COUNTER
          +
          + +
          + +
          +
          +class cassandra.query.ValueSequence(iterable=(), /)
          +

          A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

          +

          This is typically needed when supplying a list of keys to select. +For example:

          +
          >>> my_user_ids = ('alice', 'bob', 'charles')
          +>>> query = "SELECT * FROM users WHERE user_id IN %s"
          +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
          +
          +
          +
          + +
          +
          +class cassandra.query.QueryTrace
          +

          A trace of the duration and events that occurred when executing +an operation.

          +
          +
          +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
          +

          Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

          +

          wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

          +

          query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

          +
          + +
          + +
          +
          +class cassandra.query.TraceEvent
          +

          Representation of a single event within a query trace.

          +
          + +
          +
          +exception cassandra.query.TraceUnavailable
          +

          Raised when complete trace details cannot be fetched from Cassandra.

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/timestamps.html b/3.24.8-scylla/api/cassandra/timestamps.html new file mode 100644 index 0000000000..e23fa6f557 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/timestamps.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.timestamps - Timestamp Generation

          +
          +
          +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
          +

          An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

          +
          +

          New in version 3.8.0.

          +
          +
          +
          +warn_on_drift = True
          +

          If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

          +
          + +
          +
          +warning_threshold = 1
          +

          This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

          +
          + +
          +
          +warning_interval = 1
          +

          This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

          +
          + +
          +
          +_next_timestamp(now, last)
          +

          Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

          +
          +
          Parameters:
          +
            +
          • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

          • +
          • last (int) – an integer representing the last timestamp returned by +this object

          • +
          +
          +
          +
          + +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/cassandra/util.html b/3.24.8-scylla/api/cassandra/util.html new file mode 100644 index 0000000000..43afd797b3 --- /dev/null +++ b/3.24.8-scylla/api/cassandra/util.html @@ -0,0 +1,1082 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          cassandra.util - Utilities

          +
          +
          +class cassandra.util.Date(value)
          +

          Idealized date: year, month, day

          +

          Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

          +

          Initializer value can be:

          +
            +
          • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

          • +
          • datetime.date: built-in date

          • +
          • string_type: a string time of the form “yyyy-mm-dd”

          • +
          +
          +
          +date()
          +

          Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

          +

          ValueError is raised for Dates outside this range.

          +
          + +
          +
          +property seconds
          +

          Absolute seconds from epoch (can be negative)

          +
          + +
          + +
          +
          +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
          +

          DSE DateRange Type

          +
          +
          +lower_bound
          +

          DateRangeBound representing the lower bound of a bounded range.

          +
          + +
          +
          +upper_bound
          +

          DateRangeBound representing the upper bound of a bounded range.

          +
          + +
          +
          +value
          +

          DateRangeBound representing the value of a single-value range.

          +
          + +

          As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

          +
          +
          Parameters:
          +
          +
          +
          +
          + +
          +
          +class cassandra.util.DateRangeBound(value, precision)
          +

          Represents a single date value and its precision for DateRange.

          +
          +
          +milliseconds
          +

          Integer representing milliseconds since the UNIX epoch. May be negative.

          +
          + +
          +
          +precision
          +

          String representing the precision of a bound. Must be a valid +DateRangePrecision member.

          +
          + +

          DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

          +
          +
          Parameters:
          +
            +
          • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

          • +
          • precision – a string representing precision

          • +
          +
          +
          +
          +
          +datetime()
          +

          Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

          +
          + +
          +
          +classmethod from_value(value)
          +

          Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

          +
          +
          Parameters:
          +

          value – a dictlike or iterable object

          +
          +
          +
          + +
          + +
          +
          +class cassandra.util.DateRangePrecision
          +

          An “enum” representing the valid values for DateRange.precision.

          +
          + +
          +
          +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
          +

          Represents a Distance geometry for DSE

          +
          +
          +static from_wkt(s)
          +

          Parse a Distance geometry from a wkt string and return a new Distance object.

          +
          + +
          + +
          +
          +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
          +

          Cassandra Duration Type

          +
          + +
          +
          +class cassandra.util.LineString(coords=())
          +

          Represents a linestring geometry for DSE

          +

          ‘coords`: a sequence of (x, y) coordinates of points in the linestring

          +
          +
          +static from_wkt(s)
          +

          Parse a LineString geometry from a wkt string and return a new LineString object.

          +
          + +
          + +
          +
          +class cassandra.util.OrderedMap(*args, **kwargs)
          +

          An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

          +
          >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
          +...                  ({'three': 3, 'four': 4}, 'value2')])
          +>>> list(od.keys())
          +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
          +>>> list(od.values())
          +['value', 'value2']
          +
          +
          +

          These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

          +
          CREATE TABLE example (
          +    ...
          +    value map<frozen<map<int, int>>, double>
          +    ...
          +)
          +
          +
          +

          This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

          +
          + +
          +
          +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
          +
          + +
          +
          +class cassandra.util.Point(x=nan, y=nan)
          +

          Represents a point geometry for DSE

          +
          +
          +static from_wkt(s)
          +

          Parse a Point geometry from a wkt string and return a new Point object.

          +
          + +
          + +
          +
          +class cassandra.util.Polygon(exterior=(), interiors=None)
          +

          Represents a polygon geometry for DSE

          +

          ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

          +
          +
          +static from_wkt(s)
          +

          Parse a Polygon geometry from a wkt string and return a new Polygon object.

          +
          + +
          + +
          +
          +class cassandra.util.SortedSet(iterable=())
          +

          A sorted set based on sorted list

          +

          A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

          +

          #Not implemented: update functions, inplace operators

          +
          + +
          +
          +class cassandra.util.Time(value)
          +

          Idealized time, independent of day.

          +

          Up to nanosecond resolution

          +

          Initializer value can be:

          +
            +
          • integer_type: absolute nanoseconds in the day

          • +
          • datetime.time: built-in time

          • +
          • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

          • +
          +
          +
          +property hour
          +

          The hour component of this time (0-23)

          +
          + +
          +
          +property minute
          +

          The minute component of this time (0-59)

          +
          + +
          +
          +property nanosecond
          +

          The fractional seconds component of the time, in nanoseconds

          +
          + +
          +
          +property second
          +

          The second component of this time (0-59)

          +
          + +
          +
          +time()
          +

          Return a built-in datetime.time (nanosecond precision truncated to micros).

          +
          + +
          + +
          +
          +class cassandra.util.Version(version)
          +

          Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

          +

          TODO: when python2 support is removed, use packaging.version.

          +
          + +
          +
          +cassandra.util.datetime_from_timestamp(timestamp)
          +

          Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

          +
          +
          Parameters:
          +

          timestamp – a unix timestamp, in seconds

          +
          +
          +
          + +
          +
          +cassandra.util.datetime_from_uuid1(uuid_arg)
          +

          Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

          +
          +
          Parameters:
          +

          uuid_arg – a version 1 UUID

          +
          +
          +
          + +
          +
          +cassandra.util.max_uuid_from_time(timestamp)
          +

          Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

          +

          See uuid_from_time() for argument and return types.

          +
          + +
          +
          +cassandra.util.min_uuid_from_time(timestamp)
          +

          Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

          +

          See uuid_from_time() for argument and return types.

          +
          + +
          +
          +cassandra.util.ms_timestamp_from_datetime(dt)
          +

          Converts a datetime to a timestamp expressed in milliseconds.

          +
          +
          Parameters:
          +

          dt – a datetime.datetime

          +
          +
          +
          + +
          +
          +cassandra.util.sortedset
          +

          alias of SortedSet

          +
          + +
          +
          +cassandra.util.unix_time_from_uuid1(uuid_arg)
          +

          Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

          +
          +
          Parameters:
          +

          uuid_arg – a version 1 UUID

          +
          +
          +
          + +
          +
          +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
          +

          Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

          +

          Raises an OverflowError if the timestamp is out of range for +datetime.

          +
          +
          Parameters:
          +

          timestamp – timestamp, in milliseconds

          +
          +
          +
          + +
          +
          +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
          +

          Converts a datetime or timestamp to a type 1 uuid.UUID.

          +
          +
          Parameters:
          +
            +
          • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

          • +
          • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

          • +
          • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

          • +
          +
          +
          Return type:
          +

          uuid.UUID

          +
          +
          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/api/index.html b/3.24.8-scylla/api/index.html new file mode 100644 index 0000000000..6699783379 --- /dev/null +++ b/3.24.8-scylla/api/index.html @@ -0,0 +1,872 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          API Documentation

          +
          +

          Core Driver

          +
          + +
          +
          +
          +

          Object Mapper

          + +
          +
          +

          DataStax Graph

          + +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/batches.html b/3.24.8-scylla/cqlengine/batches.html new file mode 100644 index 0000000000..6537cadfeb --- /dev/null +++ b/3.24.8-scylla/cqlengine/batches.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + + + +
          +

          Batch Queries

          +

          cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

          +
          +

          Batch Query General Use Pattern

          +

          You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

          +
          from cassandra.cqlengine.query import BatchQuery
          +
          +#using a context manager
          +with BatchQuery() as b:
          +    now = datetime.now()
          +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
          +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
          +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
          +
          +# -- or --
          +
          +#manually
          +b = BatchQuery()
          +now = datetime.now()
          +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
          +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
          +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
          +b.execute()
          +
          +# updating in a batch
          +
          +b = BatchQuery()
          +em1.description = "new description"
          +em1.batch(b).save()
          +em2.description = "another new description"
          +em2.batch(b).save()
          +b.execute()
          +
          +# deleting in a batch
          +b = BatchQuery()
          +ExampleModel.objects(id=some_id).batch(b).delete()
          +ExampleModel.objects(id=some_id2).batch(b).delete()
          +b.execute()
          +
          +
          +

          Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

          +
          with BatchQuery(execute_on_exception=True) as b:
          +    LogEntry.batch(b).create(k=1, v=1)
          +    mystery_function() # exception thrown in here
          +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
          +
          +
          +

          If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

          +
          +
          +

          Batch Query Execution Callbacks

          +

          In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

          +

          Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

          +

          The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

          +
          def my_callback(*args, **kwargs):
          +    pass
          +
          +batch = BatchQuery()
          +
          +batch.add_callback(my_callback)
          +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
          +
          +# if you need reference to the batch within the callback,
          +# just trap it in the arguments to be passed to the callback:
          +batch.add_callback(my_callback, cqlengine_batch=batch)
          +
          +# once the batch executes...
          +batch.execute()
          +
          +# the effect of the above scheduled callbacks will be similar to
          +my_callback()
          +my_callback('positional arg', named_arg='named arg value')
          +my_callback(cqlengine_batch=batch)
          +
          +
          +

          Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

          +
          +

          Logged vs Unlogged Batches

          +

          By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

          +
          from cassandra.cqlengine.query import BatchType
          +with BatchQuery(batch_type=BatchType.Unlogged) as b:
          +    LogEntry.batch(b).create(k=1, v=1)
          +    LogEntry.batch(b).create(k=1, v=2)
          +
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/connections.html b/3.24.8-scylla/cqlengine/connections.html new file mode 100644 index 0000000000..9b67208851 --- /dev/null +++ b/3.24.8-scylla/cqlengine/connections.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + + + +
          +

          Connections

          +

          Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

          +
          +

          Register a new connection

          +

          To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

          +
          from cassandra.cqlengine import connection
          +
          +connection.setup(['127.0.0.1')
          +connection.register_connection('cluster2', ['127.0.0.2'])
          +
          +
          +

          register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

          +
          from cassandra.cqlengine import connection
          +from cassandra.cluster import Cluster
          +
          +session = Cluster(['127.0.0.1']).connect()
          +connection.register_connection('cluster3', session=session)
          +
          +
          +
          +
          +

          Change the default connection

          +

          You can change the default cqlengine connection on registration:

          +
          from cassandra.cqlengine import connection
          +
          +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
          +
          +
          +

          or on the fly using set_default_connection()

          +
          connection.set_default_connection('cluster2')
          +
          +
          +
          +
          +

          Unregister a connection

          +

          You can unregister a connection using unregister_connection():

          +
          connection.unregister_connection('cluster2')
          +
          +
          +
          +
          +

          Management

          +

          When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

          +
          from cassandra.cqlengine import management
          +
          +keyspaces = ['ks1', 'ks2']
          +conns = ['cluster1', 'cluster2']
          +
          +# registers your connections
          +# ...
          +
          +# create all keyspaces on all connections
          +for ks in keyspaces:
          +    management.create_simple_keyspace(ks, connections=conns)
          +
          +# define your Automobile model
          +# ...
          +
          +# sync your models
          +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
          +
          +
          +
          +
          +

          Connection Selection

          +

          cqlengine will select the default connection, unless your specify a connection using one of the following methods.

          +
          +

          Default Model Connection

          +

          You can specify a default connection per model:

          +
          class Automobile(Model):
          +    __keyspace__ = 'test'
          +    __connection__ = 'cluster2'
          +    manufacturer = columns.Text(primary_key=True)
          +    year = columns.Integer(primary_key=True)
          +    model = columns.Text(primary_key=True)
          +
          +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
          +
          +
          +
          +
          +

          QuerySet and model instance

          +

          You can use the using() method to select a connection (or keyspace):

          +
          Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
          +q = Automobile.objects.filter(manufacturer='Tesla')
          +autos = q.using(keyspace='ks2', connection='cluster2').all()
          +
          +for auto in autos:
          +    auto.using(connection='cluster1').save()
          +
          +
          +
          +
          +

          Context Manager

          +

          You can use the ContextQuery as well to select a connection:

          +
          with ContextQuery(Automobile, connection='cluster1') as A:
          +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
          +
          +
          +
          +
          +

          BatchQuery

          +

          With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

          +
          with BatchQuery(connection='cluster1') as b:
          +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
          +
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/faq.html b/3.24.8-scylla/cqlengine/faq.html new file mode 100644 index 0000000000..be3388ecf4 --- /dev/null +++ b/3.24.8-scylla/cqlengine/faq.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Frequently Asked Questions

          +
          +

          Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

          +

          The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

          +
          +
          +

          How to preserve ordering in batch query?

          +

          Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

          +
            +
          • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

          • +
          • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

          • +
          • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

          • +
          +

          Below is an example to show this scenario.

          +
          class MyMode(Model):
          +    id    = columns.Integer(primary_key=True)
          +    count = columns.Integer()
          +    text  = columns.Text()
          +
          +with BatchQuery() as b:
          +   MyModel.batch(b).create(id=1, count=2, text='123')
          +   MyModel.batch(b).create(id=1, count=3, text='111')
          +
          +assert MyModel.objects(id=1).first().count == 3
          +assert MyModel.objects(id=1).first().text  == '123'
          +
          +
          +

          The largest value of count is 3, and the largest value of text would be ‘123’.

          +

          The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

          +
          with BatchQuery() as b:
          +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
          +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
          +
          +assert MyModel.objects(id=1).first().count == 3
          +assert MyModel.objects(id=1).first().text  == '111'
          +
          +
          +
          +
          +

          How can I delete individual values from a row?

          +

          When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

          +
          class MyModel(Model):
          +    id    = columns.Integer(primary_key=True)
          +    text  = columns.Text()
          +
          +m = MyModel.create(id=1, text='We can delete this with None')
          +assert MyModel.objects(id=1).first().text is not None
          +
          +m.update(text=None)
          +assert MyModel.objects(id=1).first().text is None
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/models.html b/3.24.8-scylla/cqlengine/models.html new file mode 100644 index 0000000000..efd41180fc --- /dev/null +++ b/3.24.8-scylla/cqlengine/models.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + + + +
          +

          Models

          +

          A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

          +

          Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

          +

          Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

          +
          +

          Example Definitions

          +

          This example defines a Person table, with the columns first_name and last_name

          +
          from cassandra.cqlengine import columns
          +from cassandra.cqlengine.models import Model
          +
          + class Person(Model):
          +     id = columns.UUID(primary_key=True)
          +     first_name  = columns.Text()
          +     last_name = columns.Text()
          +
          +
          +

          The Person model would create this CQL table:

          +
          CREATE TABLE cqlengine.person (
          +    id uuid,
          +    first_name text,
          +    last_name text,
          +    PRIMARY KEY (id)
          +);
          +
          +
          +

          Here’s an example of a comment table created with clustering keys, in descending order:

          +
          from cassandra.cqlengine import columns
          +from cassandra.cqlengine.models import Model
          +
          +class Comment(Model):
          +    photo_id = columns.UUID(primary_key=True)
          +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
          +    comment = columns.Text()
          +
          +
          +

          The Comment model’s create table would look like the following:

          +
          CREATE TABLE comment (
          +  photo_id uuid,
          +  comment_id timeuuid,
          +  comment text,
          +  PRIMARY KEY (photo_id, comment_id)
          +) WITH CLUSTERING ORDER BY (comment_id DESC);
          +
          +
          +

          To sync the models to the database, you may do the following*:

          +
          from cassandra.cqlengine.management import sync_table
          +sync_table(Person)
          +sync_table(Comment)
          +
          +
          +

          *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

          +

          For examples on manipulating data and creating queries, see Making Queries

          +
          +
          +

          Manipulating model instances as dictionaries

          +

          Model instances can be accessed like dictionaries.

          +
          class Person(Model):
          +    first_name  = columns.Text()
          +    last_name = columns.Text()
          +
          +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
          +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
          +kevin['first_name']  # returns 'Kevin'
          +kevin.keys()  # returns ['first_name', 'last_name']
          +kevin.values()  # returns ['Kevin', 'Deldycke']
          +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
          +
          +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
          +
          +
          +
          +
          +

          Extending Model Validation

          +

          Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

          +

          However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

          +
          class Member(Model):
          +    person_id = UUID(primary_key=True)
          +    name = Text(required=True)
          +
          +    def validate(self):
          +        super(Member, self).validate()
          +        if self.name == 'jon':
          +            raise ValidationError('no jon\'s allowed')
          +
          +
          +

          Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

          +
          +
          +

          Model Inheritance

          +

          It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

          +

          For instance, suppose you want a table that stores rows of pets owned by an owner:

          +
          class Pet(Model):
          +    __table_name__ = 'pet'
          +    owner_id = UUID(primary_key=True)
          +    pet_id = UUID(primary_key=True)
          +    pet_type = Text(discriminator_column=True)
          +    name = Text()
          +
          +    def eat(self, food):
          +        pass
          +
          +    def sleep(self, time):
          +        pass
          +
          +class Cat(Pet):
          +    __discriminator_value__ = 'cat'
          +    cuteness = Float()
          +
          +    def tear_up_couch(self):
          +        pass
          +
          +class Dog(Pet):
          +    __discriminator_value__ = 'dog'
          +    fierceness = Float()
          +
          +    def bark_all_night(self):
          +        pass
          +
          +
          +

          After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

          +

          To setup a model structure with inheritance, follow these steps

          +
            +
          1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

          2. +
          3. Create subclass models, and define a unique __discriminator_value__ value on each

          4. +
          5. Run sync_table on each of the sub tables

          6. +
          +

          About the discriminator value

          +

          The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

          +
          +
          +

          User Defined Types

          +

          cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

          +
          from cassandra.cqlengine.columns import *
          +from cassandra.cqlengine.models import Model
          +from cassandra.cqlengine.usertype import UserType
          +
          +class address(UserType):
          +    street = Text()
          +    zipcode = Integer()
          +
          +class users(Model):
          +    __keyspace__ = 'account'
          +    name = Text(primary_key=True)
          +    addr = UserDefinedType(address)
          +
          +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
          +user = users.objects(name="Joe")[0]
          +print user.name, user.addr
          +# Joe address(street=u'Easy St.', zipcode=99999)
          +
          +
          +

          UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

          +

          sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

          +

          Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

          +

          *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/queryset.html b/3.24.8-scylla/cqlengine/queryset.html new file mode 100644 index 0000000000..a9ecd06091 --- /dev/null +++ b/3.24.8-scylla/cqlengine/queryset.html @@ -0,0 +1,996 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Making Queries

          +
          +

          Retrieving objects

          +

          Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

          +
          +

          Retrieving all objects

          +

          The simplest query you can make is to return all objects from a table.

          +

          This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

          +

          Using the Person example model, we would get all Person objects like this:

          +
          all_objects = Person.objects.all()
          +
          +
          +
          +
          +

          Retrieving objects with filters

          +

          Typically, you’ll want to query only a subset of the records in your database.

          +

          That can be accomplished with the QuerySet’s .filter(\*\*) method.

          +

          For example, given the model definition:

          +
          class Automobile(Model):
          +    manufacturer = columns.Text(primary_key=True)
          +    year = columns.Integer(primary_key=True)
          +    model = columns.Text()
          +    price = columns.Decimal()
          +    options = columns.Set(columns.Text)
          +
          +
          +

          …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +
          +
          +

          You can also use the more convenient syntax:

          +
          q = Automobile.objects(Automobile.manufacturer == 'Tesla')
          +
          +
          +

          We can then further filter our query with another call to .filter

          +
          q = q.filter(year=2012)
          +
          +
          +

          Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

          +
          +
          +
          +

          Accessing objects in a QuerySet

          +

          There are several methods for getting objects out of a queryset

          +
            +
          • +
            iterating over the queryset
            for car in Automobile.objects.all():
            +    #...do something to the car instance
            +    pass
            +
            +
            +
            +
            +
          • +
          • +
            list index
            q = Automobile.objects.all()
            +q[0] #returns the first result
            +q[1] #returns the second result
            +
            +
            +
            +

            Note

            +
              +
            • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

            • +
            • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

            • +
            +
            +
            +
            +
          • +
          • +
            list slicing
            q = Automobile.objects.all()
            +q[1:] #returns all results except the first
            +q[1:9] #returns a slice of the results
            +
            +
            +
            +

            Note

            +
              +
            • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

            • +
            • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

            • +
            +
            +
            +
            +
          • +
          • +
            calling get() on the queryset
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year=2012)
            +car = q.get()
            +
            +
            +

            this returns the object matching the queryset

            +
            +
            +
          • +
          • +
            calling first() on the queryset
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year=2012)
            +car = q.first()
            +
            +
            +

            this returns the first value in the queryset

            +
            +
            +
          • +
          +
          +
          +

          Filtering Operators

          +

          Equal To

          +

          The default filtering operator.

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year=2012)  #year == 2012
          +
          +
          +

          In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

          +

          in (__in)

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year__in=[2011, 2012])
          +
          +
          +

          > (__gt)

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year__gt=2010)  # year > 2010
          +
          +# or the nicer syntax
          +
          +q.filter(Automobile.year > 2010)
          +
          +
          +

          >= (__gte)

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year__gte=2010)  # year >= 2010
          +
          +# or the nicer syntax
          +
          +q.filter(Automobile.year >= 2010)
          +
          +
          +

          < (__lt)

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year__lt=2012)  # year < 2012
          +
          +# or...
          +
          +q.filter(Automobile.year < 2012)
          +
          +
          +

          <= (__lte)

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q = q.filter(year__lte=2012)  # year <= 2012
          +
          +q.filter(Automobile.year <= 2012)
          +
          +
          +

          CONTAINS (__contains)

          +

          The CONTAINS operator is available for all collection types (List, Set, Map).

          +
          q = Automobile.objects.filter(manufacturer='Tesla')
          +q.filter(options__contains='backup camera').allow_filtering()
          +
          +
          +

          Note that we need to use allow_filtering() since the options column has no secondary index.

          +

          LIKE (__like)

          +

          The LIKE operator is available for text columns that have a SASI secondary index.

          +
          q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
          +
          +
          +

          IS NOT NULL (IsNotNull(column_name))

          +

          The IS NOT NULL operator is not yet supported for C*.

          +
          q = Automobile.objects.filter(IsNotNull('model'))
          +
          +
          +

          Limitations:

          +
            +
          • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

          • +
          • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

          • +
          +
          +
          +

          TimeUUID Functions

          +

          In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

          +
          +
          +class cqlengine.queryset.MinTimeUUID(datetime)
          +

          returns the minimum time uuid value possible for the given datetime

          +
          + +
          +
          +class cqlengine.queryset.MaxTimeUUID(datetime)
          +

          returns the maximum time uuid value possible for the given datetime

          +
          + +

          Example

          +
          class DataStream(Model):
          +    id      = columns.UUID(partition_key=True)
          +    time    = columns.TimeUUID(primary_key=True)
          +    data    = columns.Bytes()
          +
          +min_time = datetime(1982, 1, 1)
          +max_time = datetime(1982, 3, 9)
          +
          +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
          +
          +
          +
          +
          +

          Token Function

          +

          Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

          +

          See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

          +

          Example

          +
          class Items(Model):
          +    id      = columns.Text(primary_key=True)
          +    data    = columns.Bytes()
          +
          +query = Items.objects.all().limit(10)
          +
          +first_page = list(query);
          +last = first_page[-1]
          +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
          +
          +
          +
          +
          +

          QuerySets are immutable

          +

          When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

          +

          Example

          +
          #this produces 3 different querysets
          +#q does not change after it's initial definition
          +q = Automobiles.objects.filter(year=2012)
          +tesla2012 = q.filter(manufacturer='Tesla')
          +honda2012 = q.filter(manufacturer='Honda')
          +
          +
          +
          +
          +

          Ordering QuerySets

          +

          Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

          +

          However, you can set a column to order on with the .order_by(column_name) method.

          +

          Example

          +
          #sort ascending
          +q = Automobiles.objects.all().order_by('year')
          +#sort descending
          +q = Automobiles.objects.all().order_by('-year')
          +
          +
          +

          Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

          +

          For instance, given our Automobile model, year is the only column we can order on.

          +
          +
          +

          Values Lists

          +

          There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

          +
          items = list(range(20))
          +random.shuffle(items)
          +for i in items:
          +    TestModel.create(id=1, clustering_key=i)
          +
          +values = list(TestModel.objects.values_list('clustering_key', flat=True))
          +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
          +
          +
          +
          +
          +

          Per Query Timeouts

          +

          By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

          +
          class Row(Model):
          +    id = columns.Integer(primary_key=True)
          +    name = columns.Text()
          +
          +
          +

          Fetch all objects with a timeout of 5 seconds

          +
          Row.objects().timeout(5).all()
          +
          +
          +

          Create a single row with a 50ms timeout

          +
          Row(id=1, name='Jon').timeout(0.05).create()
          +
          +
          +

          Delete a single row with no timeout

          +
          Row(id=1).timeout(None).delete()
          +
          +
          +

          Update a single row with no timeout

          +
          Row(id=1).timeout(None).update(name='Blake')
          +
          +
          +

          Batch query timeouts

          +
          with BatchQuery(timeout=10) as b:
          +    Row(id=1, name='Jon').create()
          +
          +
          +

          NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

          +
          +
          +

          Default TTL and Per Query TTL

          +

          Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

          +

          Example:

          +
          class User(Model):
          +    __options__ = {'default_time_to_live': 20}
          +
          +    user_id = columns.UUID(primary_key=True)
          +    ...
          +
          +
          +

          You can set TTL per-query if needed. Here are a some examples:

          +

          Example:

          +
          class User(Model):
          +    __options__ = {'default_time_to_live': 20}
          +
          +    user_id = columns.UUID(primary_key=True)
          +    ...
          +
          +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
          +
          +user.ttl(30).update(age=21)            # Update the TTL to 30
          +User.objects.ttl(10).create(user_id=1)  # TTL 10
          +User(user_id=1, age=21).ttl(10).save()  # TTL 10
          +
          +
          +
          +
          +

          Named Tables

          +

          Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

          +
          from cassandra.cqlengine.connection import setup
          +setup("127.0.0.1", "cqlengine_test")
          +
          +from cassandra.cqlengine.named import NamedTable
          +user = NamedTable("cqlengine_test", "user")
          +user.objects()
          +user.objects()[0]
          +
          +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/third_party.html b/3.24.8-scylla/cqlengine/third_party.html new file mode 100644 index 0000000000..33728bdd52 --- /dev/null +++ b/3.24.8-scylla/cqlengine/third_party.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Third party integrations

          +
          +

          Celery

          +

          Here’s how, in substance, CQLengine can be plugged to Celery:

          +
          from celery import Celery
          +from celery.signals import worker_process_init, beat_init
          +from cassandra.cqlengine import connection
          +from cassandra.cqlengine.connection import (
          +    cluster as cql_cluster, session as cql_session)
          +
          +def cassandra_init(**kwargs):
          +    """ Initialize a clean Cassandra connection. """
          +    if cql_cluster is not None:
          +        cql_cluster.shutdown()
          +    if cql_session is not None:
          +        cql_session.shutdown()
          +    connection.setup()
          +
          +# Initialize worker context for both standard and periodic tasks.
          +worker_process_init.connect(cassandra_init)
          +beat_init.connect(cassandra_init)
          +
          +app = Celery()
          +
          +
          +
          +
          +

          uWSGI

          +

          This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

          +
          from cassandra.cqlengine import connection
          +from cassandra.cqlengine.connection import (
          +    cluster as cql_cluster, session as cql_session)
          +
          +try:
          +    from uwsgidecorators import postfork
          +except ImportError:
          +    # We're not in a uWSGI context, no need to hook Cassandra session
          +    # initialization to the postfork event.
          +    pass
          +else:
          +    @postfork
          +    def cassandra_init(**kwargs):
          +        """ Initialize a new Cassandra session in the context.
          +
          +        Ensures that a new session is returned for every new request.
          +        """
          +        if cql_cluster is not None:
          +            cql_cluster.shutdown()
          +        if cql_session is not None:
          +            cql_session.shutdown()
          +        connection.setup()
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/cqlengine/upgrade_guide.html b/3.24.8-scylla/cqlengine/upgrade_guide.html new file mode 100644 index 0000000000..2ea511164f --- /dev/null +++ b/3.24.8-scylla/cqlengine/upgrade_guide.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + + + +
          +

          Upgrade Guide

          +

          This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

          +

          THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

          +
          +

          Functional Changes

          +
          +

          List Prepend Reversing

          +

          Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

          +
          +
          +

          Date Column Type

          +

          The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

          +
          +
          +
          +

          Remove cqlengine

          +

          To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

          +

          The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

          +
          +
          +

          Organization

          +
          +

          Imports

          +

          cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

          +
          from cassandra.cqlengine import columns
          +
          +
          +

          is now:

          +
          from cassandra.cqlengine import columns
          +
          +
          +
          +
          +

          Package-Level Aliases

          +

          Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

          +

          Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

          +

          These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

          +
          +
          +

          Exceptions

          +

          The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

          + + + + + + + + + + + + + + + + + + + + + + + + + + +

          Exception class

          New module

          CQLEngineException

          cassandra.cqlengine

          ModelException

          cassandra.cqlengine.models

          ValidationError

          cassandra.cqlengine

          UndefinedKeyspaceException

          cassandra.cqlengine.connection

          LWTException

          cassandra.cqlengine.query

          IfNotExistsWithCounterColumn

          cassandra.cqlengine.query

          +
          +
          +

          UnicodeMixin Consolidation

          +

          class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

          +
          +
          +
          +

          API Deprecations

          +

          This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

          +
          +

          Float/Double Overload

          +

          Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

          +
          +
          +

          Schema Management

          +

          cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

          + +

          cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

          +
          +
          +

          Model Inheritance

          +

          The names for class attributes controlling model inheritance are changing. Changes are as follows:

          + +

          The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

          +

          The example below shows a simple translation:

          +

          Before:

          +
          class Pet(Model):
          +    __table_name__ = 'pet'
          +    owner_id = UUID(primary_key=True)
          +    pet_id = UUID(primary_key=True)
          +    pet_type = Text(polymorphic_key=True)
          +    name = Text()
          +
          +class Cat(Pet):
          +    __polymorphic_key__ = 'cat'
          +
          +class Dog(Pet):
          +    __polymorphic_key__ = 'dog'
          +
          +
          +

          After:

          +
          class Pet(models.Model):
          +    __table_name__ = 'pet'
          +    owner_id = UUID(primary_key=True)
          +    pet_id = UUID(primary_key=True)
          +    pet_type = Text(discriminator_column=True)
          +    name = Text()
          +
          +class Cat(Pet):
          +    __discriminator_value__ = 'cat'
          +
          +class Dog(Pet):
          +    __discriminator_value__ = 'dog'
          +
          +
          +
          +
          +

          TimeUUID.from_datetime

          +

          This function is deprecated in favor of the core utility function uuid_from_time().

          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/dates_and_times.html b/3.24.8-scylla/dates_and_times.html new file mode 100644 index 0000000000..baebce06c1 --- /dev/null +++ b/3.24.8-scylla/dates_and_times.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Working with Dates and Times

          +

          This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

          +
          +

          timestamps (Cassandra DateType)

          +

          Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

          +
          +

          Write Path

          +

          When inserting timestamps, the driver handles serialization for the write path as follows:

          +

          If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

          +
            +
          • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

          • +
          • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

          • +
          +

          Note the second point above applies even to “local” times created using now():

          +
          >>> d = datetime.now()
          +
          +>>> print(d.tzinfo)
          +None
          +
          +
          +

          These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

          +

          If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

          +
          +
          +

          Read Path

          +

          The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

          +

          The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

          +
          import pytz
          +user_tz = pytz.timezone('US/Central')
          +timestamp_naive = row.ts
          +timestamp_utc = pytz.utc.localize(timestamp_naive)
          +timestamp_presented = timestamp_utc.astimezone(user_tz)
          +
          +
          +

          This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

          +
          +
          +
          +

          date, time (Cassandra DateType)

          +

          Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

          +
          +

          Write Path

          +

          For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

          +

          For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

          +
          +
          +

          Read Path

          +

          The driver always returns custom types for date and time.

          +

          The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

          +

          The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/execution_profiles.html b/3.24.8-scylla/execution_profiles.html new file mode 100644 index 0000000000..b44c6f220f --- /dev/null +++ b/3.24.8-scylla/execution_profiles.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Execution Profiles

          +

          Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

          +

          The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

          +

          An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

          +

          This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

          +
          +

          Mapping Legacy Parameters to Profiles

          +

          Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

          + +

          When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

          +
          +
          +

          Using Execution Profiles

          +
          +

          Default

          +
          from cassandra.cluster import Cluster
          +cluster = Cluster()
          +session = cluster.connect()
          +local_query = 'SELECT rpc_address FROM system.local'
          +for _ in cluster.metadata.all_hosts():
          +    print session.execute(local_query)[0]
          +
          +
          +
          Row(rpc_address='127.0.0.2')
          +Row(rpc_address='127.0.0.1')
          +
          +
          +

          The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

          +
          +
          +

          Initializing cluster with profiles

          +
          from cassandra.cluster import ExecutionProfile
          +from cassandra.policies import WhiteListRoundRobinPolicy
          +
          +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
          +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
          +
          +profiles = {'node1': node1_profile, 'node2': node2_profile}
          +session = Cluster(execution_profiles=profiles).connect()
          +for _ in cluster.metadata.all_hosts():
          +    print session.execute(local_query, execution_profile='node1')[0]
          +
          +
          +
          Row(rpc_address='127.0.0.1')
          +Row(rpc_address='127.0.0.1')
          +
          +
          +
          for _ in cluster.metadata.all_hosts():
          +    print session.execute(local_query, execution_profile='node2')[0]
          +
          +
          +
          Row(rpc_address='127.0.0.2')
          +Row(rpc_address='127.0.0.2')
          +
          +
          +
          for _ in cluster.metadata.all_hosts():
          +    print session.execute(local_query)[0]
          +
          +
          +
          Row(rpc_address='127.0.0.2')
          +Row(rpc_address='127.0.0.1')
          +
          +
          +

          Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

          +
          from cassandra.cluster import EXEC_PROFILE_DEFAULT
          +profile = ExecutionProfile(request_timeout=30)
          +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
          +
          +
          +
          +
          +

          Adding named profiles

          +

          New profiles can be added constructing from scratch, or deriving from default:

          +
          locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
          +node1_profile = 'node1_whitelist'
          +cluster.add_execution_profile(node1_profile, locked_execution)
          +
          +for _ in cluster.metadata.all_hosts():
          +    print session.execute(local_query, execution_profile=node1_profile)[0]
          +
          +
          +
          Row(rpc_address='127.0.0.1')
          +Row(rpc_address='127.0.0.1')
          +
          +
          +

          See Cluster.add_execution_profile() for details and optional parameters.

          +
          +
          +

          Passing a profile instance without mapping

          +

          We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

          +
          from cassandra.query import tuple_factory
          +
          +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
          +
          +print session.execute(local_query, execution_profile=tmp)[0]
          +print session.execute(local_query, execution_profile='node1')[0]
          +
          +
          +
          ('127.0.0.1',)
          +Row(rpc_address='127.0.0.1')
          +
          +
          +

          The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/faq.html b/3.24.8-scylla/faq.html new file mode 100644 index 0000000000..48eb6ad55e --- /dev/null +++ b/3.24.8-scylla/faq.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Frequently Asked Questions

          +

          See also cqlengine FAQ

          +
          +

          Why do connections or IO operations timeout in my WSGI application?

          +

          Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

          +

          To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

          +
          from flask import Flask
          +from uwsgidecorators import postfork
          +from cassandra.cluster import Cluster
          +
          +session = None
          +prepared = None
          +
          +@postfork
          +def connect():
          +    global session, prepared
          +    session = Cluster().connect()
          +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
          +
          +app = Flask(__name__)
          +
          +@app.route('/')
          +def server_version():
          +    row = session.execute(prepared, ('local',))[0]
          +    return row.release_version
          +
          +
          +

          uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

          +
          +
          +

          How do I trace a request?

          +

          Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

          +
          >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
          +>>> result = future.result()
          +>>> trace = future.get_query_trace()
          +>>> for e in trace.events:
          +>>>     print e.source_elapsed, e.description
          +
          +0:00:00.000077 Parsing select * from system.local
          +0:00:00.000153 Preparing statement
          +0:00:00.000309 Computing ranges to query
          +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
          +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
          +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
          +0:00:00.000669 Read 1 live and 0 tombstone cells
          +0:00:00.000755 Scanned 1 rows and matched 1
          +
          +
          +

          trace is a QueryTrace object.

          +
          +
          +

          How do I determine the replicas for a query?

          +

          With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

          +
          >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
          +>>> bound = prepared.bind((1,))
          +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
          +>>> for h in replicas:
          +>>>   print h.address
          +127.0.0.1
          +127.0.0.2
          +
          +
          +

          replicas is a list of Host objects.

          +
          +
          +

          How does the driver manage request retries?

          +

          By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

          +

          Retries are presently attempted on the same coordinator, but this may change in the future.

          +

          Please see policies.RetryPolicy for further details.

          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/getting_started.html b/3.24.8-scylla/getting_started.html new file mode 100644 index 0000000000..5f15283467 --- /dev/null +++ b/3.24.8-scylla/getting_started.html @@ -0,0 +1,1097 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Getting Started

          +

          First, make sure you have the driver properly installed.

          +
          +

          Connecting to Cassandra

          +

          Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

          +

          The simplest way to create a Cluster is like this: +First, make sure you have the Cassandra driver properly installed.

          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster()
          +
          +
          +

          This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
          +
          +
          +

          The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

          +

          If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

          +
          from cassandra.cluster import Cluster
          +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
          +
          +
          +

          Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

          +
          cluster = Cluster()
          +session = cluster.connect()
          +
          +
          +

          The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

          +
          cluster = Cluster()
          +session = cluster.connect('mykeyspace')
          +
          +
          +

          You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

          +
          session.set_keyspace('users')
          +# or you can do this instead
          +session.execute('USE users')
          +
          +
          +

          Profiles are passed in by execution_profiles dict.

          +

          In this case we can construct the base ExecutionProfile passing all attributes:

          +
          from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
          +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
          +from cassandra.query import tuple_factory
          +
          +profile = ExecutionProfile(
          +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
          +    retry_policy=DowngradingConsistencyRetryPolicy(),
          +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
          +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
          +    request_timeout=15,
          +    row_factory=tuple_factory
          +)
          +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
          +session = cluster.connect()
          +
          +print(session.execute("SELECT release_version FROM system.local").one())
          +
          +
          +

          Users are free to setup additional profiles to be used by name:

          +
          profile_long = ExecutionProfile(request_timeout=30)
          +cluster = Cluster(execution_profiles={'long': profile_long})
          +session = cluster.connect()
          +session.execute(statement, execution_profile='long')
          +
          +
          +

          Also, parameters passed to Session.execute or attached to Statements are still honored as before.

          +
          +
          +

          Executing Queries

          +

          Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

          +
          rows = session.execute('SELECT name, age, email FROM users')
          +for user_row in rows:
          +    print user_row.name, user_row.age, user_row.email
          +
          +
          +

          This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

          +

          By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

          +
          rows = session.execute('SELECT name, age, email FROM users')
          +for row in rows:
          +    print row.name, row.age, row.email
          +
          +
          +
          rows = session.execute('SELECT name, age, email FROM users')
          +for (name, age, email) in rows:
          +    print name, age, email
          +
          +
          +
          rows = session.execute('SELECT name, age, email FROM users')
          +for row in rows:
          +    print row[0], row[1], row[2]
          +
          +
          +

          If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

          +

          As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

          +
          +
          +

          Prepared Statements

          +

          Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

          +

          To prepare a query, use Session.prepare():

          +
          user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
          +
          +users = []
          +for user_id in user_ids_to_query:
          +    user = session.execute(user_lookup_stmt, [user_id])
          +    users.append(user)
          +
          +
          +

          prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

          +

          Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

          +
          +

          Passing Parameters to CQL Queries

          +

          Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

          +

          Positional parameters are used with a %s placeholder. For example, +when you execute:

          +
          session.execute(
          +    """
          +    INSERT INTO users (name, credits, user_id)
          +    VALUES (%s, %s, %s)
          +    """,
          +    ("John O'Reilly", 42, uuid.uuid1())
          +)
          +
          +
          +

          It is translated to the following CQL query:

          +
          INSERT INTO users (name, credits, user_id)
          +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
          +
          +
          +

          Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

          +
          session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
          +
          +
          +

          Instead, use %s for the age placeholder.

          +

          If you need to use a literal % character, use %%.

          +

          Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

          +
          session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
          +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
          +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
          +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
          +
          +
          +

          Note that the second line is incorrect because in Python, single-element tuples +require a comma.

          +

          Named place-holders use the %(name)s form:

          +
          session.execute(
          +    """
          +    INSERT INTO users (name, credits, user_id, username)
          +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
          +    """,
          +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
          +)
          +
          +
          +

          Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

          +

          Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

          +
          +
          +

          Type Conversions

          +

          For non-prepared statements, Python types are cast to CQL literals in the +following way:

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          Python Type

          CQL Literal Type

          None

          NULL

          bool

          boolean

          float

          +
          float
          +
          double
          +
          +
          +
          int
          +
          long
          +
          +
          +
          int
          +
          bigint
          +
          varint
          +
          smallint
          +
          tinyint
          +
          counter
          +
          +

          decimal.Decimal

          decimal

          +
          str
          +
          unicode
          +
          +
          +
          ascii
          +
          varchar
          +
          text
          +
          +
          +
          buffer
          +
          bytearray
          +
          +

          blob

          date

          date

          datetime

          timestamp

          time

          time

          +
          list
          +
          tuple
          +
          generator
          +
          +

          list

          +
          set
          +
          frozenset
          +
          +

          set

          +
          dict
          +
          OrderedDict
          +
          +

          map

          uuid.UUID

          +
          timeuuid
          +
          uuid
          +
          +
          +
          +
          +

          Asynchronous Queries

          +

          The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

          +

          The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

          +
          from cassandra import ReadTimeout
          +
          +query = "SELECT * FROM users WHERE user_id=%s"
          +future = session.execute_async(query, [user_id])
          +
          +# ... do some other work
          +
          +try:
          +    rows = future.result()
          +    user = rows[0]
          +    print user.name, user.age
          +except ReadTimeout:
          +    log.exception("Query timed out:")
          +
          +
          +

          This works well for executing many queries concurrently:

          +
          # build a list of futures
          +futures = []
          +query = "SELECT * FROM users WHERE user_id=%s"
          +for user_id in ids_to_fetch:
          +    futures.append(session.execute_async(query, [user_id])
          +
          +# wait for them to complete and use the results
          +for future in futures:
          +    rows = future.result()
          +    print rows[0].name
          +
          +
          +

          Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

          +
          def handle_success(rows):
          +    user = rows[0]
          +    try:
          +        process_user(user.name, user.age, user.id)
          +    except Exception:
          +        log.error("Failed to process user %s", user.id)
          +        # don't re-raise errors in the callback
          +
          +def handle_error(exception):
          +    log.error("Failed to fetch user info: %s", exception)
          +
          +
          +future = session.execute_async(query)
          +future.add_callbacks(handle_success, handle_error)
          +
          +
          +
          +
          There are a few important things to remember when working with callbacks:
            +
          • Exceptions that are raised inside the callback functions will be logged and then ignored.

          • +
          • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

          • +
          +
          +
          +
          +
          +
          +

          Setting a Consistency Level

          +

          The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

          +

          By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

          +
          from cassandra import ConsistencyLevel
          +from cassandra.query import SimpleStatement
          +
          +query = SimpleStatement(
          +    "INSERT INTO users (name, age) VALUES (%s, %s)",
          +    consistency_level=ConsistencyLevel.QUORUM)
          +session.execute(query, ('John', 42))
          +
          +
          +
          +

          Setting a Consistency Level with Prepared Statements

          +

          To specify a consistency level for prepared statements, you have two options.

          +

          The first is to set a default consistency level for every execution of the +prepared statement:

          +
          from cassandra import ConsistencyLevel
          +
          +cluster = Cluster()
          +session = cluster.connect("mykeyspace")
          +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
          +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
          +
          +# these will both use QUORUM
          +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
          +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
          +
          +
          +

          The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

          +
          # override the QUORUM default
          +user3_lookup = user_lookup_stmt.bind([user_id3])
          +user3_lookup.consistency_level = ConsistencyLevel.ALL
          +user3 = session.execute(user3_lookup)
          +
          +
          +
          +
          +

          Speculative Execution

          +

          Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

          +

          To enable speculative execution:

          +
            +
          • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

          • +
          • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

          • +
          +

          Example:

          +
          from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
          +from cassandra.policies import ConstantSpeculativeExecutionPolicy
          +from cassandra.query import SimpleStatement
          +
          +# Configure the speculative execution policy
          +ep = ExecutionProfile(
          +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
          +)
          +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
          +session = cluster.connect()
          +
          +# Mark the query idempotent
          +query = SimpleStatement(
          +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
          +    is_idempotent=True
          +)
          +
          +# Execute. A new query will be sent to the server every 0.5 second
          +# until we receive a response, for a max number attempts of 10.
          +session.execute(query)
          +
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/index.html b/3.24.8-scylla/index.html new file mode 100644 index 0000000000..3900ad7f6b --- /dev/null +++ b/3.24.8-scylla/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Python Driver for Scylla and Apache Cassandra®

          +

          A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

          +

          The driver supports Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8.

          +

          This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

          +

          Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

          +
          +

          Contents

          +
          +
          Installation

          How to install the driver.

          +
          +
          Getting Started

          A guide through the first steps of connecting to Scylla and executing queries

          +
          +
          Scylla Specific Features

          A list of feature available only on scylla-driver

          +
          +
          Execution Profiles

          An introduction to a more flexible way of configuring request execution

          +
          +
          Lightweight Transactions (Compare-and-set)

          Working with results of conditional requests

          +
          +
          Object Mapper

          Introduction to the integrated object mapper, cqlengine

          +
          +
          Performance Notes

          Tips for getting good performance.

          +
          +
          Paging Large Queries

          Notes on paging large query results

          +
          +
          Security

          An overview of the security features of the driver

          +
          +
          Upgrading

          A guide to upgrading versions of the driver

          +
          +
          User Defined Types

          Working with Scylla’s user-defined types (UDT)

          +
          +
          Working with Dates and Times

          Some discussion on the driver’s approach to working with timestamp, date, time types

          +
          +
          Scylla Cloud

          Connect to Scylla Cloud

          +
          +
          CHANGELOG

          Log of changes to the driver, organized by version.

          +
          +
          Frequently Asked Questions

          A collection of Frequently Asked Questions

          +
          +
          API Documentation

          The API documentation.

          +
          +
          +
          +
          +
          +
          +

          Getting Help

          +

          Visit the FAQ section in this documentation.

          +

          Please send questions to the Scylla user list.

          +
          +
          +

          Reporting Issues

          +

          Please report any bugs and make any feature requests on the Github project issues

          +
          + +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/installation.html b/3.24.8-scylla/installation.html new file mode 100644 index 0000000000..292f2c7cee --- /dev/null +++ b/3.24.8-scylla/installation.html @@ -0,0 +1,859 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Installation

          +
          +

          Supported Platforms

          +

          Python 2.7, 3.4, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

          +

          Linux, OSX, and Windows are supported.

          +
          +
          +

          Installation through pip

          +

          pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

          +
          pip install scylla-driver
          +
          +
          +

          You can use pip install --pre scylla-driver if you need to install a beta version.

          +

          *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

          +
          +
          +

          Verifying your Installation

          +

          To check if the installation was successful, you can run:

          +
          python -c 'import cassandra; print cassandra.__version__'
          +
          +
          +

          It should print something like “3.22.0”.

          +
          +
          +

          (Optional) Graph

          +

          The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

          +
          pip install scylla-driver[graph]
          +
          +
          +
          +
          +

          (Optional) Compression Support

          +

          Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

          +

          For lz4 support:

          +
          pip install lz4
          +
          +
          +

          For snappy support:

          +
          pip install python-snappy
          +
          +
          +

          (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

          +
          +
          +

          (Optional) Metrics Support

          +

          The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

          +
          pip install scales
          +
          +
          +
          +

          Speeding Up Installation

          +

          By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

          +

          In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

          +
          $ # installing from source
          +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
          +$ # installing from pip
          +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
          +
          +
          +
          +
          +

          OSX Installation Error

          +

          If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

          +
          clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
          +
          +
          +

          To fix this, re-run the installation with an extra compilation flag:

          +
          ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
          +
          +
          +
          +
          +
          +

          Windows Installation Notes

          +

          Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

          +

          Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

          +

          It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

          +
          +
          +

          Manual Installation

          +

          You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

          +

          Once the dependencies are installed, simply run:

          +
          python setup.py install
          +
          +
          +
          +
          +

          (Optional) Non-python Dependencies

          +

          The driver has several optional features that have non-Python dependencies.

          +
          +

          C Extensions

          +

          By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

          +

          When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

          +

          To compile the extensions, ensure that GCC and the Python headers are available.

          +

          On Ubuntu and Debian, this can be accomplished by running:

          +
          $ sudo apt-get install gcc python-dev
          +
          +
          +

          On RedHat and RedHat-based systems like CentOS and Fedora:

          +
          $ sudo yum install gcc python-devel
          +
          +
          +

          On OS X, homebrew installations of Python should provide the necessary headers.

          +

          See Windows Installation Notes for notes on configuring the build environment on Windows.

          +
          +

          Cython-based Extensions

          +

          By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

          +

          This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

          +
          python setup.py install --no-cython
          +
          +
          +

          Alternatively, an environment variable can be used to switch this option regardless of +context:

          +
          CASS_DRIVER_NO_CYTHON=1 <your script here>
          +- or, to disable all extensions:
          +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
          +
          +
          +

          This method is required when using pip, which provides no other way of injecting user options in a single command:

          +
          CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
          +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
          +
          +
          +

          The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

          +

          If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

          +
          sudo pip install six futures
          +sudo pip install --install-option="--no-cython"
          +
          +
          +
          +
          +
          +

          libev support

          +

          The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

          +

          If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

          +
          $ sudo apt-get install libev4 libev-dev
          +
          +
          +

          On RHEL/CentOS/Fedora:

          +
          $ sudo yum install libev libev-devel
          +
          +
          +

          If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

          +
          $ brew install libev
          +
          +
          +

          The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

          +

          If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

          +
          >>> from cassandra.io.libevreactor import LibevConnection
          +>>> from cassandra.cluster import Cluster
          +
          +>>> cluster = Cluster()
          +>>> cluster.connection_class = LibevConnection
          +>>> session = cluster.connect()
          +
          +
          +
          +
          +
          +

          (Optional) Configuring SSL

          +

          Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/lwt.html b/3.24.8-scylla/lwt.html new file mode 100644 index 0000000000..e31fa195dd --- /dev/null +++ b/3.24.8-scylla/lwt.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Lightweight Transactions (Compare-and-set)

          +

          Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

          +

          For pertinent execution parameters, see Statement.serial_consistency_level.

          +

          This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

          +
          +

          Specialized Results

          +

          The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

          +

          The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

          +
            +
          • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

          • +
          • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

          • +
          • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

          • +
          +

          How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

          +
          CREATE TABLE test.t (
          +    k int PRIMARY KEY,
          +    v int,
          +    x int
          +)
          +
          +
          +

          … the following sections show the expected result for a number of example statements, using the three base row factories.

          +
          +

          named_tuple_factory (default)

          +

          The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

          +
          >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
          +Row(applied=True)
          +
          +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
          +Row(applied=False, k=0, v=0, x=None)
          +
          +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
          +Row(applied=True)
          +
          +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
          +Row(applied=False, v=1, x=2)
          +
          +
          +
          +
          +

          tuple_factory

          +

          This return type does not refer to names, but the boolean value applied is always present in position 0:

          +
          >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
          +(True,)
          +
          +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
          +(False, 0, 0, None)
          +
          +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
          +(True,)
          +
          +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
          +(False, 1, 2)
          +
          +
          +
          +
          +

          dict_factory

          +

          The retuned dict contains the [applied] key:

          +
          >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
          +{u'[applied]': True}
          +
          +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
          +{u'x': 2, u'[applied]': False, u'v': 1}
          +
          +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
          +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
          +
          +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
          +{u'[applied]': True}
          +
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/object_mapper.html b/3.24.8-scylla/object_mapper.html new file mode 100644 index 0000000000..1d5e871c21 --- /dev/null +++ b/3.24.8-scylla/object_mapper.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Object Mapper

          +

          cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

          +

          Jump to Getting Started

          +
          +

          Contents

          +
          +
          Upgrade Guide

          For migrating projects from legacy cqlengine, to the integrated product

          +
          +
          Models

          Examples defining models, and mapping them to tables

          +
          +
          Making Queries

          Overview of query sets and filtering

          +
          +
          Batch Queries

          Working with batch mutations

          +
          +
          Connections

          Working with multiple sessions

          +
          +
          API Documentation

          Index of API documentation

          +
          +
          Third party integrations

          High-level examples in Celery and uWSGI

          +
          +
          +

          Frequently Asked Questions

          +
          +
          +
          +
          +

          Getting Started

          +
          import uuid
          +from cassandra.cqlengine import columns
          +from cassandra.cqlengine import connection
          +from datetime import datetime
          +from cassandra.cqlengine.management import sync_table
          +from cassandra.cqlengine.models import Model
          +
          +#first, define a model
          +class ExampleModel(Model):
          +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
          +    example_type    = columns.Integer(index=True)
          +    created_at      = columns.DateTime()
          +    description     = columns.Text(required=False)
          +
          +#next, setup the connection to your cassandra server(s)...
          +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
          +# the list of hosts will be passed to create a Cluster() instance
          +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
          +
          +#...and create your CQL table
          +>>> sync_table(ExampleModel)
          +
          +#now we can create some rows:
          +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
          +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
          +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
          +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
          +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
          +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
          +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
          +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
          +
          +#and now we can run some queries against our table
          +>>> ExampleModel.objects.count()
          +8
          +>>> q = ExampleModel.objects(example_type=1)
          +>>> q.count()
          +4
          +>>> for instance in q:
          +>>>     print instance.description
          +example5
          +example6
          +example7
          +example8
          +
          +#here we are applying additional filtering to an existing query
          +#query objects are immutable, so calling filter returns a new
          +#query object
          +>>> q2 = q.filter(example_id=em5.example_id)
          +
          +>>> q2.count()
          +1
          +>>> for instance in q2:
          +>>>     print instance.description
          +example5
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/objects.inv b/3.24.8-scylla/objects.inv new file mode 100644 index 0000000000..5646e0838f Binary files /dev/null and b/3.24.8-scylla/objects.inv differ diff --git a/3.24.8-scylla/performance.html b/3.24.8-scylla/performance.html new file mode 100644 index 0000000000..359afb1f3e --- /dev/null +++ b/3.24.8-scylla/performance.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Performance Notes

          +

          The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

          +

          Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

          +

          The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

          +

          Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

          +
          +

          PyPy

          +

          PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

          +
          +
          +

          Cython Extensions

          +

          Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

          +

          See Installation for details on controlling this build.

          +
          +
          +

          multiprocessing

          +

          All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

          +

          Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

          +

          For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/py-modindex.html b/3.24.8-scylla/py-modindex.html new file mode 100644 index 0000000000..893bf48f1e --- /dev/null +++ b/3.24.8-scylla/py-modindex.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + + + +
          + + + + + +
          + + +
          +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/query_paging.html b/3.24.8-scylla/query_paging.html new file mode 100644 index 0000000000..b80cedc7ad --- /dev/null +++ b/3.24.8-scylla/query_paging.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Paging Large Queries

          +

          Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

          +
          +

          Controlling the Page Size

          +

          By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

          +
          +
          +

          Handling Paged Results

          +

          Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

          +
          from cassandra.query import SimpleStatement
          +query = "SELECT * FROM users"  # users contains 100 rows
          +statement = SimpleStatement(query, fetch_size=10)
          +for user_row in session.execute(statement):
          +    process_user(user_row)
          +
          +
          +

          Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

          +

          If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

          +
          +
          +

          Handling Paged Results with Callbacks

          +

          If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

          +

          Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

          +
          class PagedResultHandler(object):
          +
          +    def __init__(self, future):
          +        self.error = None
          +        self.finished_event = Event()
          +        self.future = future
          +        self.future.add_callbacks(
          +            callback=self.handle_page,
          +            errback=self.handle_err)
          +
          +    def handle_page(self, rows):
          +        for row in rows:
          +            process_row(row)
          +
          +        if self.future.has_more_pages:
          +            self.future.start_fetching_next_page()
          +        else:
          +            self.finished_event.set()
          +
          +    def handle_error(self, exc):
          +        self.error = exc
          +        self.finished_event.set()
          +
          +future = session.execute_async("SELECT * FROM users")
          +handler = PagedResultHandler(future)
          +handler.finished_event.wait()
          +if handler.error:
          +    raise handler.error
          +
          +
          +
          +
          +

          Resume Paged Results

          +

          You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

          +
          from cassandra.query import SimpleStatement
          +query = "SELECT * FROM users"
          +statement = SimpleStatement(query, fetch_size=10)
          +results = session.execute(statement)
          +
          +# save the paging_state somewhere and return current results
          +web_session['paging_state'] = results.paging_state
          +
          +
          +# resume the pagination sometime later...
          +statement = SimpleStatement(query, fetch_size=10)
          +ps = web_session['paging_state']
          +results = session.execute(statement, paging_state=ps)
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/scylla_cloud.html b/3.24.8-scylla/scylla_cloud.html new file mode 100644 index 0000000000..79451d5482 --- /dev/null +++ b/3.24.8-scylla/scylla_cloud.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + Scylla Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Scylla Cloud

          +

          To connect to a Scylla Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/scylla_specific.html b/3.24.8-scylla/scylla_specific.html new file mode 100644 index 0000000000..1f8aa66b72 --- /dev/null +++ b/3.24.8-scylla/scylla_specific.html @@ -0,0 +1,711 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Scylla Specific Features

          +
          +

          Shard Awareness

          +

          scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

          +

          Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/design-notes/protocol-extensions.md

          +

          For using it you only need to enable TokenAwarePolicy on the Cluster

          +
          from cassandra.cluster import Cluster
          +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
          +
          +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
          +
          +
          +
          +
          +

          New Cluster Helpers

          +
            +
          • cluster.is_shard_aware()

            +

            New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

            +
          • +
          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster()
          +session = cluster.connect()
          +
          +if cluster.is_shard_aware():
          +    print("connected to a scylla cluster")
          +
          +
          +
            +
          • cluster.shard_aware_stats()

            +

            New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

            +
          • +
          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster()
          +session = cluster.connect()
          +
          +stats = cluster.shard_aware_stats()
          +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
          +    print("successfully connected to all shards of all scylla nodes")
          +
          +
          +
          +
          +

          New Table Attributes

          +
            +
          • in_memory flag

            +

            New flag available on TableMetadata.options to indicate that it is an In Memory table

            +
          • +
          +
          +

          Note

          +

          in memory tables is a feature existing only in Scylla Enterprise

          +
          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster()
          +session = cluster.connect()
          +session.execute("""
          +    CREATE KEYSPACE IF NOT EXISTS keyspace1
          +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
          +""")
          +
          +session.execute("""
          +    CREATE TABLE IF NOT EXISTS keyspace1.standard1 (
          +        key blob PRIMARY KEY,
          +        "C0" blob
          +    ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'}
          +""")
          +
          +cluster.refresh_table_metadata("keyspace1", "standard1")
          +assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True
          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/search.html b/3.24.8-scylla/search.html new file mode 100644 index 0000000000..25f9d25488 --- /dev/null +++ b/3.24.8-scylla/search.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + + + + + +
          + + + + + +
          + + +
          +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/searchindex.js b/3.24.8-scylla/searchindex.js new file mode 100644 index 0000000000..4532d246d0 --- /dev/null +++ b/3.24.8-scylla/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third_party", "cqlengine/upgrade_guide", "dates_and_times", "execution_profiles", "faq", "getting_started", "index", "installation", "lwt", "object_mapper", "performance", "query_paging", "scylla_cloud", "scylla_specific", "security", "upgrading", "user_defined_types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third_party.rst", "cqlengine/upgrade_guide.rst", "dates_and_times.rst", "execution_profiles.rst", "faq.rst", "getting_started.rst", "index.rst", "installation.rst", "lwt.rst", "object_mapper.rst", "performance.rst", "query_paging.rst", "scylla_cloud.rst", "scylla_specific.rst", "security.rst", "upgrading.rst", "user_defined_types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "Scylla Cloud", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"june": 0, "2020": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 53, 54], "geomet": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 52, 53, 54, 55], "depend": [0, 2, 41, 43, 47, 49], "runtim": [0, 46, 49], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 53, 54, 55], "1237": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 54, 55], "use_default_tempdir": 0, "cloud": [0, 3, 27, 45], "config": [0, 53], "1245": 0, "tcp": 0, "flow": 0, "control": [0, 3, 4, 27, 30, 40, 49, 53], "libevreactor": [0, 3, 33, 46], "1248": 0, "unabl": [0, 27, 46], "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 44, 46, 48, 49, 51, 53, 55], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53], "ubuntu": [0, 46], "04": 0, "1238": 0, "plaintextauthprovid": [0, 2, 3, 33, 53, 54], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "unicod": [0, 17, 44], "char": 0, "python3": 0, "1241": 0, "graph": [0, 3], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 52, 55], "profil": [0, 3, 4, 12, 14, 44, 45], "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 53], "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 53], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 53, 54], "local_quorum": [0, 1, 44], "1240": 0, "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "t": [0, 9, 10, 15, 31, 37, 38, 41, 43, 44, 47, 49, 53, 54, 55], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 52, 54, 55], "boolean": [0, 1, 6, 25, 27, 44, 47], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 55], "fluent": [0, 33, 46, 54], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 53], "1239": 0, "elementmap": 0, "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 52, 55], "deseri": [0, 15, 18, 33, 41], "1233": 0, "bump": 0, "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 54, 55], "1243": 0, "gremlinpython": [0, 46], "1212": 0, "improv": [0, 1, 35, 49, 54], "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 53, 54], "core": [0, 3, 4, 38, 40, 46, 49], "1244": 0, "april": 0, "transient": 0, "replic": [0, 3, 8, 25, 40, 52], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 52, 53, 54, 55], "1207": 0, "system": [0, 5, 25, 38, 42, 43, 44, 46, 54], "peers_v2": 0, "port": [0, 3, 5, 25, 44], "discoveri": 0, "c": [0, 6, 12, 25, 27, 38, 53], "700": 0, "asyncor": [0, 33, 46], "log": [0, 3, 8, 27, 30, 31, 44, 45, 54], "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53], "shutdown": [0, 3, 39], "1228": 0, "februari": 0, "26": [0, 38], "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 52, 53, 54], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 53, 54], "resultset": [0, 3, 33, 50, 54], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 53, 54, 55], "schema": [0, 3, 9, 30, 33, 37, 44, 54], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 53, 54], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 54, 55], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 52, 54, 55], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "788": 0, "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 53], "nativ": [0, 1, 15, 18, 29, 37, 45], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 54, 55], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 52], "1027": 0, "enabl": [0, 3, 10, 44, 52, 53, 54], "page": [0, 1, 3, 45, 51], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 54, 55], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 55], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 53, 54], "numer": [0, 41], "wrapper": [0, 27, 30], "ensur": [0, 3, 4, 9, 27, 39, 46, 53], "proper": [0, 39, 46], "definit": [0, 3, 6, 15, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 53], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "1057": 0, "bulkset": 0, "1060": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 55], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 53, 54], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 52, 53, 54, 55], "classic": 0, "1090": 0, "1039": 0, "expos": [0, 31, 54], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 15, 25, 26, 30, 32, 38, 45, 54], "1019": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "more": [0, 3, 4, 6, 9, 10, 15, 25, 27, 29, 31, 38, 40, 42, 44, 45, 49, 50, 53, 54], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 53], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 52, 53, 54], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 54, 55], "1205": 0, "januari": 0, "unifi": [0, 54], "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 54], "packag": [0, 2, 32, 41, 46, 48, 53, 54], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 52, 53, 54, 55], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 53], "twist": [0, 33, 44], "1161": 0, "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "1048": 0, "flexibl": [0, 45], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 54], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 55], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 53, 55], "mismatch": 0, "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 53, 54, 55], "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "re": [0, 27, 30, 37, 38, 39, 44, 46, 53, 55], "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 54], "cqlengineexcept": [0, 40], "1166": 0, "asyncio": [0, 33], "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "process": [0, 3, 4, 20, 43, 44, 46, 49, 53, 54], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 54], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 52, 53], "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "peer": [0, 5, 25], "1181": 0, "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 53], "certif": [0, 53], "hostnam": [0, 27, 53], "sslcontext": [0, 53], "check_hostnam": [0, 53], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 55], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 54], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 53], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 53, 54, 55], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 53, 54, 55], "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 53], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "warn": [0, 1, 3, 31, 40, 54], "about": [0, 3, 25, 30, 37, 41, 44, 46, 53, 54], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 53, 54], "balanc": [0, 3, 33, 42, 54], "polici": [0, 3, 33, 42, 43, 44, 52, 54], "1177": 0, "keyword": [0, 3, 6, 7, 9, 10], "1122": 0, "publish": [0, 46, 53], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 54], "next": [0, 3, 21, 27, 42, 48, 50, 53], "major": [0, 27, 42, 53, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 53, 54], "defaultloadbalancingpolici": [0, 27, 54], "integr": [0, 29, 40, 41, 45, 46, 48, 54], "1047": 0, "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 53, 54], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 52, 53, 54, 55], "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 54], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 53], "unknown": [0, 15, 18, 46, 54], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 53, 55], "819": 0, "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 52], "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 53, 55], "773": 0, "authprovid": [0, 2, 3, 33, 53], "transit": 0, "mode": 0, "831": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 53, 54], "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 53], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 54], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 54], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 53], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 53], "574": 0, "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 52, 54], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 54], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 53], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 52], "avail": [0, 3, 10, 30, 38, 45, 46, 52, 54], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53, 55], "runtimeerror": 0, "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 54], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 53, 55], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 52, 53], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 53, 54], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 53, 54], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53], "caus": [0, 3, 10, 26, 37, 47], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 54], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 53, 54], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 54], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 54, 55], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 52, 53, 54], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "unexpectedli": 0, "709": 0, "socket": [0, 5, 53], "associ": [0, 3, 54], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46], "clean": [0, 39, 46, 54], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 53, 54], "673": 0, "fqdn": [0, 53], "ip": [0, 3, 5, 27, 28, 44, 53], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 53, 54, 55], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 55], "empti": [0, 2, 3, 25, 47], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "around": [0, 9, 32, 40, 41, 54], "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 54], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 53, 54], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 55], "789": 0, "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 54, 55], "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 53, 54, 55], "v5": [0, 1], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 53], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 53, 54], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 53, 54, 55], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 53], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 54], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 46, 48, 53, 54], "astra": 0, "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 53], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 52], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44], "1009": 0, "deadlock": [0, 4], "drop": [0, 6, 8, 29], "heartbeat": 0, "whilst": 0, "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 53, 54], "flight": [0, 5], "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 54], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 53], "1044": 0, "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 52, 53, 54], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 54], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 54], "1023": 0, "param": [0, 4, 13], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 15, 27, 33, 43, 46, 52], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 55], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 53, 54], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 55], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 54], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 54, 55], "1093": 0, "incorrect": [0, 44], "compact": [0, 9, 52], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 53], "1117": 0, "built": [0, 32, 42, 46, 49, 54], "sourc": [0, 3, 15, 18, 45, 46], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 52, 54], "doesn": [0, 31, 54], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45], "1127": 0, "invalid": [0, 1, 26, 30], "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 53, 55], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 53], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41], "1079": 0, "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 53], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 53, 54], "1082": 0, "let": [0, 3, 54], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 53, 54], "sortedset": [0, 32, 33, 54], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 54], "1068": 0, "ssl_context": [0, 3, 44, 53], "995": 0, "encrypt": [0, 53], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 15, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 52, 53, 55], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 54, 55], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 54, 55], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 53], "releas": [0, 9, 27, 40, 42, 53, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 53, 54, 55], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 54], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 53], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 53, 54], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 52, 54], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 53, 55], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 53, 54], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 54], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 54], "1015": 0, "septemb": 0, "logic": [0, 37], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 44, 52, 54], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 53], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 53, 54], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 53, 54], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 53], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 53], "loop": [0, 3, 4, 21, 33, 44, 46, 53], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 53, 54], "subclass": [0, 1, 2, 3, 27, 30, 37, 53], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 54], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 53, 54], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 53, 54, 55], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 54], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 52], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 54], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 52, 53], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 53, 54], "cassandra_vers": 0, "910": 0, "refactor": [0, 41], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 53, 54, 55], "kind": [0, 27, 54], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 54, 55], "915": 0, "authent": [0, 1, 3, 33], "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 55], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 53, 55], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 55], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 54, 55], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 55], "865": 0, "deprecationwarn": [0, 54], "846": 0, "example_mapp": 0, "py": [0, 46], "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 53, 54], "execute_concurr": [0, 4, 33, 49], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 53], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 53], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 54], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 54], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 54, 55], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 54], "810": 0, "833": 0, "juli": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 53, 54], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46, 52], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 54], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 53], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 53], "772": 0, "pool": [0, 1, 3, 33, 54], "739": 0, "murmur3": [0, 3, 46], "big": 0, "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 54], "785": 0, "25": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 53], "464": 0, "inupt": 0, "microsecond": [0, 31, 54], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "pr": 0, "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 52, 55], "705": 0, "get_query_trac": [0, 3, 43, 54], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 54], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44], "drain": 0, "734": 0, "resulset": 0, "trace": [0, 3, 33], "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 52, 54], "grow": 0, "720": 0, "size": [0, 3, 10, 54], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 52, 53, 54, 55], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 53], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "race": 0, "callback": [0, 3, 10, 44, 49, 53], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 54], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 52, 53], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "march": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 54], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 52], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 54], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 54], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 54], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 54], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 54], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 53, 54, 55], "lead": [0, 34, 49, 54], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 54, 55], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 53, 54], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 53, 54], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47, 52], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 53], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 54], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 54], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 55], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 54], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 54], "stat": [0, 26, 52], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 54], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 53, 54], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 53, 54], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 54], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "alias": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 54], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "condit": [0, 1, 3, 8, 10, 30, 45], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 52], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "569": 0, "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 53], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 54, 55], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 52, 53, 55], "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "compat": [0, 3, 18, 25, 33, 54], "434": 0, "unicodedecodeerror": 0, "bop": 0, "559": 0, "565": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 53, 54, 55], "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 52], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 54], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 53, 54], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 53, 54], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 53, 54], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 54], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 54, 55], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 53], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 54], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 53], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 52, 54], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 54], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 54], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 53], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 52], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53], "489": 0, "typo": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": 0, "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 54, 55], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 54], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55], "might": [0, 3, 30, 50, 53], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 53, 55], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 52, 53, 54], "access": [0, 3, 9, 26, 30, 37, 44, 54], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 54], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 53, 54], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 53, 54, 55], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 53, 54], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28], "dc": [0, 3, 27, 54], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 54], "408": [0, 54], "400": [0, 54], "422": [0, 54], "292": [0, 54], "318": [0, 54], "368": [0, 54], "371": 0, "blist": 0, "soft": 0, "385": [0, 54], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44], "178": [0, 30, 54], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "well": [0, 27, 35, 44, 53], "pagedresult": [0, 50, 54], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "397": 0, "398": 0, "extens": [0, 3, 27, 41, 52], "file": [0, 40, 49, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 55], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 54], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 54], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 54], "round": [0, 27, 32], "341": 0, "sizeti": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55], "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 54], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 53], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 54], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 53], "patch": [0, 21, 22, 41, 53], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 53], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 54], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 54], "243": 0, "kerbero": [0, 53], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 54], "192": [0, 3, 44], "stream": [0, 29], "set_keyspac": [0, 3, 27, 44, 55], "195": 0, "implicit": [0, 10, 54], "204": 0, "collis": 0, "sasl": [0, 2, 53], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 54], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 54], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 54], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27], "contact_point": [0, 3, 7, 27, 53], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 54], "88": 0, "constructor": [0, 3, 6, 38], "basi": [0, 54], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 52], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 53, 54], "use_client_timestamp": [0, 1, 3, 54], "overrid": [0, 3, 9, 15, 18, 42, 44, 54], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 55], "refer": [0, 10, 34, 40, 42, 47, 54], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 54], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 54], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 53, 54, 55], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 54], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 53, 54, 55], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 53], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 53, 54, 55], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 53, 54], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 52], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 54], "help": [0, 38, 54], "done": [0, 3, 37, 41, 43, 53, 54], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 53, 54], "guarante": [0, 27, 30, 54], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 54, 55], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 53], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 52, 53, 54, 55], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 53, 54, 55], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 54], "left": [0, 3, 4, 9, 41, 54], "place": [0, 40, 44, 54], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 54], "dict_factori": [0, 3, 7, 16, 30, 33, 54], "ordered_dict_factori": [0, 3, 16, 30, 33, 54], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 53, 54, 55], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 54], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 54], "executor": 0, "becom": [0, 3, 8, 49, 54], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 53, 54], "lowercas": 0, "liter": [0, 15, 17, 18, 30, 41, 44, 54, 55], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 54], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 54, 55], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 53, 54], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 53, 54], "never": [0, 27, 34, 47, 49, 54], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 52, 54], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": [0, 54], "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 53, 54], "main": [0, 3, 53, 55], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 49, 52, 53, 54], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 53, 54], "strong": 0, "garbag": [0, 54], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 54], "twice": 0, "had": [0, 40, 54], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 55], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 52], "parallel": 0, "sesssion": 0, "effort": [0, 40, 53], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 53], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 54], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 53], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 52], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 53], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 53], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 54, 55], "constant": [0, 53], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 54], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 53, 54], "ONE": [1, 3, 10, 40, 54], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 55], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 55], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 52, 53, 55], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 52, 55], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 45, 46, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 54, 55], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 55], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 53], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 54], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 52], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 54], "higher": [1, 3, 4, 30, 53, 54], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 54], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 53], "author": [1, 53], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 54], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "mechan": [2, 3, 27, 53], "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 53], "usernam": [2, 44, 53], "password": [2, 53], "passwordauthent": [2, 53], "auth_provid": [2, 3, 53], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 53], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 53, 54, 55], "servic": [2, 53], "someth": [2, 27, 37, 38, 46, 53], "qop": [2, 53], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 53], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 53], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "mutabl": 3, "load_balancing_polici": [3, 27, 42, 44, 52], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 53, 54], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 53], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 53, 55], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 53, 54], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50], "purpos": [3, 6], "register_user_typ": [3, 54, 55], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 53, 54], "whose": 3, "mykeyspac": [3, 30, 44, 54, 55], "street": [3, 11, 37, 54, 55], "zipcod": [3, 11, 37, 54, 55], "locat": [3, 40, 53, 55], "def": [3, 27, 34, 37, 39, 43, 44, 50, 53, 54, 55], "self": [3, 15, 18, 37, 50, 54, 55], "INTO": [3, 4, 30, 44, 47, 55], "st": [3, 37, 55], "78723": [3, 55], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 55], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 54], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 54], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 53], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": [3, 52], "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 53], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 54], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 54], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 55], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "24": 3, "appropri": [3, 37, 46, 53], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 54], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 53], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 53], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 53, 54], "placehold": [3, 15, 18, 30, 44, 55], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 53], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 54], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 55], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 53], "expir": 3, "exceed": [3, 4], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 54], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 53], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 53, 54], "backward": [3, 18, 25, 54], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 53], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 54, 55], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 54], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 53], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 53], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 52], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 53], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 53], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 52], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 52], "www": 6, "com": [6, 10, 52, 53], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 52], "durable_writ": 8, "simplestrategi": [8, 25, 52], "caution": [8, 37], "product": [8, 48, 53, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 53, 54], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 52, 55], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 54], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 53], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 54], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 54], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 54], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 53], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 53], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 53], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 54], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 54], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "val": 15, "concis": 15, "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 54], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 53], "handle_fork": 20, "eventletconnect": [21, 33, 53], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 54], "twistedconnect": [24, 33, 53], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 54], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "replicationfactor": 25, "all_replica": 25, "transient_replica": 25, "options_map": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 53], "pmfstat": 26, "latenc": [26, 44, 52], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 53], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 52], "evenli": 27, "what": [27, 30, 37, 41, 53, 54, 55], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 53], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 53], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 54], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 53, 54], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 53, 54], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 53], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 53], "silent": 27, "idea": 27, "best": [27, 44, 51, 53], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 53], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 53], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 54], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 53], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "23": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "asyncioreactor": 33, "eventletreactor": 33, "twistedreactor": [33, 53], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 53], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 52], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41, 54], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 53], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 53, 54], "presist": 37, "pattern": [37, 49], "joe": [37, 53], "99999": 37, "ll": [38, 53], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 53], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 54], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 52], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 54], "scylla": [38, 40, 46, 54], "21": [38, 54], "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "17": [38, 53], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45, 54], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 54], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 54], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 54], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": 42, "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 54, 55], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 53], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 55], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49, 52], "handle_success": 44, "rememb": 44, "user1": [44, 53], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "secur": [45, 54], "upgrad": [45, 48, 53], "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 54], "reinstal": 46, "22": 46, "abl": 46, "snappi": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 53], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": 46, "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 53], "mussei": [46, 53], "thorough": [46, 53], "outcom": 47, "pertin": 47, "appear": 47, "reject": 47, "statu": [47, 52], "squar": 47, "bracket": 47, "AND": [47, 52], "retun": 47, "jump": 48, "migrat": [48, 54], "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 53], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "p": 50, "onward": 52, "scylladb": 52, "md": 52, "is_shard_awar": 52, "shard_aware_stat": 52, "shards_count": 52, "in_memori": 52, "enterpris": 52, "keyspace1": 52, "standard1": 52, "c0": 52, "inmemorycompactionstrategi": 52, "get_credenti": 53, "host_address": 53, "1234": 53, "wrap_socket": 53, "create_default_context": 53, "server_hostnam": 53, "keystor": 53, "intruct": 53, "cert": 53, "understand": 53, "demonstr": 53, "deploy": 53, "client_encryption_opt": 53, "keystore_password": 53, "mystorepass": 53, "require_client_auth": 53, "protocol_tlsv1": 53, "veri": 53, "verify_mod": 53, "cert_requir": 53, "load_verify_loc": 53, "rootca": 53, "crt": 53, "truststor": 53, "jk": 53, "truststore_password": 53, "pem": 53, "conf": 53, "gen_client_cert": 53, "eof": 53, "req": 53, "distinguished_nam": 53, "req_distinguished_nam": 53, "output_password": 53, "root_cert_pass": 53, "default_bit": 53, "2048": 53, "cert_countri": 53, "cert_org_nam": 53, "ou": 53, "cert_ou": 53, "cn": 53, "root": 53, "Then": 53, "openssl": 53, "newkei": 53, "rsa": 53, "keyout": 53, "csr": 53, "x509": 53, "root_ca_base_nam": 53, "cakei": 53, "passin": 53, "crt_sign": 53, "cert_valid": 53, "cacreateseri": 53, "load_cert_chain": 53, "certfil": 53, "keyfil": 53, "crypto": 53, "tlsv1_method": 53, "set_verifi": 53, "verify_p": 53, "lambda": 53, "_1": 53, "_2": 53, "_3": 53, "_4": 53, "use_certificate_fil": 53, "use_privatekey_fil": 53, "ca_cert": 53, "ssl_version": 53, "ssl_opt": 53, "my": 53, "cert_req": 53, "risen": 53, "advanc": 53, "dseplaintextauthprovid": 53, "act": 53, "permiss": 53, "grant": 53, "role": 53, "plain": 53, "authorization_id": 53, "ticket": 53, "kinit": 53, "offici": [53, 54], "fulli": 54, "benefit": 54, "dse_graph": 54, "swap": 54, "rework": 54, "mesh": 54, "afterward": 54, "got": 54, "row_list": 54, "first_result": 54, "variant": 54, "brought": 54, "overhaul": 54, "highlight": 54, "nomenclatur": 54, "keyspace_nam": 54, "031ebb0": 54, "refresh_": 54, "_metadata": 54, "419fcdf": 54, "submit_schema_refresh": 54, "574266d": 54, "cqltype": 54, "bb984ee": 54, "e16a073": 54, "cc94073": 54, "from_datetim": 54, "96489cc": 54, "a2d3a98": 54, "4bd5909": 54, "__polymorphic_": 54, "__discrimin": 54, "9d98c8e": 54, "79efe97": 54, "citi": 54, "zip": [54, 55], "though": 54, "notabl": 54, "simpler": 54, "unclean": 54, "tell": 55, "insert_stat": 55, "otherstuff": 55, "first_row": 55, "fine": 55, "unprepar": 55, "parameter": 55, "interpol": 55}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph": [[15, 3, 1, "", "Edge"], [15, 3, 1, "", "GraphOptions"], [15, 3, 1, "", "GraphProtocol"], [15, 3, 1, "", "GraphSON1Deserializer"], [15, 3, 1, "", "GraphSON1Serializer"], [15, 3, 1, "", "GraphSON2Reader"], [15, 3, 1, "", "Path"], [15, 3, 1, "", "Result"], [15, 3, 1, "", "SimpleGraphStatement"], [15, 3, 1, "", "T"], [15, 3, 1, "", "Vertex"], [15, 3, 1, "", "VertexProperty"], [12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphProtocol": [[15, 2, 1, "", "GRAPHSON_1_0"], [15, 2, 1, "", "GRAPHSON_2_0"], [15, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph.GraphSON2Reader": [[15, 4, 1, "", "deserialize"], [15, 4, 1, "", "read"]], "cassandra.datastax.graph.Path": [[15, 2, 1, "", "labels"], [15, 2, 1, "", "objects"]], "cassandra.datastax.graph.Result": [[15, 4, 1, "", "as_edge"], [15, 4, 1, "", "as_path"], [15, 4, 1, "", "as_vertex"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.T": [[15, 2, 1, "", "id"], [15, 2, 1, "", "key"], [15, 2, 1, "", "label"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.VertexProperty": [[15, 2, 1, "", "label"], [15, 2, 1, "", "properties"], [15, 2, 1, "", "value"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 3, 1, "", "ReplicationFactor"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 53, 54], "24": 0, "0": [0, 53, 54], "featur": [0, 29, 52, 54], "bug": 0, "fix": 0, "other": 0, "23": 0, "22": 0, "21": 0, "deprec": [0, 40, 54], "20": 0, "2": [0, 54], "1": [0, 54], "19": 0, "18": 0, "17": 0, "16": [0, 53], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 54], "x": [0, 54], "upgrad": [0, 40, 54], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 54], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 53, 54], "cluster": [3, 42, 52, 54], "session": [3, 54], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 54], "execut": [4, 34, 42, 44, 53, 54], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 54], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 54, 55], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 55], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38, 52], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 54], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 55], "user": [11, 37, 54, 55], "defin": [11, 37, 54, 55], "datastax": [12, 13, 14, 15, 33], "graph": [12, 13, 14, 15, 18, 33, 46, 54], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 54], "format": 16, "encod": [17, 54], "non": [17, 46, 54], "prepar": [17, 30, 44, 54], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 53], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 53], "metadata": [25, 54], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 53], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 53, 54], "custom": [29, 53, 54], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 54], "trace": [30, 43, 54], "timestamp": [31, 41, 54], "gener": [31, 34], "api": [33, 40, 54], "document": 33, "core": 33, "driver": [33, 43, 45, 54], "mapper": [33, 48], "us": [34, 42, 54, 55], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 55], "new": [35, 52], "chang": [35, 40, 54], "default": [35, 38, 42, 47, 54], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 54], "work": [36, 41, 54], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 54], "delet": 36, "individu": 36, "exampl": [37, 53], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 54], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 54], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 54], "organ": 40, "import": [40, 54], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": 42, "legaci": 42, "paramet": [42, 44, 54], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 55], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 54], "specul": 44, "python": [45, 46], "scylla": [45, 51, 52], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 54], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 53], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": 46, "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 54], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 54], "configur": [46, 53], "ssl": [46, 53], "lightweight": [47, 54], "transact": [47, 54], "compar": 47, "special": 47, "result": [47, 50, 54], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 54], "larg": 50, "control": 50, "size": 50, "resum": 50, "cloud": 51, "specif": 52, "shard": 52, "awar": 52, "helper": 52, "attribut": 52, "secur": 53, "v1": 53, "No": 53, "ident": 53, "verif": 53, "client": [53, 54], "version": 53, "lower": 53, "dse": [53, 54], "unifi": 53, "proxi": 53, "login": 53, "modul": 54, "execute_async": 54, "now": 54, "local_on": 54, "normal": 54, "inform": 54, "attach": 54, "bind": 54, "ignor": 54, "extra": 54, "blist": 54, "soft": 54, "sever": 54, "v3": 54, "nativ": 54, "side": 54, "v2": 54, "automat": 54, "sasl": 54, "call": 54, "shutdown": 54, "udt": 55, "dict": 55, "them": 55}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Execution Profiles": [[42, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Frequently Asked Questions": [[43, "frequently-asked-questions"], [36, "frequently-asked-questions"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "Model Inheritance": [[40, "model-inheritance"], [37, "model-inheritance"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "User Defined Types": [[37, "user-defined-types"], [55, "user-defined-types"]], "Registering a UDT": [[55, "registering-a-udt"]], "Map a Class to a UDT": [[55, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[55, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[55, "using-udts-without-registering-them"]], "Scylla Specific Features": [[52, "scylla-specific-features"]], "Shard Awareness": [[52, "shard-awareness"]], "New Cluster Helpers": [[52, "new-cluster-helpers"]], "New Table Attributes": [[52, "new-table-attributes"]], "Security": [[53, "security"]], "Authentication": [[53, "authentication"]], "Custom Authenticators": [[53, "custom-authenticators"]], "Protocol v1 Authentication": [[53, "protocol-v1-authentication"]], "SSL": [[53, "ssl"]], "SSL with Twisted or Eventlet": [[53, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[53, "ssl-configuration-examples"]], "No identity verification": [[53, "no-identity-verification"]], "Client verifies server": [[53, "client-verifies-server"]], "Server verifies client": [[53, "server-verifies-client"]], "Server verifies client and client verifies server": [[53, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[53, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[53, "ssl-with-twisted"]], "DSE Authentication": [[53, "dse-authentication"]], "DSE Unified Authentication": [[53, "dse-unified-authentication"]], "Proxy Login": [[53, "proxy-login"]], "Proxy Execute": [[53, "proxy-execute"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Contents": [[45, "contents"], [48, "contents"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Scylla Cloud": [[51, "scylla-cloud"]], "Upgrading": [[54, "upgrading"]], "Upgrading from dse-driver": [[54, "upgrading-from-dse-driver"]], "Installation": [[54, "installation"], [46, "installation"]], "Import from the cassandra module": [[54, "import-from-the-cassandra-module"]], "dse-graph": [[54, "dse-graph"]], "Session.execute and Session.execute_async API": [[54, "session-execute-and-session-execute-async-api"]], "Deprecations": [[54, "deprecations"], [54, "id2"], [0, "deprecations"], [0, "id34"], [0, "id159"]], "Upgrading to 3.0": [[54, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[54, "default-consistency-is-now-local-one"]], "Execution API Updates": [[54, "execution-api-updates"]], "Result return normalization": [[54, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[54, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[54, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[54, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[54, "metadata-api-updates"]], "Several deprecated features are removed": [[54, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[54, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[54, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[54, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[54, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[54, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[54, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[54, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[54, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[54, "protocol-level-batch-statements"]], "SASL-based Authentication": [[54, "sasl-based-authentication"]], "Lightweight Transactions": [[54, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[54, "calling-cluster-shutdown"]], "Dependency Changes": [[54, "dependency-changes"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) Graph": [[46, "optional-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "CHANGELOG": [[0, "changelog"]], "3.24.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id6"], [0, "id9"], [0, "id12"], [0, "id19"], [0, "id22"], [0, "id26"], [0, "id31"], [0, "id41"], [0, "id45"], [0, "id48"], [0, "id52"], [0, "id56"], [0, "id60"], [0, "id64"], [0, "id70"], [0, "id76"], [0, "id79"], [0, "id82"], [0, "id87"], [0, "id90"], [0, "id95"], [0, "id100"], [0, "id104"], [0, "id106"], [0, "id113"], [0, "id117"], [0, "id119"], [0, "id124"], [0, "id127"], [0, "id130"], [0, "id133"], [0, "id136"], [0, "id144"], [0, "id151"], [0, "id153"], [0, "id157"], [0, "id161"], [0, "id167"], [0, "id177"], [0, "id179"], [0, "id184"], [0, "id187"], [0, "id189"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id7"], [0, "id10"], [0, "id13"], [0, "id15"], [0, "id17"], [0, "id20"], [0, "id23"], [0, "id27"], [0, "id29"], [0, "id32"], [0, "id36"], [0, "id39"], [0, "id42"], [0, "id49"], [0, "id53"], [0, "id57"], [0, "id61"], [0, "id65"], [0, "id68"], [0, "id71"], [0, "id74"], [0, "id77"], [0, "id80"], [0, "id83"], [0, "id85"], [0, "id88"], [0, "id91"], [0, "id96"], [0, "id98"], [0, "id101"], [0, "id105"], [0, "id107"], [0, "id109"], [0, "id111"], [0, "id114"], [0, "id116"], [0, "id118"], [0, "id120"], [0, "id122"], [0, "id125"], [0, "id128"], [0, "id131"], [0, "id134"], [0, "id137"], [0, "id140"], [0, "id142"], [0, "id145"], [0, "id147"], [0, "id149"], [0, "id152"], [0, "id154"], [0, "id158"], [0, "id162"], [0, "id165"], [0, "id168"], [0, "id171"], [0, "id174"], [0, "id176"], [0, "id180"], [0, "id182"], [0, "id185"], [0, "id188"], [0, "id190"], [0, "id192"]], "Others": [[0, "others"], [0, "id11"]], "3.23.0": [[0, "id2"]], "3.22.0": [[0, "id5"]], "3.21.0": [[0, "id8"]], "Other": [[0, "other"], [0, "id24"], [0, "id33"], [0, "id37"], [0, "id43"], [0, "id46"], [0, "id50"], [0, "id54"], [0, "id58"], [0, "id62"], [0, "id66"], [0, "id72"], [0, "id102"], [0, "id138"], [0, "id143"], [0, "id155"], [0, "id163"], [0, "id169"], [0, "id172"], [0, "id175"], [0, "id178"], [0, "id181"], [0, "id183"], [0, "id186"], [0, "id191"]], "3.20.2": [[0, "id14"]], "3.20.1": [[0, "id16"]], "3.20.0": [[0, "id18"]], "3.19.0": [[0, "id21"]], "3.18.0": [[0, "id25"]], "3.17.1": [[0, "id28"]], "3.17.0": [[0, "id30"]], "3.16.0": [[0, "id35"]], "3.15.1": [[0, "id38"]], "3.15.0": [[0, "id40"]], "3.14.0": [[0, "id44"]], "3.13.0": [[0, "id47"]], "3.12.0": [[0, "id51"]], "3.11.0": [[0, "id55"]], "3.10.0": [[0, "id59"]], "3.9.0": [[0, "id63"]], "3.8.1": [[0, "id67"]], "3.8.0": [[0, "id69"]], "3.7.1": [[0, "id73"]], "3.7.0": [[0, "id75"]], "3.6.0": [[0, "id78"]], "3.5.0": [[0, "id81"]], "3.4.1": [[0, "id84"]], "3.4.0": [[0, "id86"]], "3.3.0": [[0, "id89"]], "3.2.2": [[0, "id92"]], "3.2.1": [[0, "id93"]], "3.2.0": [[0, "id94"]], "3.1.1": [[0, "id97"]], "3.1.0": [[0, "id99"]], "3.0.0": [[0, "id103"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id108"]], "2.7.1": [[0, "id110"]], "2.7.0": [[0, "id112"]], "2.6.0": [[0, "id115"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id121"]], "2.5.0": [[0, "id123"]], "2.1.4": [[0, "id126"]], "2.1.3": [[0, "id129"]], "2.1.2": [[0, "id132"]], "2.1.1": [[0, "id135"]], "2.1.0": [[0, "id139"]], "2.1.0c1": [[0, "id141"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id146"]], "2.0.1": [[0, "id148"]], "2.0.0": [[0, "id150"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id156"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id160"]], "1.1.1": [[0, "id164"]], "1.1.0": [[0, "id166"]], "1.0.2": [[0, "id170"]], "1.0.1": [[0, "id173"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "edge (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Edge"]], "graphson_1_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.datastax.graph.graphprotocol attribute)": [[15, "cassandra.datastax.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphOptions"]], "graphprotocol (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.GraphSON2Reader"]], "path (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Path"]], "result (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Result"]], "simplegraphstatement (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.SimpleGraphStatement"]], "t (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.T"]], "vertex (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.Vertex"]], "vertexproperty (class in cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.VertexProperty"]], "as_edge() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_edge"]], "as_path() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_path"]], "as_vertex() (cassandra.datastax.graph.result method)": [[15, "cassandra.datastax.graph.Result.as_vertex"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize() (cassandra.datastax.graph.graphson2reader method)": [[15, "cassandra.datastax.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "id (cassandra.datastax.graph.t attribute)": [[15, "cassandra.datastax.graph.T.id"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "key (cassandra.datastax.graph.t attribute)": [[15, "cassandra.datastax.graph.T.key"]], "label (cassandra.datastax.graph.t attribute)": [[15, "cassandra.datastax.graph.T.label"]], "label (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.label"]], "labels (cassandra.datastax.graph.path attribute)": [[15, "cassandra.datastax.graph.Path.labels"]], "objects (cassandra.datastax.graph.path attribute)": [[15, "cassandra.datastax.graph.Path.objects"]], "properties (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.properties"]], "read() (cassandra.datastax.graph.graphson2reader method)": [[15, "cassandra.datastax.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "value (cassandra.datastax.graph.result attribute)": [[15, "cassandra.datastax.graph.Result.value"]], "value (cassandra.datastax.graph.t attribute)": [[15, "cassandra.datastax.graph.T.value"]], "value (cassandra.datastax.graph.vertexproperty attribute)": [[15, "cassandra.datastax.graph.VertexProperty.value"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationfactor (class in cassandra.metadata)": [[25, "cassandra.metadata.ReplicationFactor"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/3.24.8-scylla/security.html b/3.24.8-scylla/security.html new file mode 100644 index 0000000000..88bda6f2ad --- /dev/null +++ b/3.24.8-scylla/security.html @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Security

          +

          The two main security components you will use with the +Python driver are Authentication and SSL.

          +
          +

          Authentication

          +

          Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

          +

          For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

          +
          from cassandra.cluster import Cluster
          +from cassandra.auth import PlainTextAuthProvider
          +
          +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
          +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
          +
          +
          +
          +

          Custom Authenticators

          +

          If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

          +
          +
          +

          Protocol v1 Authentication

          +

          When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

          +
          from cassandra.cluster import Cluster
          +
          +def get_credentials(host_address):
          +    return {'username': 'joe', 'password': '1234'}
          +
          +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
          +
          +
          +
          +
          +
          +

          SSL

          +

          SSL should be used when client encryption is enabled in Cassandra.

          +

          To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

          +

          To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

          +

          If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

          +

          The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

          + +

          It might be also useful to learn about the different levels of identity verification to understand the examples:

          + +
          +

          SSL with Twisted or Eventlet

          +

          Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

          +
          +
          +

          SSL Configuration Examples

          +

          Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

          +
          +

          No identity verification

          +

          No identity verification at all. Note that this is not recommended for for production deployments.

          +

          The Cassandra configuration:

          +
          client_encryption_options:
          +  enabled: true
          +  keystore: /path/to/127.0.0.1.keystore
          +  keystore_password: myStorePass
          +  require_client_auth: false
          +
          +
          +

          The driver configuration:

          +
          from cassandra.cluster import Cluster, Session
          +from ssl import SSLContext, PROTOCOL_TLSv1
          +
          +ssl_context = SSLContext(PROTOCOL_TLSv1)
          +
          +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
          +session = cluster.connect()
          +
          +
          +
          +
          +

          Client verifies server

          +

          Ensure the python driver verifies the identity of the server.

          +

          The Cassandra configuration:

          +
          client_encryption_options:
          +  enabled: true
          +  keystore: /path/to/127.0.0.1.keystore
          +  keystore_password: myStorePass
          +  require_client_auth: false
          +
          +
          +

          For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

          +
          from cassandra.cluster import Cluster, Session
          +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
          +
          +ssl_context = SSLContext(PROTOCOL_TLSv1)
          +ssl_context.load_verify_locations('/path/to/rootca.crt')
          +ssl_context.verify_mode = CERT_REQUIRED
          +
          +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
          +session = cluster.connect()
          +
          +
          +

          Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

          +
          from cassandra.cluster import Cluster, Session
          +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
          +
          +ssl_context = SSLContext(PROTOCOL_TLSv1)
          +ssl_context.load_verify_locations('/path/to/rootca.crt')
          +ssl_context.verify_mode = CERT_REQUIRED
          +ssl_context.check_hostname = True
          +ssl_options = {'server_hostname': '127.0.0.1'}
          +
          +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
          +session = cluster.connect()
          +
          +
          +
          +
          +

          Server verifies client

          +

          If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

          +

          The cassandra configuration:

          +
          client_encryption_options:
          +  enabled: true
          +  keystore: /path/to/127.0.0.1.keystore
          +  keystore_password: myStorePass
          +  require_client_auth: true
          +  truststore: /path/to/dse-truststore.jks
          +  truststore_password: myStorePass
          +
          +
          +

          The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

          +
          cat > gen_client_cert.conf <<EOF
          +[ req ]
          +distinguished_name = req_distinguished_name
          +prompt = no
          +output_password = ${ROOT_CERT_PASS}
          +default_bits = 2048
          +
          +[ req_distinguished_name ]
          +C = ${CERT_COUNTRY}
          +O = ${CERT_ORG_NAME}
          +OU = ${CERT_OU}
          +CN = client
          +EOF
          +
          +
          +

          Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

          +
          openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
          +
          +
          +

          And generate the client signed certificate:

          +
          openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
          +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
          +
          +
          +

          Finally, you can use that configuration with the following driver code:

          +
          from cassandra.cluster import Cluster, Session
          +from ssl import SSLContext, PROTOCOL_TLSv1
          +
          +ssl_context = SSLContext(PROTOCOL_TLSv1)
          +ssl_context.load_cert_chain(
          +    certfile='/path/to/client.crt_signed',
          +    keyfile='/path/to/client.key')
          +
          +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
          +session = cluster.connect()
          +
          +
          +
          +
          +

          Server verifies client and client verifies server

          +

          See the previous section for examples of Cassandra configuration and preparing +the client certificates.

          +

          The following driver code specifies that the connection should use two-way verification:

          +
          from cassandra.cluster import Cluster, Session
          +from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
          +
          +ssl_context = SSLContext(PROTOCOL_TLSv1)
          +ssl_context.load_verify_locations('/path/to/rootca.crt')
          +ssl_context.verify_mode = CERT_REQUIRED
          +ssl_context.load_cert_chain(
          +    certfile='/path/to/client.crt_signed',
          +    keyfile='/path/to/client.key')
          +
          +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
          +session = cluster.connect()
          +
          +
          +

          The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

          +

          Server verifies client and client verifies server using Twisted and pyOpenSSL

          +
          from OpenSSL import SSL, crypto
          +from cassandra.cluster import Cluster
          +from cassandra.io.twistedreactor import TwistedConnection
          +
          +ssl_context = SSL.Context(SSL.TLSv1_METHOD)
          +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
          +ssl_context.use_certificate_file('/path/to/client.crt_signed')
          +ssl_context.use_privatekey_file('/path/to/client.key')
          +ssl_context.load_verify_locations('/path/to/rootca.crt')
          +
          +cluster = Cluster(
          +    contact_points=['127.0.0.1'],
          +    connection_class=TwistedConnection,
          +    ssl_context=ssl_context,
          +    ssl_options={'check_hostname': True}
          +)
          +session = cluster.connect()
          +
          +
          +

          Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

          +
          +
          +
          +

          Versions 3.16.0 and lower

          +

          To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

          +

          By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLSv1 to match +Cassandra’s default protocol.

          +

          For example:

          +
          from cassandra.cluster import Cluster
          +from ssl import PROTOCOL_TLSv1, CERT_REQUIRED
          +
          +ssl_opts = {
          +    'ca_certs': '/path/to/my/ca.certs',
          +    'ssl_version': PROTOCOL_TLSv1,
          +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
          +}
          +cluster = Cluster(ssl_options=ssl_opts)
          +
          +
          +

          This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

          +
          +

          SSL with Twisted

          +

          In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

          +
          +
          +
          +
          +

          DSE Authentication

          +

          When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

          +
          from cassandra.auth import DSEGSSAPIAuthProvider
          +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
          +cluster = Cluster(auth_provider=auth_provider)
          +session = cluster.connect()
          +
          +
          +

          Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

          +
          +

          DSE Unified Authentication

          +

          With DSE (>=5.1), unified Authentication allows you to:

          +
            +
          • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

          • +
          • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

          • +
          +
          +

          Proxy Login

          +

          Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

          +
          GRANT PROXY.LOGIN on role user1 to server
          +
          +
          +

          then you can do the proxy authentication….

          +
          from cassandra.cluster import Cluster
          +from cassandra.auth import SaslAuthProvider
          +
          +sasl_kwargs = {
          +  "service": 'dse',
          +  "mechanism":"PLAIN",
          +  "username": 'server',
          +  'password': 'server',
          +  'authorization_id': 'user1'
          +}
          +
          +auth_provider = SaslAuthProvider(**sasl_kwargs)
          +c = Cluster(auth_provider=auth_provider)
          +s = c.connect()
          +s.execute(...)  # all requests will be executed as 'user1'
          +
          +
          +

          If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

          +
          from cassandra.cluster import Cluster
          +from cassandra.auth import DSEGSSAPIAuthProvider
          +
          +# Ensure the kerberos ticket of the server user is set with the kinit utility.
          +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
          +                                      authorization_id='user1@DATASTAX.COM')
          +c = Cluster(auth_provider=auth_provider)
          +s = c.connect()
          +s.execute(...)  # all requests will be executed as 'user1'
          +
          +
          +
          +
          +

          Proxy Execute

          +

          Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

          +
          GRANT PROXY.EXECUTE on role user1 to server
          +
          +
          +

          then you can do a proxy execute…

          +
          from cassandra.cluster import Cluster
          +from cassandra.auth import DSEPlainTextAuthProvider,
          +
          +auth_provider = DSEPlainTextAuthProvider('server', 'server')
          +
          +c = Cluster(auth_provider=auth_provider)
          +s = c.connect()
          +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
          +
          +
          +

          Please see the official documentation for more details on the feature and configuration process.

          +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/sitemap.xml b/3.24.8-scylla/sitemap.xml new file mode 100644 index 0000000000..5287b36bb9 --- /dev/null +++ b/3.24.8-scylla/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade_guide.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/dates_and_times.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/execution_profiles.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third_party.htmlhttps://python-driver.docs.scylladb.com/stable/user_defined_types.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/getting_started.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/object_mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query_paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_specific.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/3.24.8-scylla/upgrading.html b/3.24.8-scylla/upgrading.html new file mode 100644 index 0000000000..156a4da726 --- /dev/null +++ b/3.24.8-scylla/upgrading.html @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Upgrading

          +
          +
          +
          +

          Upgrading from dse-driver

          +

          Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes.

          +
          +

          Installation

          +

          Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

          +
          pip install scylla-driver
          +
          +
          +

          If you need the Graph Fluent API (features provided by dse-graph):

          +
          pip install scylla-driver[graph]
          +
          +
          +

          See Installation for more details.

          +
          +
          +

          Import from the cassandra module

          +

          There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

          +
          from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
          +from dse.auth import PlainTextAuthProvider
          +from dse.policies import WhiteListRoundRobinPolicy
          +
          +# becomes
          +
          +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
          +from cassandra.auth import PlainTextAuthProvider
          +from cassandra.policies import WhiteListRoundRobinPolicy
          +
          +
          +

          Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

          +
          +
          +

          dse-graph

          +

          dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

          +
          from dse_graph import ..
          +from dse_graph.query import ..
          +
          +# becomes
          +
          +from cassandra.datastax.graph.fluent import ..
          +from cassandra.datastax.graph.fluent.query import ..
          +
          +
          +

          See fluent.

          +
          +
          +

          Session.execute and Session.execute_async API

          +

          Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

          +

          See Session.execute().

          +
          +
          +

          Deprecations

          +

          These changes are optional, but recommended:

          +
            +
          • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

          • +
          • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

          • +
          +
          +
          +
          +

          Upgrading to 3.0

          +

          Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

          +
          +

          Default consistency is now LOCAL_ONE

          +

          Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

          +
          +
          +

          Execution API Updates

          +
          +

          Result return normalization

          +

          PYTHON-368

          +

          Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

          +

          Now, all results are returned as an iterable ResultSet.

          +

          The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

          +
          results = session.execute("SELECT * FROM system.local")
          +for row in results:
          +    process(row)
          +
          +
          +

          If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

          +
          results = session.execute("SELECT * FROM system.local")
          +row_list = list(results)
          +
          +
          +

          For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

          +
          results = session.execute("SELECT * FROM system.local")
          +first_result = results[0]  # materializes results, fetching all pages
          +
          +
          +

          This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

          +
          +
          +

          Trace information is not attached to executed Statements

          +

          PYTHON-318

          +

          Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

          +

          Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

          +

          ResponseFuture.get_query_trace()

          +

          ResponseFuture.get_all_query_traces()

          +

          ResultSet.get_query_trace()

          +

          ResultSet.get_all_query_traces()

          +
          +
          +

          Binding named parameters now ignores extra names

          +

          PYTHON-178

          +

          Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

          +

          Behavior in 3.0+ is to ignore extra names.

          +
          +
          +
          +

          blist removed as soft dependency

          +

          PYTHON-385

          +

          Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

          +

          Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

          +
          +
          +

          Metadata API Updates

          +

          PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

          +

          Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

          +

          The present API is documented: cassandra.metadata. Changes highlighted below:

          +
            +
          • All types are now exposed as CQL types instead of types derived from the internal server implementation

          • +
          • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

          • +
          • Some metadata attributes removed

            +
              +
            • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

            • +
            • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

            • +
            +
          • +
          +
          +
          +

          Several deprecated features are removed

          +

          PYTHON-292

          +
            +
          • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

          • +
          • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

          • +
          • Cluster.submit_schema_refresh removed (574266d)

          • +
          • cqltypes time/date functions removed, use util entry points instead (bb984ee)

          • +
          • decoder module removed (e16a073)

          • +
          • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

          • +
          • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

          • +
          • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

          • +
          • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

          • +
          • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

          • +
          • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

          • +
          +
          +
          +
          +

          Upgrading to 2.1 from 2.0

          +

          Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

          +

          Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

          +
          +

          Using the v3 Native Protocol

          +

          By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster(protocol_version=3)
          +
          +
          +

          Note that protocol version 3 is only supported by Cassandra 2.1+.

          +

          In future releases, the driver may default to using protocol version +3.

          +
          +
          +

          Working with User-Defined Types

          +

          Cassandra 2.1 introduced the ability to define new types:

          +
          USE KEYSPACE mykeyspace;
          +
          +CREATE TYPE address (street text, city text, zip int);
          +
          +
          +

          The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

          +
          cluster = Cluster()
          +
          +class Address(object):
          +
          +    def __init__(self, street, city, zipcode):
          +        self.street = street
          +        self.city = text
          +        self.zipcode = zipcode
          +
          +cluster.register_user_type('mykeyspace', 'address', Address)
          +
          +
          +

          When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

          +

          If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

          +

          See User Defined Types for more details.

          +
          +
          +

          Customizing Encoders for Non-prepared Statements

          +

          Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

          +
          cluster = Cluster()
          +session = cluster.connect()
          +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
          +
          +
          +

          See Type Conversions for the table of default CQL literal conversions.

          +
          +
          +

          Using Client-Side Protocol-Level Timestamps

          +

          With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

          +

          When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

          +
          +
          +
          +

          Upgrading to 2.0 from 1.x

          +

          Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

          +
          +

          Using the v2 Native Protocol

          +

          By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster(protocol_version=2)
          +
          +
          +

          When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

          +
          from cassandra.cluster import Cluster
          +
          +cluster = Cluster(protocol_version=1)
          +
          +
          +
          +
          +

          Automatic Query Paging

          +

          Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

          +

          See Paging Large Queries for full details.

          +
          +
          +

          Protocol-Level Batch Statements

          +

          With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

          +

          See BatchStatement for details and usage examples.

          +
          +
          +

          SASL-based Authentication

          +

          Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

          +
          +
          +

          Lightweight Transactions

          +

          Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

          +
          +
          +

          Calling Cluster.shutdown()

          +

          In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

          +
          +
          +

          Deprecations

          +

          The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

          + +
          +
          +

          Dependency Changes

          +

          The following dependencies have officially been made optional:

          +
            +
          • scales

          • +
          • blist

          • +
          +

          And one new dependency has been added (to enable Python 3 support):

          +
            +
          • six

          • +
          +
          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.24.8-scylla/user_defined_types.html b/3.24.8-scylla/user_defined_types.html new file mode 100644 index 0000000000..e91303532d --- /dev/null +++ b/3.24.8-scylla/user_defined_types.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          User Defined Types

          +

          Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

          +
          CREATE TYPE address (street text, zip int);
          +
          +
          +

          Version 2.1 of the Python driver adds support for user-defined types.

          +
          +

          Registering a UDT

          +

          You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

          +
          +

          Map a Class to a UDT

          +
          cluster = Cluster(protocol_version=3)
          +session = cluster.connect()
          +session.set_keyspace('mykeyspace')
          +session.execute("CREATE TYPE address (street text, zipcode int)")
          +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
          +
          +# create a class to map to the "address" UDT
          +class Address(object):
          +
          +    def __init__(self, street, zipcode):
          +        self.street = street
          +        self.zipcode = zipcode
          +
          +cluster.register_user_type('mykeyspace', 'address', Address)
          +
          +# insert a row using an instance of Address
          +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
          +                (0, Address("123 Main St.", 78723)))
          +
          +# results will include Address instances
          +results = session.execute("SELECT * FROM users")
          +row = results[0]
          +print(row.id, row.location.street, row.location.zipcode)
          +
          +
          +
          +
          +

          Map a dict to a UDT

          +
          cluster = Cluster(protocol_version=3)
          +session = cluster.connect()
          +session.set_keyspace('mykeyspace')
          +session.execute("CREATE TYPE address (street text, zipcode int)")
          +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
          +
          +cluster.register_user_type('mykeyspace', 'address', dict)
          +
          +# insert a row using a prepared statement and a tuple
          +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
          +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
          +
          +# results will include dict instances
          +results = session.execute("SELECT * FROM users")
          +row = results[0]
          +print(row.id, row.location['street'], row.location['zipcode'])
          +
          +
          +
          +
          +
          +

          Using UDTs Without Registering Them

          +

          Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

          +

          When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

          +
          cluster = Cluster(protocol_version=3)
          +session = cluster.connect()
          +session.set_keyspace('mykeyspace')
          +session.execute("CREATE TYPE address (street text, zipcode int)")
          +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
          +
          +class Foo(object):
          +
          +    def __init__(self, street, zipcode, otherstuff):
          +        self.street = street
          +        self.zipcode = zipcode
          +        self.otherstuff = otherstuff
          +
          +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
          +
          +# since we're using a prepared statement, we don't *have* to register
          +# a class to map to the UDT to insert data.  The object just needs to have
          +# "street" and "zipcode" attributes (which Foo does):
          +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
          +
          +# when we query data, UDT columns that don't have a class registered
          +# will be returned as namedtuples:
          +results = session.execute("SELECT * FROM users")
          +first_row = results[0]
          +address = first_row.location
          +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
          +street = address.street
          +zipcode = address.street
          +
          +
          +

          As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

          +

          * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

          +
          +
          + + +
          + + + + + + +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/.buildinfo b/3.25.11-scylla/.buildinfo new file mode 100644 index 0000000000..9045709178 --- /dev/null +++ b/3.25.11-scylla/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 753e02ad61acc6dd7156b432b3c58dc3 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/3.25.11-scylla/.doctrees/CHANGELOG.doctree b/3.25.11-scylla/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..ac76725559 Binary files /dev/null and b/3.25.11-scylla/.doctrees/CHANGELOG.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra.doctree b/3.25.11-scylla/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..83caeebc7f Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/auth.doctree b/3.25.11-scylla/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..8a90e3d24a Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/auth.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cluster.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..36ebe8b453 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cluster.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/concurrent.doctree b/3.25.11-scylla/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..a697c2016b Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/connection.doctree b/3.25.11-scylla/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..7f23bbea8a Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/connection.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..3c4695174a Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..0710c3bee6 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/management.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..cb9d1c462d Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/models.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..8ca8accae4 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/query.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..0a82b32970 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..1d5fb6fafd Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..f900e106ef Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..c266ff364f Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..f1f35240dc Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..707fd4e41e Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/decoder.doctree b/3.25.11-scylla/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..dadf46e0bd Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/decoder.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/encoder.doctree b/3.25.11-scylla/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..023d139401 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/encoder.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/graph.doctree b/3.25.11-scylla/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..c7fe2d103b Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/graph.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree b/3.25.11-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..3a62885f5e Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree b/3.25.11-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..5bf977e7a5 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree b/3.25.11-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..70346795e9 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/io/geventreactor.doctree b/3.25.11-scylla/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..3ec56811f7 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/io/libevreactor.doctree b/3.25.11-scylla/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..bd354a2abd Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree b/3.25.11-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..adf96aa90e Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/metadata.doctree b/3.25.11-scylla/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..a2148656c2 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/metadata.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/metrics.doctree b/3.25.11-scylla/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..f5ea679f5c Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/metrics.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/policies.doctree b/3.25.11-scylla/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..6090ed3ee6 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/policies.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/pool.doctree b/3.25.11-scylla/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..8888187a61 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/pool.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/protocol.doctree b/3.25.11-scylla/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..7d51c36c82 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/protocol.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/query.doctree b/3.25.11-scylla/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..c4af6c767b Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/query.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/timestamps.doctree b/3.25.11-scylla/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..bfb771eb03 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/cassandra/util.doctree b/3.25.11-scylla/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..1c15035bc7 Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/cassandra/util.doctree differ diff --git a/3.25.11-scylla/.doctrees/api/index.doctree b/3.25.11-scylla/.doctrees/api/index.doctree new file mode 100644 index 0000000000..f231d7b33e Binary files /dev/null and b/3.25.11-scylla/.doctrees/api/index.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/batches.doctree b/3.25.11-scylla/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..2f1d1c0c3b Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/batches.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/connections.doctree b/3.25.11-scylla/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..33c23a5e55 Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/connections.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/faq.doctree b/3.25.11-scylla/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..4f4567affd Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/faq.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/models.doctree b/3.25.11-scylla/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..c3464ce4ef Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/models.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/queryset.doctree b/3.25.11-scylla/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..eb8386c9f8 Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/queryset.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/third_party.doctree b/3.25.11-scylla/.doctrees/cqlengine/third_party.doctree new file mode 100644 index 0000000000..539c907928 Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/third_party.doctree differ diff --git a/3.25.11-scylla/.doctrees/cqlengine/upgrade_guide.doctree b/3.25.11-scylla/.doctrees/cqlengine/upgrade_guide.doctree new file mode 100644 index 0000000000..bc710b2efa Binary files /dev/null and b/3.25.11-scylla/.doctrees/cqlengine/upgrade_guide.doctree differ diff --git a/3.25.11-scylla/.doctrees/dates_and_times.doctree b/3.25.11-scylla/.doctrees/dates_and_times.doctree new file mode 100644 index 0000000000..dd4ffce722 Binary files /dev/null and b/3.25.11-scylla/.doctrees/dates_and_times.doctree differ diff --git a/3.25.11-scylla/.doctrees/environment.pickle b/3.25.11-scylla/.doctrees/environment.pickle new file mode 100644 index 0000000000..5d01b161a3 Binary files /dev/null and b/3.25.11-scylla/.doctrees/environment.pickle differ diff --git a/3.25.11-scylla/.doctrees/execution_profiles.doctree b/3.25.11-scylla/.doctrees/execution_profiles.doctree new file mode 100644 index 0000000000..b0f48c99a9 Binary files /dev/null and b/3.25.11-scylla/.doctrees/execution_profiles.doctree differ diff --git a/3.25.11-scylla/.doctrees/faq.doctree b/3.25.11-scylla/.doctrees/faq.doctree new file mode 100644 index 0000000000..ad9f9f685c Binary files /dev/null and b/3.25.11-scylla/.doctrees/faq.doctree differ diff --git a/3.25.11-scylla/.doctrees/getting_started.doctree b/3.25.11-scylla/.doctrees/getting_started.doctree new file mode 100644 index 0000000000..bb1847e558 Binary files /dev/null and b/3.25.11-scylla/.doctrees/getting_started.doctree differ diff --git a/3.25.11-scylla/.doctrees/index.doctree b/3.25.11-scylla/.doctrees/index.doctree new file mode 100644 index 0000000000..6c2c7cc57d Binary files /dev/null and b/3.25.11-scylla/.doctrees/index.doctree differ diff --git a/3.25.11-scylla/.doctrees/installation.doctree b/3.25.11-scylla/.doctrees/installation.doctree new file mode 100644 index 0000000000..9f4e3039ca Binary files /dev/null and b/3.25.11-scylla/.doctrees/installation.doctree differ diff --git a/3.25.11-scylla/.doctrees/lwt.doctree b/3.25.11-scylla/.doctrees/lwt.doctree new file mode 100644 index 0000000000..3164caf355 Binary files /dev/null and b/3.25.11-scylla/.doctrees/lwt.doctree differ diff --git a/3.25.11-scylla/.doctrees/object_mapper.doctree b/3.25.11-scylla/.doctrees/object_mapper.doctree new file mode 100644 index 0000000000..15723d1889 Binary files /dev/null and b/3.25.11-scylla/.doctrees/object_mapper.doctree differ diff --git a/3.25.11-scylla/.doctrees/performance.doctree b/3.25.11-scylla/.doctrees/performance.doctree new file mode 100644 index 0000000000..4db80eba38 Binary files /dev/null and b/3.25.11-scylla/.doctrees/performance.doctree differ diff --git a/3.25.11-scylla/.doctrees/query_paging.doctree b/3.25.11-scylla/.doctrees/query_paging.doctree new file mode 100644 index 0000000000..7b20a39739 Binary files /dev/null and b/3.25.11-scylla/.doctrees/query_paging.doctree differ diff --git a/3.25.11-scylla/.doctrees/scylla_cloud.doctree b/3.25.11-scylla/.doctrees/scylla_cloud.doctree new file mode 100644 index 0000000000..a1297b005e Binary files /dev/null and b/3.25.11-scylla/.doctrees/scylla_cloud.doctree differ diff --git a/3.25.11-scylla/.doctrees/scylla_specific.doctree b/3.25.11-scylla/.doctrees/scylla_specific.doctree new file mode 100644 index 0000000000..e17c18811f Binary files /dev/null and b/3.25.11-scylla/.doctrees/scylla_specific.doctree differ diff --git a/3.25.11-scylla/.doctrees/security.doctree b/3.25.11-scylla/.doctrees/security.doctree new file mode 100644 index 0000000000..4a7f71fcce Binary files /dev/null and b/3.25.11-scylla/.doctrees/security.doctree differ diff --git a/3.25.11-scylla/.doctrees/upgrading.doctree b/3.25.11-scylla/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..7fdf1dc521 Binary files /dev/null and b/3.25.11-scylla/.doctrees/upgrading.doctree differ diff --git a/3.25.11-scylla/.doctrees/user_defined_types.doctree b/3.25.11-scylla/.doctrees/user_defined_types.doctree new file mode 100644 index 0000000000..4885c1dbff Binary files /dev/null and b/3.25.11-scylla/.doctrees/user_defined_types.doctree differ diff --git a/3.25.11-scylla/.nojekyll b/3.25.11-scylla/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.25.11-scylla/404.html b/3.25.11-scylla/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/3.25.11-scylla/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
          +

          404

          +

          The ScyllaDB monster ate your page!

          +

          + Home +

          +
          + + + \ No newline at end of file diff --git a/3.25.11-scylla/CHANGELOG.html b/3.25.11-scylla/CHANGELOG.html new file mode 100644 index 0000000000..6b63ecf2a4 --- /dev/null +++ b/3.25.11-scylla/CHANGELOG.html @@ -0,0 +1,2903 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          CHANGELOG

          +
          +

          3.25.0

          +

          March 18, 2021

          +
          +

          Features

          +
            +
          • Ensure the driver can connect when invalid peer hosts are in system.peers (PYTHON-1260)

          • +
          • Implement protocol v5 checksumming (PYTHON-1258)

          • +
          • Fix the default cqlengine connection mechanism to work with Astra (PYTHON-1265)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

          • +
          • Update list of reserved keywords (PYTHON-1269)

          • +
          +
          +
          +

          Others

          +
            +
          • Drop Python 3.4 support (PYTHON-1220)

          • +
          • Update security documentation and examples to use PROTOCOL_TLS (PYTHON-1264)

          • +
          +
          +
          +
          +

          3.24.0

          +

          June 18, 2020

          +
          +

          Features

          +
            +
          • Make geomet an optional dependency at runtime (PYTHON-1237)

          • +
          • Add use_default_tempdir cloud config options (PYTHON-1245)

          • +
          • Tcp flow control for libevreactor (PYTHON-1248)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Unable to connect to a cloud cluster using Ubuntu 20.04 (PYTHON-1238)

          • +
          • PlainTextAuthProvider fails with unicode chars and Python3 (PYTHON-1241)

          • +
          • [GRAPH] Graph execution profiles consistency level are not set to LOCAL_QUORUM with a cloud cluster (PYTHON-1240)

          • +
          • [GRAPH] Can’t write data in a Boolean field using the Fluent API (PYTHON-1239)

          • +
          • [GRAPH] Fix elementMap() result deserialization (PYTHON-1233)

          • +
          +
          +
          +

          Others

          +
            +
          • Bump geomet dependency version to 0.2 (PYTHON-1243)

          • +
          • Bump gremlinpython dependency version to 3.4.6 (PYTHON-1212)

          • +
          • Improve fluent graph documentation for core graphs (PYTHON-1244)

          • +
          +
          +
          +
          +

          3.23.0

          +

          April 6, 2020

          +
          +

          Features

          +
            +
          • Transient Replication Support (PYTHON-1207)

          • +
          • Support system.peers_v2 and port discovery for C* 4.0 (PYTHON-700)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Asyncore logging exception on shutdown (PYTHON-1228)

          • +
          +
          +
          +
          +

          3.22.0

          +

          February 26, 2020

          +
          +

          Features

          +
            +
          • Add all() function to the ResultSet API (PYTHON-1203)

          • +
          • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

          • +
          • Add GraphSON3 support (PYTHON-788)

          • +
          • Use GraphSON3 as default for Native graphs (PYTHON-1004)

          • +
          • Add Tuple and UDT types for native graph (PYTHON-1005)

          • +
          • Add Duration type for native graph (PYTHON-1000)

          • +
          • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

          • +
          • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

          • +
          • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

          • +
          • Resolve the row_factory automatically for native graphs (PYTHON-1056)

          • +
          • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

          • +
          • Add g:BulkSet graph deserializers (PYTHON-1060)

          • +
          • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

          • +
          • Update Native to Core Graph Engine

          • +
          • Add graphson3 and native graph support (PYTHON-1039)

          • +
          • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

          • +
          • Expose filter predicates for cql collections (PYTHON-1019)

          • +
          • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

          • +
          • Make graph metadata handling more robust (PYTHON-1204)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

          • +
          +
          +
          +
          +

          3.21.0

          +

          January 15, 2020

          +
          +

          Features

          +
            +
          • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

          • +
          • Add Python 3.8 support (PYTHON-1189)

          • +
          • Allow passing ssl context for Twisted (PYTHON-1161)

          • +
          • Ssl context and cloud support for Eventlet (PYTHON-1162)

          • +
          • Cloud Twisted support (PYTHON-1163)

          • +
          • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

          • +
          • Flexible version parsing (PYTHON-1174)

          • +
          • Support NULL in collection deserializer (PYTHON-1123)

          • +
          • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

          • +
          • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

          • +
          • asyncio message chunks can be processed discontinuously (PYTHON-1185)

          • +
          • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

          • +
          • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

          • +
          • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

          • +
          • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

          • +
          +
          +
          +

          Others

          +
            +
          • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

          • +
          • Remove *read_repair_chance table options (PYTHON-1140)

          • +
          • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

          • +
          • Add new DSE CQL keywords (PYTHON-1122)

          • +
          • Publish binary wheel distributions (PYTHON-1013)

          • +
          +
          +
          +

          Deprecations

          +
            +
          • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

          • +
          +

          Merged from dse-driver:

          +
          +
          +

          Features

          +
            +
          • Insights integration (PYTHON-1047)

          • +
          • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

          • +
          • Add NodeSync metadata (PYTHON-799)

          • +
          • Add new NodeSync failure values (PYTHON-934)

          • +
          • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

          • +
          • GraphOptions should show a warning for unknown parameters (PYTHON-819)

          • +
          • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

          • +
          • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

          • +
          • Add graph-results payload option for GraphSON format (PYTHON-773)

          • +
          • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

          • +
          • Implement serializers for the Graph String API (PYTHON-778)

          • +
          • Provide deserializers for GraphSON types (PYTHON-782)

          • +
          • Add Graph DurationType support (PYTHON-607)

          • +
          • Support DSE DateRange type (PYTHON-668)

          • +
          • RLAC CQL output for materialized views (PYTHON-682)

          • +
          • Add Geom Types wkt deserializer

          • +
          • DSE Graph Client timeouts in custom payload (PYTHON-589)

          • +
          • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

          • +
          • Add config profiles to DSE graph execution (PYTHON-570)

          • +
          • DSE Driver version checking (PYTHON-568)

          • +
          • Distinct default timeout for graph queries (PYTHON-477)

          • +
          • Graph result parsing for known types (PYTHON-479,487)

          • +
          • Distinct read/write CL for graph execution (PYTHON-509)

          • +
          • Target graph analytics query to spark master when available (PYTHON-510)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

          • +
          • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

          • +
          • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

          • +
          • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

          • +
          • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

          • +
          • Update date serialization to isoformat in graph (PYTHON-805)

          • +
          • DateRange Parse Error (PYTHON-729)

          • +
          • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

          • +
          • metadata.get_host returning None unexpectedly (PYTHON-709)

          • +
          • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

          • +
          • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

          • +
          • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

          • +
          • Correctly handle other types in geo type equality (PYTHON-508)

          • +
          +
          +
          +

          Other

          +
            +
          • Add tests around cqlengine and continuous paging (PYTHON-872)

          • +
          • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

          • +
          • Write documentation examples for DSE 2.0 features (PYTHON-732)

          • +
          • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

          • +
          +
          +
          +
          +

          3.20.2

          +

          November 19, 2019

          +
          +

          Bug Fixes

          +
            +
          • Fix import error for old python installation without SSLContext (PYTHON-1183)

          • +
          +
          +
          +
          +

          3.20.1

          +

          November 6, 2019

          +
          +

          Bug Fixes

          +
            +
          • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

          • +
          +
          +
          +
          +

          3.20.0

          +

          October 28, 2019

          +
          +

          Features

          +
            +
          • DataStax Astra Support (PYTHON-1074)

          • +
          • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

          • +
          • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

          • +
          • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

          • +
          +
          +
          +
          +

          3.19.0

          +

          August 26, 2019

          +
          +

          Features

          +
            +
          • Add Python 3.7 support (PYTHON-1016)

          • +
          • Future-proof Mapping imports (PYTHON-1023)

          • +
          • Include param values in cqlengine logging (PYTHON-1105)

          • +
          • NTS Token Replica Map Generation is slow (PYTHON-622)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

          • +
          • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

          • +
          • Fix incorrect metadata for compact counter tables (PYTHON-1100)

          • +
          • Call ConnectionException with correct kwargs (PYTHON-1117)

          • +
          • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

          • +
          • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

          • +
          • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

          • +
          +
          +
          +

          Other

          +
            +
          • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

          • +
          • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

          • +
          +
          +
          +
          +

          3.18.0

          +

          May 27, 2019

          +
          +

          Features

          +
            +
          • Abstract Host Connection information (PYTHON-1079)

          • +
          • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

          • +
          • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

          • +
          • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

          • +
          • Accept legacy empty strings as column names (PYTHON-1082)

          • +
          • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

          • +
          +
          +
          +
          +

          3.17.1

          +

          May 2, 2019

          +
          +

          Bug Fixes

          +
            +
          • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

          • +
          +
          +
          +
          +

          3.17.0

          +

          February 19, 2019

          +
          +

          Features

          +
            +
          • Send driver name and version in startup message (PYTHON-1068)

          • +
          • Add Cluster ssl_context option to enable SSL (PYTHON-995)

          • +
          • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

          • +
          • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

          • +
          • Add Session.get_execution_profile (PYTHON-932)

          • +
          • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

          • +
          • Serial consistency level is not used (PYTHON-1007)

          • +
          +
          +
          +

          Other

          +
            +
          • Fail faster on incorrect lz4 import (PYTHON-1042)

          • +
          • Bump Cython dependency version to 0.29 (PYTHON-1036)

          • +
          • Expand Driver SSL Documentation (PYTHON-740)

          • +
          +
          +
          +

          Deprecations

          +
            +
          • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

          • +
          • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

          • +
          +
          +
          +
          +

          3.16.0

          +

          November 12, 2018

          +
          +

          Bug Fixes

          +
            +
          • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

          • +
          • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

          • +
          • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

          • +
          • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

          • +
          • Log profile name on attempt to create existing profile (PYTHON-944)

          • +
          • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

          • +
          +
          +
          +

          Other

          +
            +
          • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

          • +
          • Fix wrong use of ResultSet indexing (PYTHON-1015)

          • +
          +
          +
          +
          +

          3.15.1

          +

          September 6, 2018

          +
          +

          Bug Fixes

          +
            +
          • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

          • +
          +
          +
          +
          +

          3.15.0

          +

          August 30, 2018

          +
          +

          Features

          +
            +
          • Parse Virtual Keyspace Metadata (PYTHON-992)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

          • +
          • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

          • +
          • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

          • +
          • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

          • +
          +
          +
          +

          Other

          +
            +
          • Use global variable for libev loops so it can be subclassed (PYTHON-973)

          • +
          • Update SchemaParser for V4 (PYTHON-1006)

          • +
          • Bump Cython dependency version to 0.28 (PYTHON-1012)

          • +
          +
          +
          +
          +

          3.14.0

          +

          April 17, 2018

          +
          +

          Features

          +
            +
          • Add one() function to the ResultSet API (PYTHON-947)

          • +
          • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

          • +
          • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

          • +
          • Twisted SSL Support (PYTHON-343)

          • +
          • Support IS NOT NULL operator in cqlengine (PYTHON-968)

          • +
          +
          +
          +

          Other

          +
            +
          • Fix Broken Links in Docs (PYTHON-916)

          • +
          • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

          • +
          • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

          • +
          • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

          • +
          • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

          • +
          • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

          • +
          • Add DSE smoke test to OSS driver tests (PYTHON-894)

          • +
          • Document long compilation times and workarounds (PYTHON-868)

          • +
          • Improve error for batch WriteTimeouts (PYTHON-941)

          • +
          • Deprecate ResultSet indexing (PYTHON-945)

          • +
          +
          +
          +
          +

          3.13.0

          +

          January 30, 2018

          +
          +

          Features

          +
            +
          • cqlengine: LIKE filter operator (PYTHON-512)

          • +
          • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

          • +
          • Support retry_policy in PreparedStatement (PYTHON-861)

          • +
          • __del__ method in Session is throwing an exception (PYTHON-813)

          • +
          • LZ4 import issue with recent versions (PYTHON-897)

          • +
          • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

          • +
          • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

          • +
          +
          +
          +

          Other

          +
            +
          • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

          • +
          • Fix DeprecationWarning of log.warn (PYTHON-846)

          • +
          • Fix example_mapper.py for python3 (PYTHON-860)

          • +
          • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

          • +
          • Add some known deprecated warnings for 4.x (PYTHON-877)

          • +
          • Remove copyright dates from copyright notices (PYTHON-863)

          • +
          • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

          • +
          • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

          • +
          • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

          • +
          • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

          • +
          +
          +
          +
          +

          3.12.0

          +

          November 6, 2017

          +
          +

          Features

          +
            +
          • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

          • +
          • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

          • +
          • WriteType.CDC and VIEW missing (PYTHON-794)

          • +
          • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

          • +
          • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

          • +
          • Include hash of result set metadata in prepared stmt id (PYTHON-808)

          • +
          • Add NO_COMPACT startup option (PYTHON-839)

          • +
          • Add new exception type for CDC (PYTHON-837)

          • +
          • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

          • +
          • Add asyncio reactor (PYTHON-507)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

          • +
          • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

          • +
          • Not create two sessions by default in CQLEngine (PYTHON-814)

          • +
          • Bug when subclassing AyncoreConnection (PYTHON-827)

          • +
          • Error at cleanup when closing the asyncore connections (PYTHON-829)

          • +
          • Fix sites where sessions can change during iteration (PYTHON-793)

          • +
          • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

          • +
          • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

          • +
          • Dont set the session keyspace when preparing statements (PYTHON-843)

          • +
          • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

          • +
          +
          +
          +

          Other

          +
            +
          • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

          • +
          • Bump Cython dependency version to 0.27 (PYTHON-833)

          • +
          +
          +
          +
          +

          3.11.0

          +

          July 24, 2017

          +
          +

          Features

          +
            +
          • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

          • +
          • Add HostFilterPolicy (PYTHON-761)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

          • +
          • Fix asyncore hang on exit (PYTHON-767)

          • +
          • Driver takes several minutes to remove a bad host from session (PYTHON-762)

          • +
          • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

          • +
          • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

          • +
          • request_ids may not be returned to the pool (PYTHON-739)

          • +
          • Fix murmur3 on big-endian systems (PYTHON-653)

          • +
          • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

          • +
          • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

          • +
          +
          +
          +

          Other

          +
            +
          • Bump Cython dependency version to 0.25.2 (PYTHON-754)

          • +
          • Fix DeprecationWarning when using lz4 (PYTHON-769)

          • +
          • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

          • +
          • Improve upgrade guide for materializing pages (PYTHON-464)

          • +
          • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

          • +
          • Point to DSA Slack, not IRC, in docs index

          • +
          +
          +
          +
          +

          3.10.0

          +

          May 24, 2017

          +
          +

          Features

          +
            +
          • Add Duration type to cqlengine (PYTHON-750)

          • +
          • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

          • +
          • get_query_trace() contract is ambiguous (PYTHON-196)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Queries using speculative execution policy timeout prematurely (PYTHON-755)

          • +
          • Fix map where results are not consumed (PYTHON-749)

          • +
          • Driver fails to encode Duration’s with large values (PYTHON-747)

          • +
          • UDT values are not updated correctly in CQLEngine (PYTHON-743)

          • +
          • UDT types are not validated in CQLEngine (PYTHON-742)

          • +
          • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

          • +
          • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

          • +
          • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

          • +
          • Memory grows and doesn’t get removed (PYTHON-720)

          • +
          • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

          • +
          • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

          • +
          • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

          • +
          +
          +
          +

          Other

          +
            +
          • Update README (PYTHON-746)

          • +
          • Test python versions 3.5 and 3.6 (PYTHON-737)

          • +
          • Docs Warning About Prepare select * (PYTHON-626)

          • +
          • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

          • +
          • Example SSL connection code does not verify server certificates (PYTHON-469)

          • +
          +
          +
          +
          +

          3.9.0

          +
          +

          Features

          +
            +
          • cqlengine: remove elements by key from a map (PYTHON-688)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • improve error handling when connecting to non-existent keyspace (PYTHON-665)

          • +
          • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

          • +
          • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

          • +
          • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

          • +
          • race where callback or errback for request may not be called (PYTHON-733)

          • +
          • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

          • +
          • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

          • +
          +
          +
          +

          Other

          +
            +
          • Connection not closed in example_mapper (PYTHON-723)

          • +
          • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

          • +
          +
          +
          +
          +

          3.8.1

          +

          March 16, 2017

          +
          +

          Bug Fixes

          +
            +
          • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

          • +
          • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

          • +
          • Fix DecimalType regression (PYTHON-724)

          • +
          +
          +
          +
          +

          3.8.0

          +
          +

          Features

          +
            +
          • Quote index names in metadata CQL generation (PYTHON-616)

          • +
          • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

          • +
          • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

          • +
          • Added cql types to result set (PYTHON-648)

          • +
          • Add __len__ to BatchStatement (PYTHON-650)

          • +
          • Duration Type for Cassandra (PYTHON-655)

          • +
          • Send flags with PREPARE message in v5 (PYTHON-684)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

          • +
          • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

          • +
          • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

          • +
          • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

          • +
          • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

          • +
          • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

          • +
          • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

          • +
          • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

          • +
          • Make client timestamps strictly monotonic (PYTHON-676)

          • +
          • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

          • +
          +
          +
          +

          Other

          +
            +
          • Create a cqlengine doc section explaining None semantics (PYTHON-623)

          • +
          • Resolve warnings in documentation generation (PYTHON-645)

          • +
          • Cython dependency (PYTHON-686)

          • +
          • Drop Support for Python 2.6 (PYTHON-690)

          • +
          +
          +
          +
          +

          3.7.1

          +

          October 26, 2016

          +
          +

          Bug Fixes

          +
            +
          • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

          • +
          +
          +
          +
          +

          3.7.0

          +

          September 13, 2016

          +
          +

          Features

          +
            +
          • Add v5 protocol failure map (PYTHON-619)

          • +
          • Don’t return from initial connect on first error (PYTHON-617)

          • +
          • Indicate failed column when deserialization fails (PYTHON-361)

          • +
          • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

          • +
          • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

          • +
          • EC2 Address Resolver (PYTHON-198)

          • +
          • Speculative query retries (PYTHON-218)

          • +
          • Expose paging state in API (PYTHON-200)

          • +
          • Don’t mark host down while one connection is active (PYTHON-498)

          • +
          • Query request size information (PYTHON-284)

          • +
          • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

          • +
          • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

          • +
          • Add beta version native protocol flag (PYTHON-614)

          • +
          • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Race when adding a pool while setting keyspace (PYTHON-628)

          • +
          • Update results_metadata when prepared statement is reprepared (PYTHON-621)

          • +
          • CQL Export for Thrift Tables (PYTHON-213)

          • +
          • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

          • +
          • cqlengine: columns are no longer hashable (PYTHON-618)

          • +
          • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

          • +
          +
          +
          +
          +

          3.6.0

          +

          August 1, 2016

          +
          +

          Features

          +
            +
          • Handle null values in NumpyProtocolHandler (PYTHON-553)

          • +
          • Collect greplin scales stats per cluster (PYTHON-561)

          • +
          • Update mock unit test dependency requirement (PYTHON-591)

          • +
          • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

          • +
          • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

          • +
          • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

          • +
          • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

          • +
          • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

          • +
          • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix geventreactor with SSL support (PYTHON-600)

          • +
          • Don’t downgrade protocol version if explicitly set (PYTHON-537)

          • +
          • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

          • +
          • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

          • +
          • Libev loop shutdown race (PYTHON-578)

          • +
          • Include aliases in DCT type string (PYTHON-579)

          • +
          • cqlengine: Comparison operators for Columns (PYTHON-595)

          • +
          • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

          • +
          • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

          • +
          • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

          • +
          • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

          • +
          • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

          • +
          • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

          • +
          +
          +
          +
          +

          3.5.0

          +

          June 27, 2016

          +
          +

          Features

          +
            +
          • Optional Execution Profiles for the core driver (PYTHON-569)

          • +
          • API to get the host metadata associated with the control connection node (PYTHON-583)

          • +
          • Expose CDC option in table metadata CQL (PYTHON-593)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Clean up Asyncore socket map when fork is detected (PYTHON-577)

          • +
          • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

          • +
          +
          +
          +
          +

          3.4.1

          +

          May 26, 2016

          +
          +

          Bug Fixes

          +
            +
          • Gevent connection closes on IO timeout (PYTHON-573)

          • +
          • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

          • +
          +
          +
          +
          +

          3.4.0

          +

          May 24, 2016

          +
          +

          Features

          +
            +
          • Include DSE version and workload in Host data (PYTHON-555)

          • +
          • Add a context manager to Cluster and Session (PYTHON-521)

          • +
          • Better Error Message for Unsupported Protocol Version (PYTHON-157)

          • +
          • Make the error message explicitly state when an error comes from the server (PYTHON-412)

          • +
          • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

          • +
          • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

          • +
          • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

          • +
          • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

          • +
          • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

          • +
          • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

          • +
          • Write docs around working with datetime and timezones (PYTHON-394)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • High CPU utilization when using asyncore event loop (PYTHON-239)

          • +
          • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

          • +
          • Make stress scripts Python 2.6 compatible (PYTHON-434)

          • +
          • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

          • +
          • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

          • +
          • Cluster and Session do not GC after leaving scope (PYTHON-135)

          • +
          • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

          • +
          • Reprepare on_up with many clients causes node overload (PYTHON-556)

          • +
          • None inserted into host map when control connection node is decommissioned (PYTHON-548)

          • +
          • weakref.ref does not accept keyword arguments (github #585)

          • +
          +
          +
          +
          +

          3.3.0

          +

          May 2, 2016

          +
          +

          Features

          +
            +
          • Add an AddressTranslator interface (PYTHON-69)

          • +
          • New Retry Policy Decision - try next host (PYTHON-285)

          • +
          • Don’t mark host down on timeout (PYTHON-286)

          • +
          • SSL hostname verification (PYTHON-296)

          • +
          • Add C* version to metadata or cluster objects (PYTHON-301)

          • +
          • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

          • +
          • Expose listen_address of node we get ring information from (PYTHON-332)

          • +
          • Use A-record with multiple IPs for contact points (PYTHON-415)

          • +
          • Custom consistency level for populating query traces (PYTHON-435)

          • +
          • Normalize Server Exception Types (PYTHON-443)

          • +
          • Propagate exception message when DDL schema agreement fails (PYTHON-444)

          • +
          • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

          • +
          • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

          • +
          • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

          • +
          • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

          • +
          • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

          • +
          • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

          • +
          +
          +
          +
          +

          3.2.2

          +

          April 19, 2016

          +
            +
          • Fix counter save-after-no-update (PYTHON-547)

          • +
          +
          +
          +

          3.2.1

          +

          April 13, 2016

          +
            +
          • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

          • +
          +
          +
          +

          3.2.0

          +

          April 12, 2016

          +
          +

          Features

          +
            +
          • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

          • +
          • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

          • +
          • cqlengine: support non-equal conditions for LWT (PYTHON-528)

          • +
          • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

          • +
          • cqlengine: token-aware routing for mapper statements (PYTHON-535)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

          • +
          • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

          • +
          • comparing models with datetime fields fail #79 (PYTHON-273)

          • +
          • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

          • +
          • db_field is not always respected with UpdateStatement (PYTHON-530)

          • +
          • Sync_table fails on column.Set with secondary index (PYTHON-533)

          • +
          +
          +
          +
          +

          3.1.1

          +

          March 14, 2016

          +
          +

          Bug Fixes

          +
            +
          • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

          • +
          +
          +
          +
          +

          3.1.0

          +

          March 10, 2016

          +
          +

          Features

          +
            +
          • Pass name of server auth class to AuthProvider (PYTHON-454)

          • +
          • Surface schema agreed flag for DDL statements (PYTHON-458)

          • +
          • Automatically convert float and int to Decimal on serialization (PYTHON-468)

          • +
          • Eventlet Reactor IO improvement (PYTHON-495)

          • +
          • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

          • +
          • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

          • +
          • Add Session.default_serial_consistency_level (github #510)

          • +
          • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

          • +
          • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

          • +
          • cqlengine: Add DISTINCT query operator (PYTHON-266)

          • +
          • cqlengine: Tuple cqlengine api (PYTHON-306)

          • +
          • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

          • +
          • cqlengine: Allow nested container types (PYTHON-478)

          • +
          • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

          • +
          • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

          • +
          • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

          • +
          • Overflow when decoding large collections (cython) (PYTHON-459)

          • +
          • Timer heap comparison issue with Python 3 (github #466)

          • +
          • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

          • +
          • Decode error encountered when cython deserializing large map results (PYTHON-459)

          • +
          • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

          • +
          • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

          • +
          • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

          • +
          • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

          • +
          • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

          • +
          • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

          • +
          • cqlengine: db_field breaks UserType (PYTHON-346)

          • +
          • cqlengine: UDT badly quoted (PYTHON-347)

          • +
          • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

          • +
          • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

          • +
          • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

          • +
          • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

          • +
          • cqlengine: Better error for management functions when no connection set (PYTHON-451)

          • +
          • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

          • +
          • cqlengine: Fix inserting None for model save (PYTHON-475)

          • +
          • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

          • +
          • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

          • +
          • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

          • +
          +
          +
          +

          Other

          +
            +
          • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

          • +
          • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

          • +
          +
          +
          +
          +

          3.0.0

          +

          November 24, 2015

          +
          +

          Features

          +
            +
          • Support datetime.date objects as a DateType (PYTHON-212)

          • +
          • Add Cluster.update_view_metadata (PYTHON-407)

          • +
          • QueryTrace option to populate partial trace sessions (PYTHON-438)

          • +
          • Attach column names to ResultSet (PYTHON-439)

          • +
          • Change default consistency level to LOCAL_ONE

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

          • +
          • Evict UDTs from UserType cache on change (PYTHON-226)

          • +
          • Make sure query strings are always encoded UTF-8 (PYTHON-334)

          • +
          • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

          • +
          • UDT CQL encoding does not work for unicode values (PYTHON-353)

          • +
          • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

          • +
          • Cython integer overflow on decimal type deserialization (PYTHON-433)

          • +
          • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

          • +
          +
          +
          +
          +

          3.0.0rc1

          +

          November 9, 2015

          +
          +

          Features

          +
            +
          • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

          • +
          • Remove deprecated features (PYTHON-292)

          • +
          • Don’t assign trace data to Statements (PYTHON-318)

          • +
          • Normalize results return (PYTHON-368)

          • +
          • Process Materialized View Metadata/Events (PYTHON-371)

          • +
          • Remove blist as soft dependency (PYTHON-385)

          • +
          • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

          • +
          • Normalize CQL query/export in metadata model (PYTHON-405)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Implementation of named arguments bind is non-pythonic (PYTHON-178)

          • +
          • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

          • +
          • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

          • +
          • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

          • +
          • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

          • +
          +
          +
          +
          +

          2.7.2

          +

          September 14, 2015

          +
          +

          Bug Fixes

          +
            +
          • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

          • +
          • Remove futures dep. for Python 3 (PYTHON-393)

          • +
          • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

          • +
          • Unit test runtime issues (PYTHON-397,398)

          • +
          +
          +
          +
          +

          2.7.1

          +

          August 25, 2015

          +
          +

          Bug Fixes

          +
            +
          • Explicitly include extension source files in Manifest

          • +
          +
          +
          +
          +

          2.7.0

          +

          August 25, 2015

          +

          Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

          +
          +

          Features

          +
            +
          • General Performance Improvements for Throughput (PYTHON-283)

          • +
          • Improve synchronous request performance with Timers (PYTHON-108)

          • +
          • Enable C Extensions for PyPy Runtime (PYTHON-357)

          • +
          • Refactor SerDes functionality for pluggable interface (PYTHON-313)

          • +
          • Cython SerDes Extension (PYTHON-377)

          • +
          • Accept iterators/generators for execute_concurrent() (PYTHON-123)

          • +
          • cythonize existing modules (PYTHON-342)

          • +
          • Pure Python murmur3 implementation (PYTHON-363)

          • +
          • Make driver tolerant of inconsistent metadata (PYTHON-370)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

          • +
          • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

          • +
          • Blocking connect does not use connect_timeout (PYTHON-381)

          • +
          • Properly protect partition key in CQL export (PYTHON-375)

          • +
          • Trigger error callbacks on timeout (PYTHON-294)

          • +
          +
          +
          +
          +

          2.6.0

          +

          July 20, 2015

          +
          +

          Bug Fixes

          +
            +
          • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

          • +
          +
          +
          +
          +

          2.6.0c2

          +

          June 24, 2015

          +
          +

          Features

          +
            +
          • Automatic Protocol Version Downgrade (PYTHON-240)

          • +
          • cqlengine Python 2.6 compatibility (PYTHON-288)

          • +
          • Double-dollar string quote UDF body (PYTHON-345)

          • +
          • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Avoid stall while connecting to mixed version cluster (PYTHON-303)

          • +
          • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

          • +
          • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

          • +
          • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

          • +
          • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

          • +
          +
          +
          +
          +

          2.6.0c1

          +

          June 4, 2015

          +

          This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

          +
          +

          Features

          +
            +
          • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

          • +
          • Configuration option for connection timeout (PYTHON-206)

          • +
          • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

          • +
          • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

          • +
          • Implement new request failure messages in protocol v4+ (PYTHON-238)

          • +
          • Metadata model now maps index meta by index name (PYTHON-241)

          • +
          • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

          • +
          • cqle: add Double column type and remove Float overload (PYTHON-246)

          • +
          • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

          • +
          • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

          • +
          • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

          • +
          • Save trace id even when trace complete times out (PYTHON-302)

          • +
          • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

          • +
          • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

          • +
          • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

          • +
          • Expose CQL keywords in API (PYTHON-324)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • IPv6 address support on Windows (PYTHON-20)

          • +
          • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

          • +
          • cqle: Quote keywords properly in table management functions (PYTHON-244)

          • +
          • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

          • +
          • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

          • +
          • Make protocol read_inet work for Windows (PYTHON-309)

          • +
          • cqle: Correct encoding for nested types (PYTHON-311)

          • +
          • Update list of CQL keywords used quoting identifiers (PYTHON-319)

          • +
          • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

          • +
          • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

          • +
          +
          +
          +
          +

          2.5.1

          +

          April 23, 2015

          +
          +

          Bug Fixes

          +
            +
          • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

          • +
          • Fix race condition in node/token rebuild (PYTHON-298)

          • +
          • Set and send serial consistency parameter (PYTHON-299)

          • +
          +
          +
          +
          +

          2.5.0

          +

          March 30, 2015

          +
          +

          Features

          +
            +
          • Integrated cqlengine object mapping package

          • +
          • Utility functions for converting timeuuids and datetime (PYTHON-99)

          • +
          • Schema metadata fetch window randomized, config options added (PYTHON-202)

          • +
          • Support for new Date and Time Cassandra types (PYTHON-190)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

          • +
          • Thread exception during GIL cleanup (PYTHON-229)

          • +
          • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

          • +
          • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

          • +
          • Support reading CompositeType data (PYTHON-234)

          • +
          • Preserve float precision in CQL encoding (PYTHON-243)

          • +
          +
          +
          +
          +

          2.1.4

          +

          January 26, 2015

          +
          +

          Features

          +
            +
          • SaslAuthenticator for Kerberos support (PYTHON-109)

          • +
          • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

          • +
          • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

          • +
          • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

          • +
          • Add eventlet connection support (PYTHON-194)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Schema meta fix for complex thrift tables (PYTHON-191)

          • +
          • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

          • +
          • Resolve stream ID leak on set_keyspace (PYTHON-195)

          • +
          • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

          • +
          • Resolve stream id collision when using SASL auth (PYTHON-210)

          • +
          • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

          • +
          +
          +
          +
          +

          2.1.3

          +

          December 16, 2014

          +
          +

          Features

          +
            +
          • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

          • +
          • Avoid connecting to peer with incomplete metadata (PYTHON-163)

          • +
          • Add SSL support to gevent reactor (PYTHON-174)

          • +
          • Use control connection timeout in wait for schema agreement (PYTHON-175)

          • +
          • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

          • +
          • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Support large negative timestamps on Windows (PYTHON-119)

          • +
          • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

          • +
          • Retain table metadata following keyspace meta refresh (PYTHON-173)

          • +
          • Use a timeout when preparing a statement for all nodes (PYTHON-179)

          • +
          • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

          • +
          • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

          • +
          • Correct routing key encoding for composite keys (PYTHON-184)

          • +
          • Include compression option in schema export string when disabled (PYTHON-187)

          • +
          +
          +
          +
          +

          2.1.2

          +

          October 16, 2014

          +
          +

          Features

          +
            +
          • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

          • +
          • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

          • +
          • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

          • +
          • Handle Unauthorized message on schema_triggers query (PYTHON-155)

          • +
          • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

          • +
          • Support CUSTOM index metadata and string export (PYTHON-165)

          • +
          +
          +
          +
          +

          2.1.1

          +

          September 11, 2014

          +
          +

          Features

          +
            +
          • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

          • +
          • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

          • +
          • Keep timeout for paged results (PYTHON-150)

          • +
          +
          +
          +

          Other

          +
            +
          • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

          • +
          +
          +
          +
          +

          2.1.0

          +

          August 7, 2014

          +
          +

          Bug Fixes

          +
            +
          • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

          • +
          • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

          • +
          +
          +
          +
          +

          2.1.0c1

          +

          July 25, 2014

          +
          +

          Bug Fixes

          +
            +
          • Properly specify UDTs for columns in CREATE TABLE statements

          • +
          • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

          • +
          • Don’t ignore fetch_size arguments to Statement constructors (github-151)

          • +
          • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

          • +
          • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

          • +
          • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

          • +
          • Raise TypeError when a string is used for contact_points (github #164)

          • +
          • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

          • +
          +
          +
          +

          Other

          +
            +
          • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

          • +
          +
          +
          +
          +

          2.1.0b1

          +

          July 11, 2014

          +

          This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

          +
          +

          Features

          +
            +
          • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

          • +
          • Support for user-defined types (Cassandra 2.1+)

          • +
          • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

          • +
          • Protocol-level client-side timestamps (see Session.use_client_timestamp)

          • +
          • Overridable type encoding for non-prepared statements (see Session.encoders)

          • +
          • Configurable serial consistency levels for batch statements

          • +
          • Use io.BytesIO for reduced CPU consumption (github #143)

          • +
          • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

          • +
          • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

          • +
          • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

          • +
          • Don’t share prepared statement lock across Cluster instances

          • +
          • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

          • +
          • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

          • +
          • Properly defunct connections after protocol errors

          • +
          • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

          • +
          • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

          • +
          • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

          • +
          • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

          • +
          • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

          • +
          • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

          • +
          • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

          • +
          +
          +
          +
          +

          2.0.2

          +

          June 10, 2014

          +
          +

          Bug Fixes

          +
            +
          • Add six to requirements.txt

          • +
          • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

          • +
          • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

          • +
          • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

          • +
          • Add python-six to debian dependencies, move python-blist to recommends

          • +
          • Fix memory leak when libev connections are created and +destroyed (github #93)

          • +
          • Ensure token map is rebuilt when hosts are removed from the cluster

          • +
          +
          +
          +
          +

          2.0.1

          +

          May 28, 2014

          +
          +

          Bug Fixes

          +
            +
          • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

          • +
          +
          +
          +
          +

          2.0.0

          +

          May 28, 2014

          +
          +

          Features

          +
            +
          • Make libev C extension Python3-compatible (PYTHON-70)

          • +
          • Support v2 protocol authentication (PYTHON-73, github #125)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix murmur3 C extension compilation under Python3.4 (github #124)

          • +
          +
          +
          +

          Merged From 1.x

          +
          +

          Features

          +
            +
          • Add Session.default_consistency_level (PYTHON-14)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

          • +
          • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

          • +
          • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

          • +
          • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

          • +
          • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

          • +
          • Avoid rebuilding token metadata when cluster topology has not +actually changed

          • +
          • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

          • +
          +
          +
          +

          Other

          +
            +
          • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

          • +
          +
          +
          +
          +
          +

          2.0.0b1

          +

          May 6, 2014

          +
          +

          Upgrading from 1.x

          +

          Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

          +

          If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

          +
          +

          cluster = Cluster(…, protocol_version=1)

          +
          +
          +
          +

          Features

          +
            +
          • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

          • +
          • Support for Python 3.3 and 3.4

          • +
          • Allow a default query timeout to be set per-Session

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

          • +
          +
          +
          +

          Deprecations

          +

          The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

          +
            +
          • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

          • +
          • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

          • +
          • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

          • +
          • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

          • +
          +

          Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

          +
          +
          +
          +

          1.1.2

          +

          May 8, 2014

          +
          +

          Features

          +
            +
          • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

          • +
          • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

          • +
          • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

          • +
          • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

          • +
          • Handle exhausted ReconnectionPolicy schedule correctly

          • +
          +
          +
          +

          Other

          +
            +
          • Don’t log at ERROR when a connection is closed during the startup +communications

          • +
          • Mke scales, blist optional dependencies

          • +
          +
          +
          +
          +

          1.1.1

          +

          April 16, 2014

          +
          +

          Bug Fixes

          +
            +
          • Fix unconditional import of nose in setup.py (github #111)

          • +
          +
          +
          +
          +

          1.1.0

          +

          April 16, 2014

          +
          +

          Features

          +
            +
          • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

          • +
          • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

          • +
          • Add debian packaging (github issue #101)

          • +
          • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

          • +
          • Lowercase boolean literals when generating schemas

          • +
          • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

          • +
          • Don’t reconnect the control connection every time Cluster.connect() is +called

          • +
          • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

          • +
          • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

          • +
          • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

          • +
          • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

          • +
          • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

          • +
          +
          +
          +

          Other

          +
            +
          • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

          • +
          • Better error message when libevwrapper is not found

          • +
          • Only try to import scales when metrics are enabled (github issue #92)

          • +
          • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

          • +
          • Issue warning log when schema versions do not match

          • +
          +
          +
          +
          +

          1.0.2

          +

          March 4, 2014

          +
          +

          Bug Fixes

          +
            +
          • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

          • +
          • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

          • +
          • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

          • +
          • Handle latest table options when parsing the schema and generating +CREATE statements.

          • +
          • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

          • +
          +
          +
          +

          Other

          +
            +
          • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

          • +
          • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

          • +
          • More consistent type checking for query parameters

          • +
          • Add option to a return special object for empty string values for non-string +columns

          • +
          +
          +
          +
          +

          1.0.1

          +

          Feb 19, 2014

          +
          +

          Bug Fixes

          +
            +
          • Include table indexes in KeyspaceMetadata.export_as_string()

          • +
          • Fix broken token awareness on ByteOrderedPartitioner

          • +
          • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

          • +
          • Handle “custom” types (such as the replaced DateType) correctly

          • +
          • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

          • +
          • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

          • +
          • Handle data that is already utf8-encoded for UTF8Type values

          • +
          • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

          • +
          • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

          • +
          +
          +
          +

          Other

          +
            +
          • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

          • +
          • Add details about errors and the last queried host to OperationTimedOut

          • +
          +
          +
          +
          +

          1.0.0 Final

          +

          Jan 29, 2014

          +
          +

          Bug Fixes

          +
            +
          • Prevent leak of Scheduler thread (even with proper shutdown)

          • +
          • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

          • +
          • Hold strong reference to prepared statement while executing it to avoid +garbage collection

          • +
          • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

          • +
          • Fix bad handling of nodes that have been removed from the cluster

          • +
          • Properly escape string types within cql collections

          • +
          • Handle setting the same keyspace twice in a row

          • +
          • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

          • +
          • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

          • +
          • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

          • +
          • Fix endless hanging of some requests when using the libev reactor

          • +
          • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

          • +
          • Generators map to CQL lists, not key sequences

          • +
          • Always defunct connections when an internal operation fails

          • +
          • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

          • +
          • Avoid potential double-erroring of callbacks when a connection +becomes defunct

          • +
          +
          +
          +

          Features

          +
            +
          • Add default query timeout to Session

          • +
          • Add timeout parameter to Session.execute()

          • +
          • Add WhiteListRoundRobinPolicy as a load balancing policy option

          • +
          • Support for consistency level LOCAL_ONE

          • +
          • Make the backoff for fetching traces exponentially increasing and +configurable

          • +
          +
          +
          +

          Other

          +
            +
          • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

          • +
          • Add encoder mapping for OrderedDict

          • +
          • Use timeouts on all control connection queries

          • +
          • Benchmark improvements, including command line options and eay +multithreading support

          • +
          • Reduced lock contention when using the asyncore reactor

          • +
          • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

          • +
          • Add requirements.txt and test-requirements.txt

          • +
          • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

          • +
          +
          +
          +
          +

          1.0.0b7

          +

          Nov 12, 2013

          +

          This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

          +
          +

          Features

          +
            +
          • Add timeout kwarg to ResponseFuture.result()

          • +
          • Create connection pools to all hosts in parallel when initializing +new Sesssions.

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Properly set exception on ResponseFuture when a query fails +against all hosts

          • +
          • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

          • +
          • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

          • +
          • Better error messages for failed Session.prepare() opertaions

          • +
          • Prepare new statements against all hosts in parallel (formerly +sequential)

          • +
          • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

          • +
          • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

          • +
          • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

          • +
          • Throttle trashing of underutilized connections to avoid trashing newly +created connections

          • +
          • Fix race condition which could result in trashed connections being closed +before the last operations had completed

          • +
          • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

          • +
          • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

          • +
          • Correctly handle large messages through libev

          • +
          • Add timeout to schema agreement check queries

          • +
          • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

          • +
          +
          +
          +

          Other

          +
            +
          • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

          • +
          • Better debug logging around connection management

          • +
          • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

          • +
          +
          +
          +
          +

          1.0.0b6

          +

          Oct 22, 2013

          +
          +

          Bug Fixes

          +
            +
          • Use lazy string formatting when logging

          • +
          • Avoid several deadlock scenarios, especially when nodes go down

          • +
          • Avoid trashing newly created connections due to insufficient traffic

          • +
          • Gracefully handle un-handled Exceptions when erroring callbacks

          • +
          +
          +
          +

          Other

          +
            +
          • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

          • +
          +
          +
          +
          +

          1.0.0b5

          +

          Oct 10, 2013

          +
          +

          Features

          +
            +
          • SSL support

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Avoid KeyError when building replica map for NetworkTopologyStrategy

          • +
          • Work around python bug which causes deadlock when a thread imports +the utf8 module

          • +
          • Handle no blist library, which is not compatible with pypy

          • +
          • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

          • +
          +
          +
          +

          Other

          +
            +
          • Switch packaging from Distribute to setuptools, improved C extension +support

          • +
          • Use PEP 386 compliant beta and post-release versions

          • +
          +
          +
          +
          +

          1.0.0-beta4

          +

          Sep 24, 2013

          +
          +

          Features

          +
            +
          • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

          • +
          • Add cql_version kwarg to Cluster.__init__

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

          • +
          • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

          • +
          +
          +
          +
          +

          1.0.0-beta3

          +

          Sep 20, 2013

          +
          +

          Features

          +
            +
          • Support for LZ4 compression (Cassandra 2.0+)

          • +
          • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

          • +
          +
          +
          +

          Bug Fixes

          +
            +
          • Fix libev include path for CentOS

          • +
          • Fix varint packing of the value 0

          • +
          • Correctly pack unicode values

          • +
          • Don’t attempt to return failed connections to the pool when a final result +is set

          • +
          • Fix bad iteration of connection credentials

          • +
          • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

          • +
          • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

          • +
          • Boolean constants shouldn’t be surrounded by single quotes

          • +
          • Avoid a potential loss of precision on float constants due to string +formatting

          • +
          • Actually utilize non-standard ports set on Cluster objects

          • +
          • Fix export of schema as a set of CQL queries

          • +
          +
          +
          +

          Other

          +
            +
          • Use cStringIO for connection buffer for better performance

          • +
          • Add __repr__ method for Statement classes

          • +
          • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

          • +
          • Make all tests compatible with Python 2.6

          • +
          • Add 1s timeout for opening new connections

          • +
          +
          +
          +
          +

          1.0.0-beta2

          +

          Aug 19, 2013

          +
          +

          Bug Fixes

          +
            +
          • Fix pip packaging

          • +
          +
          +
          +
          +

          1.0.0-beta

          +

          Aug 16, 2013

          +

          Initial release

          +
          +
          + + +
          + + + + + +
          + + +
          +
          +

          +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

          +
          +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/CNAME b/3.25.11-scylla/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/3.25.11-scylla/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/3.25.11-scylla/_sources/CHANGELOG.rst.txt b/3.25.11-scylla/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/3.25.11-scylla/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/3.25.11-scylla/_sources/api/cassandra.rst.txt b/3.25.11-scylla/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/auth.rst.txt b/3.25.11-scylla/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/cluster.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..2b3d7828a8 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/3.25.11-scylla/_sources/api/cassandra/concurrent.rst.txt b/3.25.11-scylla/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/3.25.11-scylla/_sources/api/cassandra/connection.rst.txt b/3.25.11-scylla/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/3.25.11-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/3.25.11-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/3.25.11-scylla/_sources/api/cassandra/cqlengine/management.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/3.25.11-scylla/_sources/api/cassandra/cqlengine/models.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/3.25.11-scylla/_sources/api/cassandra/cqlengine/query.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/3.25.11-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt b/3.25.11-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..a9b41cbdc2 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,133 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + :noindex: + +.. autoclass:: GraphOptions + :noindex: + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + :noindex: + +.. autoclass:: Result + :members: + :noindex: + +.. autoclass:: Vertex + :members: + :noindex: + +.. autoclass:: VertexProperty + :members: + :noindex: + +.. autoclass:: Edge + :members: + :noindex: + +.. autoclass:: Path + :members: + :noindex: + +.. autoclass:: T + :members: + :noindex: + +.. autoclass:: GraphSON1Serializer + :members: + :noindex: + +.. autoclass:: GraphSON1Deserializer + :noindex: + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + :noindex: diff --git a/3.25.11-scylla/_sources/api/cassandra/decoder.rst.txt b/3.25.11-scylla/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/3.25.11-scylla/_sources/api/cassandra/encoder.rst.txt b/3.25.11-scylla/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/3.25.11-scylla/_sources/api/cassandra/graph.rst.txt b/3.25.11-scylla/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt b/3.25.11-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt b/3.25.11-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt b/3.25.11-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/io/geventreactor.rst.txt b/3.25.11-scylla/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/io/libevreactor.rst.txt b/3.25.11-scylla/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/3.25.11-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt b/3.25.11-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/3.25.11-scylla/_sources/api/cassandra/metadata.rst.txt b/3.25.11-scylla/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..7c1280bcf7 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,93 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: ReplicationFactor + :members: + :exclude-members: create + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/3.25.11-scylla/_sources/api/cassandra/metrics.rst.txt b/3.25.11-scylla/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/policies.rst.txt b/3.25.11-scylla/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/pool.rst.txt b/3.25.11-scylla/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/3.25.11-scylla/_sources/api/cassandra/protocol.rst.txt b/3.25.11-scylla/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/3.25.11-scylla/_sources/api/cassandra/query.rst.txt b/3.25.11-scylla/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/3.25.11-scylla/_sources/api/cassandra/timestamps.rst.txt b/3.25.11-scylla/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/3.25.11-scylla/_sources/api/cassandra/util.rst.txt b/3.25.11-scylla/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/3.25.11-scylla/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/3.25.11-scylla/_sources/api/index.rst.txt b/3.25.11-scylla/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/3.25.11-scylla/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/3.25.11-scylla/_sources/cqlengine/batches.rst.txt b/3.25.11-scylla/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/3.25.11-scylla/_sources/cqlengine/connections.rst.txt b/3.25.11-scylla/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/3.25.11-scylla/_sources/cqlengine/faq.rst.txt b/3.25.11-scylla/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/3.25.11-scylla/_sources/cqlengine/models.rst.txt b/3.25.11-scylla/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/3.25.11-scylla/_sources/cqlengine/queryset.rst.txt b/3.25.11-scylla/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/3.25.11-scylla/_sources/cqlengine/third_party.rst.txt b/3.25.11-scylla/_sources/cqlengine/third_party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/third_party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/3.25.11-scylla/_sources/cqlengine/upgrade_guide.rst.txt b/3.25.11-scylla/_sources/cqlengine/upgrade_guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/3.25.11-scylla/_sources/cqlengine/upgrade_guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/3.25.11-scylla/_sources/dates_and_times.rst.txt b/3.25.11-scylla/_sources/dates_and_times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/3.25.11-scylla/_sources/dates_and_times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/3.25.11-scylla/_sources/execution_profiles.rst.txt b/3.25.11-scylla/_sources/execution_profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/3.25.11-scylla/_sources/execution_profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/3.25.11-scylla/_sources/faq.rst.txt b/3.25.11-scylla/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/3.25.11-scylla/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/3.25.11-scylla/_sources/getting_started.rst.txt b/3.25.11-scylla/_sources/getting_started.rst.txt new file mode 100644 index 0000000000..59a2acbd04 --- /dev/null +++ b/3.25.11-scylla/_sources/getting_started.rst.txt @@ -0,0 +1,479 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to a Cluster +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +First, make sure you have the Cassandra driver properly :doc:`installed `. + +Connecting to Cassandra ++++++++++++++++++++++++ +The simplest way to create a :class:`~.Cluster` is like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +Session Keyspace +---------------- +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Execution Profiles +------------------ +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +--------------------------------- +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +---------------- +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +-------------------- +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +---------------------------------------------------- +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +--------------------- + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/3.25.11-scylla/_sources/index.rst.txt b/3.25.11-scylla/_sources/index.rst.txt new file mode 100644 index 0000000000..db6d0880d0 --- /dev/null +++ b/3.25.11-scylla/_sources/index.rst.txt @@ -0,0 +1,103 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting_started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla_specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution_profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object_mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query_paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user_defined_types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates_and_times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla_cloud` + Connect to Scylla Cloud + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting_started + scylla_specific + upgrading + execution_profiles + performance + query_paging + lwt + security + user_defined_types + object_mapper + dates_and_times + scylla_cloud + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. diff --git a/3.25.11-scylla/_sources/installation.rst.txt b/3.25.11-scylla/_sources/installation.rst.txt new file mode 100644 index 0000000000..4996a02c1b --- /dev/null +++ b/3.25.11-scylla/_sources/installation.rst.txt @@ -0,0 +1,234 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/3.25.11-scylla/_sources/lwt.rst.txt b/3.25.11-scylla/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/3.25.11-scylla/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/3.25.11-scylla/_sources/object_mapper.rst.txt b/3.25.11-scylla/_sources/object_mapper.rst.txt new file mode 100644 index 0000000000..50d3cbf320 --- /dev/null +++ b/3.25.11-scylla/_sources/object_mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade_guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third_party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade_guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third_party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/3.25.11-scylla/_sources/performance.rst.txt b/3.25.11-scylla/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/3.25.11-scylla/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/3.25.11-scylla/_sources/query_paging.rst.txt b/3.25.11-scylla/_sources/query_paging.rst.txt new file mode 100644 index 0000000000..23ee2c1129 --- /dev/null +++ b/3.25.11-scylla/_sources/query_paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_state'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/3.25.11-scylla/_sources/scylla_cloud.rst.txt b/3.25.11-scylla/_sources/scylla_cloud.rst.txt new file mode 100644 index 0000000000..62aaf76433 --- /dev/null +++ b/3.25.11-scylla/_sources/scylla_cloud.rst.txt @@ -0,0 +1,5 @@ +Scylla Cloud +------------ + +To connect to a `Scylla Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/3.25.11-scylla/_sources/scylla_specific.rst.txt b/3.25.11-scylla/_sources/scylla_specific.rst.txt new file mode 100644 index 0000000000..101ddb534b --- /dev/null +++ b/3.25.11-scylla/_sources/scylla_specific.rst.txt @@ -0,0 +1,106 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +See the configuration of ``native_shard_aware_transport_port`` and ``native_shard_aware_transport_port_ssl`` on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``shard_aware_options`` + + Setting it to ``dict(disable=True)`` would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections + + Other option is to configure scylla by setting ``enable_shard_aware_drivers: false`` on scylla.yaml. + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(shard_aware_options=dict(disable=True)) + session = cluster.connect() + + assert not cluster.is_shard_aware(), "Shard aware should be disabled" + + # or just disable the shard aware port logic + cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True)) + session = cluster.connect() + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Table Attributes +-------------------- + +* ``in_memory`` flag + + New flag available on ``TableMetadata.options`` to indicate that it is an `In Memory `_ table + +.. note:: in memory tables is a feature existing only in Scylla Enterprise + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; + """) + + session.execute(""" + CREATE TABLE IF NOT EXISTS keyspace1.standard1 ( + key blob PRIMARY KEY, + "C0" blob + ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'} + """) + + cluster.refresh_table_metadata("keyspace1", "standard1") + assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True diff --git a/3.25.11-scylla/_sources/security.rst.txt b/3.25.11-scylla/_sources/security.rst.txt new file mode 100644 index 0000000000..c30189562f --- /dev/null +++ b/3.25.11-scylla/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS + + ssl_context = SSLContext(PROTOCOL_TLS) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_2_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLS`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLS, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLS, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/3.25.11-scylla/_sources/upgrading.rst.txt b/3.25.11-scylla/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..9559fa3579 --- /dev/null +++ b/3.25.11-scylla/_sources/upgrading.rst.txt @@ -0,0 +1,388 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Upgrading from dse-driver +------------------------- + +Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes. + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/3.25.11-scylla/_sources/user_defined_types.rst.txt b/3.25.11-scylla/_sources/user_defined_types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/3.25.11-scylla/_sources/user_defined_types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
          )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
          )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
          )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/3.25.11-scylla/_static/basic.css b/3.25.11-scylla/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/3.25.11-scylla/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/3.25.11-scylla/_static/check-solid.svg b/3.25.11-scylla/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/3.25.11-scylla/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.25.11-scylla/_static/clipboard.min.js b/3.25.11-scylla/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/3.25.11-scylla/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/3.25.11-scylla/_static/copybutton.css b/3.25.11-scylla/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/3.25.11-scylla/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

          Short

          + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/3.25.11-scylla/_static/copybutton.js b/3.25.11-scylla/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/3.25.11-scylla/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/3.25.11-scylla/_static/copybutton_funcs.js b/3.25.11-scylla/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/3.25.11-scylla/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/3.25.11-scylla/_static/css/main.css b/3.25.11-scylla/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/3.25.11-scylla/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/3.25.11-scylla/_static/doctools.js b/3.25.11-scylla/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/3.25.11-scylla/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/3.25.11-scylla/_static/documentation_options.js b/3.25.11-scylla/_static/documentation_options.js new file mode 100644 index 0000000000..9a1a21f7d2 --- /dev/null +++ b/3.25.11-scylla/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.25.11', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/3.25.11-scylla/_static/file.png b/3.25.11-scylla/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/3.25.11-scylla/_static/file.png differ diff --git a/3.25.11-scylla/_static/img/banner-background.svg b/3.25.11-scylla/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/3.25.11-scylla/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/favicon-228x228.png b/3.25.11-scylla/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/3.25.11-scylla/_static/img/favicon-228x228.png differ diff --git a/3.25.11-scylla/_static/img/favicon-32x32.png b/3.25.11-scylla/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/3.25.11-scylla/_static/img/favicon-32x32.png differ diff --git a/3.25.11-scylla/_static/img/favicon.ico b/3.25.11-scylla/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/3.25.11-scylla/_static/img/favicon.ico differ diff --git a/3.25.11-scylla/_static/img/icons/icon-about-team.svg b/3.25.11-scylla/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/3.25.11-scylla/_static/img/icons/icon-about-us-m.svg b/3.25.11-scylla/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-about-us.svg b/3.25.11-scylla/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-alternator.svg b/3.25.11-scylla/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-apps.svg b/3.25.11-scylla/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-architecture.svg b/3.25.11-scylla/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/3.25.11-scylla/_static/img/icons/icon-benchmarks.svg b/3.25.11-scylla/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/3.25.11-scylla/_static/img/icons/icon-blog.svg b/3.25.11-scylla/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/3.25.11-scylla/_static/img/icons/icon-careers.svg b/3.25.11-scylla/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/3.25.11-scylla/_static/img/icons/icon-chevron-left.svg b/3.25.11-scylla/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-chevron-right.svg b/3.25.11-scylla/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-circe.svg b/3.25.11-scylla/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-clock.svg b/3.25.11-scylla/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-close.svg b/3.25.11-scylla/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-cloud-docs.svg b/3.25.11-scylla/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-cloud.svg b/3.25.11-scylla/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-comparison.svg b/3.25.11-scylla/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/3.25.11-scylla/_static/img/icons/icon-contact-us.svg b/3.25.11-scylla/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/3.25.11-scylla/_static/img/icons/icon-developers-blog.svg b/3.25.11-scylla/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/3.25.11-scylla/_static/img/icons/icon-docs.svg b/3.25.11-scylla/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/3.25.11-scylla/_static/img/icons/icon-enterprise-m.svg b/3.25.11-scylla/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-enterprise.svg b/3.25.11-scylla/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-events.svg b/3.25.11-scylla/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/3.25.11-scylla/_static/img/icons/icon-exclamation.svg b/3.25.11-scylla/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-expand.svg b/3.25.11-scylla/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-forum.svg b/3.25.11-scylla/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-getting-started.svg b/3.25.11-scylla/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-glossary.svg b/3.25.11-scylla/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-home.svg b/3.25.11-scylla/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-infoworld.svg b/3.25.11-scylla/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/3.25.11-scylla/_static/img/icons/icon-integrations.svg b/3.25.11-scylla/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-knowledge-base.svg b/3.25.11-scylla/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-less.svg b/3.25.11-scylla/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-live-test.svg b/3.25.11-scylla/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/3.25.11-scylla/_static/img/icons/icon-mail-list.svg b/3.25.11-scylla/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-manager.svg b/3.25.11-scylla/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/3.25.11-scylla/_static/img/icons/icon-memory-management.svg b/3.25.11-scylla/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/3.25.11-scylla/_static/img/icons/icon-modeling.svg b/3.25.11-scylla/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-monitoring.svg b/3.25.11-scylla/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/3.25.11-scylla/_static/img/icons/icon-networking.svg b/3.25.11-scylla/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/3.25.11-scylla/_static/img/icons/icon-news.svg b/3.25.11-scylla/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/3.25.11-scylla/_static/img/icons/icon-newsletter.svg b/3.25.11-scylla/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/3.25.11-scylla/_static/img/icons/icon-nsql-guides.svg b/3.25.11-scylla/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/3.25.11-scylla/_static/img/icons/icon-open-source.svg b/3.25.11-scylla/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/3.25.11-scylla/_static/img/icons/icon-operator.svg b/3.25.11-scylla/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-overview.svg b/3.25.11-scylla/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/3.25.11-scylla/_static/img/icons/icon-partners.svg b/3.25.11-scylla/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/3.25.11-scylla/_static/img/icons/icon-plus.svg b/3.25.11-scylla/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-pricing.svg b/3.25.11-scylla/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/3.25.11-scylla/_static/img/icons/icon-release-notes.svg b/3.25.11-scylla/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/3.25.11-scylla/_static/img/icons/icon-resource-center.svg b/3.25.11-scylla/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/3.25.11-scylla/_static/img/icons/icon-roadmap.svg b/3.25.11-scylla/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/3.25.11-scylla/_static/img/icons/icon-search.svg b/3.25.11-scylla/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-slack.svg b/3.25.11-scylla/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-stack-overflow.svg b/3.25.11-scylla/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-summit.svg b/3.25.11-scylla/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/icons/icon-support.svg b/3.25.11-scylla/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/3.25.11-scylla/_static/img/icons/icon-tech-talks.svg b/3.25.11-scylla/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/3.25.11-scylla/_static/img/icons/icon-testing.svg b/3.25.11-scylla/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/3.25.11-scylla/_static/img/icons/icon-thumbs-down.svg b/3.25.11-scylla/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-thumbs-up.svg b/3.25.11-scylla/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.11-scylla/_static/img/icons/icon-tip.svg b/3.25.11-scylla/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-training.svg b/3.25.11-scylla/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/3.25.11-scylla/_static/img/icons/icon-triangle-down.svg b/3.25.11-scylla/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-university.svg b/3.25.11-scylla/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/3.25.11-scylla/_static/img/icons/icon-users-blog.svg b/3.25.11-scylla/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/3.25.11-scylla/_static/img/icons/icon-warning.svg b/3.25.11-scylla/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/icons/icon-webinars.svg b/3.25.11-scylla/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/3.25.11-scylla/_static/img/icons/icon-whitepapers.svg b/3.25.11-scylla/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/3.25.11-scylla/_static/img/icons/icon-workshop.svg b/3.25.11-scylla/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/3.25.11-scylla/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/3.25.11-scylla/_static/img/logo-docs.svg b/3.25.11-scylla/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/3.25.11-scylla/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/logo-scylla-horizontal-RGB.svg b/3.25.11-scylla/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/3.25.11-scylla/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.25.11-scylla/_static/img/mascots/404.jpg b/3.25.11-scylla/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/404.jpg differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-3monsters.png b/3.25.11-scylla/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-3monsters.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-advisor-crystal.png b/3.25.11-scylla/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-alternator.svg b/3.25.11-scylla/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/3.25.11-scylla/_static/img/mascots/scylla-cloud.svg b/3.25.11-scylla/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/3.25.11-scylla/_static/img/mascots/scylla-computer-3-monsters.png b/3.25.11-scylla/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-computer-headset.png b/3.25.11-scylla/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-computer-headset.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-cup-number-one.png b/3.25.11-scylla/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-docs.svg b/3.25.11-scylla/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/3.25.11-scylla/_static/img/mascots/scylla-drivers.svg b/3.25.11-scylla/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/3.25.11-scylla/_static/img/mascots/scylla-enterprise.svg b/3.25.11-scylla/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/3.25.11-scylla/_static/img/mascots/scylla-forklift-boxes.png b/3.25.11-scylla/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-forklift-migration.png b/3.25.11-scylla/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-gear.png b/3.25.11-scylla/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-gear.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-hardhat.png b/3.25.11-scylla/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-hardhat.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-headband.png b/3.25.11-scylla/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-headband.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-headset.png b/3.25.11-scylla/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-headset.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-hearts.png b/3.25.11-scylla/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-hearts.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-looking-down.png b/3.25.11-scylla/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-looking-down.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-looking-up.png b/3.25.11-scylla/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-looking-up.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png b/3.25.11-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-magnifying-glass.png b/3.25.11-scylla/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-manager.svg b/3.25.11-scylla/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/3.25.11-scylla/_static/img/mascots/scylla-monitor.svg b/3.25.11-scylla/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/3.25.11-scylla/_static/img/mascots/scylla-movement-fast.png b/3.25.11-scylla/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-movement-fast.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-movement.png b/3.25.11-scylla/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-movement.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-onpremise.png b/3.25.11-scylla/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-onpremise.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-opensource.svg b/3.25.11-scylla/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/3.25.11-scylla/_static/img/mascots/scylla-operator.svg b/3.25.11-scylla/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/3.25.11-scylla/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/3.25.11-scylla/_static/img/mascots/scylla-plugin.png b/3.25.11-scylla/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-plugin.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-release-mascot.png b/3.25.11-scylla/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-release-mascot.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-repair.png b/3.25.11-scylla/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-repair.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-server.png b/3.25.11-scylla/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-server.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-sleeping.png b/3.25.11-scylla/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-sleeping.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-tall-measure.png b/3.25.11-scylla/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-tall-measure.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-university.png b/3.25.11-scylla/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-university.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-weights.png b/3.25.11-scylla/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-weights.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-window-cleaning.png b/3.25.11-scylla/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-with-computer-2.png b/3.25.11-scylla/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-with-computer.png b/3.25.11-scylla/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-with-computer.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-with-linux.png b/3.25.11-scylla/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-with-linux.png differ diff --git a/3.25.11-scylla/_static/img/mascots/scylla-writting.png b/3.25.11-scylla/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/3.25.11-scylla/_static/img/mascots/scylla-writting.png differ diff --git a/3.25.11-scylla/_static/img/menu.svg b/3.25.11-scylla/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/3.25.11-scylla/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.11-scylla/_static/js/main.bundle.js b/3.25.11-scylla/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/3.25.11-scylla/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
        • Back
        • ',backButtonPosition:"top",wrapper:"
          ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
            "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
            ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
            ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
            ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
            ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
            "],col:[2,"","
            "],tr:[2,"","
            "],td:[3,"","
            "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra - Exceptions and Enums

            +
            +
            +cassandra.__version_info__
            +

            The version of the driver in a tuple format

            +
            + +
            +
            +cassandra.__version__
            +

            The version of the driver in a string format

            +
            + +
            +
            +class cassandra.ConsistencyLevel
            +

            Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

            +
            +
            +ANY = 0
            +

            Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

            +
            + +
            +
            +ONE = 1
            +

            Only one replica needs to respond to consider the operation a success

            +
            + +
            +
            +TWO = 2
            +

            Two replicas must respond to consider the operation a success

            +
            + +
            +
            +THREE = 3
            +

            Three replicas must respond to consider the operation a success

            +
            + +
            +
            +QUORUM = 4
            +

            ceil(RF/2) + 1 replicas must respond to consider the operation a success

            +
            + +
            +
            +ALL = 5
            +

            All replicas must respond to consider the operation a success

            +
            + +
            +
            +LOCAL_QUORUM = 6
            +

            Requires a quorum of replicas in the local datacenter

            +
            + +
            +
            +EACH_QUORUM = 7
            +

            Requires a quorum of replicas in each datacenter

            +
            + +
            +
            +SERIAL = 8
            +

            For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

            +
            + +
            +
            +LOCAL_SERIAL = 9
            +

            Like SERIAL, but only requires consensus +among replicas in the local datacenter.

            +
            + +
            +
            +LOCAL_ONE = 10
            +

            Sends a request only to replicas in the local datacenter and waits for +one response.

            +
            + +
            + +
            +
            +class cassandra.ProtocolVersion
            +

            Defines native protocol versions supported by this driver.

            +
            +
            +V1 = 1
            +

            v1, supported in Cassandra 1.2–>2.2

            +
            + +
            +
            +V2 = 2
            +

            v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

            +
            + +
            +
            +V3 = 3
            +

            v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

            +
            + +
            +
            +V4 = 4
            +

            v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

            +
            + +
            +
            +V5 = 5
            +

            v5, in beta from 3.x+. Finalised in 4.0-beta5

            +
            + +
            +
            +V6 = 6
            +

            v6, in beta from 4.0-beta5

            +
            + +
            +
            +DSE_V1 = 65
            +

            DSE private protocol v1, supported in DSE 5.1+

            +
            + +
            +
            +DSE_V2 = 66
            +

            DSE private protocol v2, supported in DSE 6.0+

            +
            + +
            +
            +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
            +

            A tuple of all supported protocol versions

            +
            + +
            +
            +BETA_VERSIONS = (6,)
            +

            A tuple of all beta protocol versions

            +
            + +
            +
            +MIN_SUPPORTED = 1
            +

            Minimum protocol version supported by this driver.

            +
            + +
            +
            +MAX_SUPPORTED = 66
            +

            Maximum protocol version supported by this driver.

            +
            + +
            +
            +classmethod get_lower_supported(previous_version)
            +

            Return the lower supported protocol version. Beta versions are omitted.

            +
            + +
            + +
            +
            +class cassandra.UserFunctionDescriptor(name, argument_types)
            +

            Describes a User function by name and argument signature

            +
            +
            +name = None
            +

            name of the function

            +
            + +
            +
            +argument_types = None
            +

            Ordered list of CQL argument type names comprising the type signature

            +
            + +
            +
            +property signature
            +

            function signature string in the form ‘name([type0[,type1[…]]])’

            +

            can be used to uniquely identify overloaded function names within a keyspace

            +
            + +
            + +
            +
            +class cassandra.UserAggregateDescriptor(name, argument_types)
            +

            Describes a User aggregate function by name and argument signature

            +
            +
            +name = None
            +

            name of the aggregate

            +
            + +
            +
            +argument_types = None
            +

            Ordered list of CQL argument type names comprising the type signature

            +
            + +
            +
            +property signature
            +

            function signature string in the form ‘name([type0[,type1[…]]])’

            +

            can be used to uniquely identify overloaded function names within a keyspace

            +
            + +
            + +
            +
            +exception cassandra.DriverException
            +

            Base for all exceptions explicitly raised by the driver.

            +
            + +
            +
            +exception cassandra.RequestExecutionException
            +

            Base for request execution exceptions returned from the server.

            +
            + +
            +
            +exception cassandra.Unavailable
            +

            There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

            +
            +
            +consistency = None
            +

            The requested ConsistencyLevel

            +
            + +
            +
            +required_replicas = None
            +

            The number of replicas that needed to be live to complete the operation

            +
            + +
            +
            +alive_replicas = None
            +

            The number of replicas that were actually alive

            +
            + +
            + +
            +
            +exception cassandra.Timeout
            +

            Replicas failed to respond to the coordinator node before timing out.

            +
            +
            +consistency = None
            +

            The requested ConsistencyLevel

            +
            + +
            +
            +required_responses = None
            +

            The number of required replica responses

            +
            + +
            +
            +received_responses = None
            +

            The number of replicas that responded before the coordinator timed out +the operation

            +
            + +
            + +
            +
            +exception cassandra.ReadTimeout
            +

            A subclass of Timeout for read operations.

            +

            This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

            +
            +
            +data_retrieved = None
            +

            A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

            +
            + +
            + +
            +
            +exception cassandra.WriteTimeout
            +

            A subclass of Timeout for write operations.

            +

            This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

            +
            +
            +write_type = None
            +

            The type of write operation, enum on WriteType

            +
            + +
            + +
            +
            +exception cassandra.CoordinationFailure
            +

            Replicas sent a failure to the coordinator.

            +
            +
            +consistency = None
            +

            The requested ConsistencyLevel

            +
            + +
            +
            +required_responses = None
            +

            The number of required replica responses

            +
            + +
            +
            +received_responses = None
            +

            The number of replicas that responded before the coordinator timed out +the operation

            +
            + +
            +
            +failures = None
            +

            The number of replicas that sent a failure message

            +
            + +
            +
            +error_code_map = None
            +

            A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

            +
            + +
            + +
            +
            +exception cassandra.ReadFailure
            +

            A subclass of CoordinationFailure for read operations.

            +

            This indicates that the replicas sent a failure message to the coordinator.

            +
            +
            +data_retrieved = None
            +

            A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

            +
            + +
            + +
            +
            +exception cassandra.WriteFailure
            +

            A subclass of CoordinationFailure for write operations.

            +

            This indicates that the replicas sent a failure message to the coordinator.

            +
            +
            +write_type = None
            +

            The type of write operation, enum on WriteType

            +
            + +
            + +
            +
            +exception cassandra.FunctionFailure
            +

            User Defined Function failed during execution

            +
            +
            +keyspace = None
            +

            Keyspace of the function

            +
            + +
            +
            +function = None
            +

            Name of the function

            +
            + +
            +
            +arg_types = None
            +

            List of argument type names of the function

            +
            + +
            + +
            +
            +exception cassandra.RequestValidationException
            +

            Server request validation failed

            +
            + +
            +
            +exception cassandra.ConfigurationException
            +

            Server indicated request errro due to current configuration

            +
            + +
            +
            +exception cassandra.AlreadyExists
            +

            An attempt was made to create a keyspace or table that already exists.

            +
            +
            +keyspace = None
            +

            The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

            +
            + +
            +
            +table = None
            +

            The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

            +
            + +
            + +
            +
            +exception cassandra.InvalidRequest
            +

            A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

            +
            + +
            +
            +exception cassandra.Unauthorized
            +

            The current user is not authorized to perform the requested operation.

            +
            + +
            +
            +exception cassandra.AuthenticationFailed
            +

            Failed to authenticate.

            +
            + +
            +
            +exception cassandra.OperationTimedOut
            +

            The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

            +
            +
            +errors = None
            +

            A dict of errors keyed by the Host against which they occurred.

            +
            + +
            +
            +last_host = None
            +

            The last Host this operation was attempted against.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/auth.html b/3.25.11-scylla/api/cassandra/auth.html new file mode 100644 index 0000000000..ee31f782d6 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/auth.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.auth - Authentication

            +
            +
            +class cassandra.auth.AuthProvider
            +

            An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

            +
            +

            New in version 2.0.0.

            +
            +
            +
            +new_authenticator(host)
            +

            Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

            +
            + +
            + +
            +
            +class cassandra.auth.Authenticator
            +

            An abstract class that handles SASL authentication with Cassandra servers.

            +

            Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

            +

            1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

            +

            2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

            +

            3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

            +

            The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

            +
            +

            New in version 2.0.0.

            +
            +
            +
            +server_authenticator_class = None
            +

            Set during the connection AUTHENTICATE phase

            +
            + +
            +
            +initial_response()
            +

            Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

            +
            + +
            +
            +evaluate_challenge(challenge)
            +

            Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

            +
            + +
            +
            +on_authentication_success(token)
            +

            Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

            +
            + +
            + +
            +
            +class cassandra.auth.PlainTextAuthProvider(username, password)
            +

            An AuthProvider that works with Cassandra’s PasswordAuthenticator.

            +

            Example usage:

            +
            from cassandra.cluster import Cluster
            +from cassandra.auth import PlainTextAuthProvider
            +
            +auth_provider = PlainTextAuthProvider(
            +        username='cassandra', password='cassandra')
            +cluster = Cluster(auth_provider=auth_provider)
            +
            +
            +
            +

            New in version 2.0.0.

            +
            +
            +
            +new_authenticator(host)
            +

            Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

            +
            + +
            + +
            +
            +class cassandra.auth.PlainTextAuthenticator(username, password)
            +
            +
            +evaluate_challenge(challenge)
            +

            Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

            +
            + +
            + +
            +
            +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
            +

            An AuthProvider supporting general SASL auth mechanisms

            +

            Suitable for GSSAPI or other SASL mechanisms

            +

            Example usage:

            +
            from cassandra.cluster import Cluster
            +from cassandra.auth import SaslAuthProvider
            +
            +sasl_kwargs = {'service': 'something',
            +               'mechanism': 'GSSAPI',
            +               'qops': 'auth'.split(',')}
            +auth_provider = SaslAuthProvider(**sasl_kwargs)
            +cluster = Cluster(auth_provider=auth_provider)
            +
            +
            +
            +

            New in version 2.1.4.

            +
            +
            +
            +new_authenticator(host)
            +

            Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

            +
            + +
            + +
            +
            +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
            +

            A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

            +
            +

            New in version 2.1.4.

            +
            +
            +
            +initial_response()
            +

            Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

            +
            + +
            +
            +evaluate_challenge(challenge)
            +

            Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cluster.html b/3.25.11-scylla/api/cassandra/cluster.html new file mode 100644 index 0000000000..cdd8c06508 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cluster.html @@ -0,0 +1,1904 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cluster - Clusters and Sessions

            +
            +
            +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
            +

            The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

            +

            Example usage:

            +
            >>> from cassandra.cluster import Cluster
            +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
            +>>> session = cluster.connect()
            +>>> session.execute("CREATE KEYSPACE ...")
            +>>> ...
            +>>> cluster.shutdown()
            +
            +
            +

            Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

            +

            executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

            +

            Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

            +
            +
            +contact_points = ['127.0.0.1']
            +
            + +
            +
            +port = 9042
            +
            + +
            +
            +cql_version = None
            +
            + +
            +
            +protocol_version = 66
            +
            + +
            +
            +compression = True
            +
            + +
            +
            +auth_provider
            +

            When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

            +

            When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

            +

            When not using authentication, this should be left as None.

            +
            + +
            +
            +load_balancing_policy
            +

            An instance of policies.LoadBalancingPolicy or +one of its subclasses.

            +
            +

            Changed in version 2.6.0.

            +
            +

            Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

            +

            Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

            +
            + +
            +
            +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
            +
            + +
            +
            +default_retry_policy = <cassandra.policies.RetryPolicy object>
            +

            A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

            +
            + +
            +
            +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
            +
            + +
            +
            +address_translator = <cassandra.policies.IdentityTranslator object>
            +
            + +
            +
            +metrics_enabled = False
            +
            + +
            +
            +metrics = None
            +
            + +
            +
            +ssl_context = None
            +
            + +
            +
            +ssl_options = None
            +
            + +
            +
            +sockopts = None
            +
            + +
            +
            +max_schema_agreement_wait = 10
            +
            + +
            +
            +metadata = None
            +
            + +
            +
            +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
            +
            + +
            +
            +control_connection_timeout = 2.0
            +
            + +
            +
            +idle_heartbeat_interval = 30
            +
            + +
            +
            +idle_heartbeat_timeout = 30
            +
            + +
            +
            +schema_event_refresh_window = 2
            +
            + +
            +
            +topology_event_refresh_window = 10
            +
            + +
            +
            +status_event_refresh_window = 2
            +
            + +
            +
            +prepare_on_all_hosts = True
            +
            + +
            +
            +reprepare_on_up = True
            +
            + +
            +
            +connect_timeout = 5
            +
            + +
            +
            +schema_metadata_enabled = True
            +

            Flag indicating whether internal schema metadata is updated.

            +

            When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

            +
            + +
            +
            +token_metadata_enabled = True
            +

            Flag indicating whether internal token metadata is updated.

            +

            When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

            +
            + +
            +
            +timestamp_generator = None
            +
            + +
            +
            +endpoint_factory = None
            +
            + +
            +
            +cloud = None
            +
            + +
            +
            +connect(keyspace=None, wait_for_all_pools=False)
            +

            Creates and returns a new Session object.

            +

            If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

            +

            wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

            +
            + +
            +
            +shutdown()
            +

            Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

            +

            Once shutdown, a Cluster should not be used for any purpose.

            +
            + +
            +
            +register_user_type(keyspace, user_type, klass)
            +

            Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

            +

            keyspace is the name of the keyspace that the UDT is defined in.

            +

            user_type is the string name of the UDT to register the mapping +for.

            +

            klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

            +

            This method should only be called after the type has been created +within Cassandra.

            +

            Example:

            +
            cluster = Cluster(protocol_version=3)
            +session = cluster.connect()
            +session.set_keyspace('mykeyspace')
            +session.execute("CREATE TYPE address (street text, zipcode int)")
            +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
            +
            +# create a class to map to the "address" UDT
            +class Address(object):
            +
            +    def __init__(self, street, zipcode):
            +        self.street = street
            +        self.zipcode = zipcode
            +
            +cluster.register_user_type('mykeyspace', 'address', Address)
            +
            +# insert a row using an instance of Address
            +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
            +                (0, Address("123 Main St.", 78723)))
            +
            +# results will include Address instances
            +results = session.execute("SELECT * FROM users")
            +row = results[0]
            +print row.id, row.location.street, row.location.zipcode
            +
            +
            +
            + +
            +
            +register_listener(listener)
            +

            Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

            +
            + +
            +
            +unregister_listener(listener)
            +

            Removes a registered listener.

            +
            + +
            +
            +add_execution_profile(name, profile, pool_wait_timeout=5)
            +

            Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

            +

            Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

            +

            Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

            +
            + +
            +
            +set_max_requests_per_connection(host_distance, max_requests)
            +

            Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

            +

            Pertains to connection pool management in protocol versions {1,2}.

            +
            + +
            +
            +get_max_requests_per_connection(host_distance)
            +
            + +
            +
            +set_min_requests_per_connection(host_distance, min_requests)
            +

            Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

            +

            Pertains to connection pool management in protocol versions {1,2}.

            +
            + +
            +
            +get_min_requests_per_connection(host_distance)
            +
            + +
            +
            +get_core_connections_per_host(host_distance)
            +

            Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

            +

            This property is ignored if protocol_version is +3 or higher.

            +
            + +
            +
            +set_core_connections_per_host(host_distance, core_connections)
            +

            Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

            +

            Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

            +

            If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

            +
            + +
            +
            +get_max_connections_per_host(host_distance)
            +

            Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

            +

            This property is ignored if protocol_version is +3 or higher.

            +
            + +
            +
            +set_max_connections_per_host(host_distance, max_connections)
            +

            Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

            +

            If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

            +
            + +
            +
            +get_control_connection_host()
            +

            Returns the control connection host metadata.

            +
            + +
            +
            +refresh_schema_metadata(max_schema_agreement_wait=None)
            +

            Synchronously refresh all schema metadata.

            +

            By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

            +

            Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

            +

            Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

            +

            An Exception is raised if schema refresh fails for any reason.

            +
            + +
            +
            +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
            +

            Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

            +

            See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

            +
            + +
            +
            +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
            +

            Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

            +

            See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

            +
            + +
            +
            +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
            +

            Synchronously refresh user defined type metadata.

            +

            See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

            +
            + +
            +
            +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
            +

            Synchronously refresh user defined function metadata.

            +

            function is a cassandra.UserFunctionDescriptor.

            +

            See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

            +
            + +
            +
            +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
            +

            Synchronously refresh user defined aggregate metadata.

            +

            aggregate is a cassandra.UserAggregateDescriptor.

            +

            See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

            +
            + +
            +
            +refresh_nodes(force_token_rebuild=False)
            +

            Synchronously refresh the node list and token metadata

            +

            force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

            +

            An Exception is raised if node refresh fails for any reason.

            +
            + +
            +
            +set_meta_refresh_enabled(enabled)
            +

            Deprecated: set schema_metadata_enabled token_metadata_enabled instead

            +

            Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

            +

            Disabling this is useful to minimize refreshes during multiple changes.

            +

            Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

            +
            + +
            + +
            +
            +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
            +
            +
            +consistency_level = LOCAL_ONE
            +
            + +
            +
            +static row_factory(colnames, rows)
            +

            Returns each row as a namedtuple. +This is the default row factory.

            +

            Example:

            +
            >>> from cassandra.query import named_tuple_factory
            +>>> session = cluster.connect('mykeyspace')
            +>>> session.row_factory = named_tuple_factory
            +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
            +>>> user = rows[0]
            +
            +>>> # you can access field by their name:
            +>>> print "name: %s, age: %d" % (user.name, user.age)
            +name: Bob, age: 42
            +
            +>>> # or you can access fields by their position (like a tuple)
            +>>> name, age = user
            +>>> print "name: %s, age: %d" % (name, age)
            +name: Bob, age: 42
            +>>> name = user[0]
            +>>> age = user[1]
            +>>> print "name: %s, age: %d" % (name, age)
            +name: Bob, age: 42
            +
            +
            +
            +

            Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

            +
            +
            + +
            + +
            +
            +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
            +

            Default execution profile for graph execution.

            +

            See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

            +

            In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

            +
            + +
            +
            +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
            +

            Execution profile with timeout and load balancing appropriate for graph analytics queries.

            +

            See also GraphExecutionPolicy.

            +

            In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

            +

            Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

            +
            + +
            +
            +cassandra.cluster.EXEC_PROFILE_DEFAULT
            +

            The base class of the class hierarchy.

            +

            When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

            +
            + +
            +
            +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
            +

            The base class of the class hierarchy.

            +

            When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

            +
            + +
            +
            +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
            +

            The base class of the class hierarchy.

            +

            When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

            +
            + +
            +
            +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
            +

            The base class of the class hierarchy.

            +

            When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

            +
            + +
            +
            +class cassandra.cluster.Session
            +

            A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

            +

            Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

            +

            Example usage:

            +
            >>> session = cluster.connect()
            +>>> session.set_keyspace("mykeyspace")
            +>>> session.execute("SELECT * FROM mycf")
            +
            +
            +
            +
            +default_timeout = 10.0
            +

            A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

            +

            Setting this to None will cause no timeouts to be set by default.

            +

            Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

            +
            +

            New in version 2.0.0.

            +
            +
            + +
            +
            +default_consistency_level = LOCAL_ONE
            +

            Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

            +
            +

            New in version 1.2.0.

            +
            +
            +

            Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

            +
            +
            + +
            +
            +default_serial_consistency_level = None
            +

            The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

            +

            Only valid for protocol_version >= 2.

            +
            + +
            +
            +row_factory = <function named_tuple_factory>
            +

            The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

            + +
            + +
            +
            +default_fetch_size = 5000
            +
            + +
            +
            +use_client_timestamp = True
            +
            + +
            +
            +timestamp_generator = None
            +
            + +
            +
            +encoder = None
            +
            + +
            +
            +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
            +
            + +
            +
            +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
            +

            Execute the given query and synchronously wait for the response.

            +

            If an error is encountered while executing the query, an Exception +will be raised.

            +

            query may be a query string or an instance of cassandra.query.Statement.

            +

            parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

            +

            timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

            +

            If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

            +

            custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

            +

            execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

            +

            paging_state is an optional paging state, reused from a previous ResultSet.

            +

            host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

            +

            execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

            +
            + +
            +
            +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
            +

            Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

            +

            See Session.execute() for parameter definitions.

            +

            Example usage:

            +
            >>> session = cluster.connect()
            +>>> future = session.execute_async("SELECT * FROM mycf")
            +
            +>>> def log_results(results):
            +...     for row in results:
            +...         log.info("Results: %s", row)
            +
            +>>> def log_error(exc):
            +>>>     log.error("Operation failed: %s", exc)
            +
            +>>> future.add_callbacks(log_results, log_error)
            +
            +
            +

            Async execution with blocking wait for results:

            +
            >>> future = session.execute_async("SELECT * FROM mycf")
            +>>> # do other stuff...
            +
            +>>> try:
            +...     results = future.result()
            +... except Exception:
            +...     log.exception("Operation failed:")
            +
            +
            +
            + +
            +
            +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
            +

            Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

            +

            parameters is dict of named parameters to bind. The values must be +JSON-serializable.

            +

            execution_profile: Selects an execution profile for the request.

            +

            execute_as the user that will be used on the server to execute the request.

            +
            + +
            +
            +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
            +

            Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

            +
            + +
            +
            +prepare(statement)
            +

            Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

            +
            >>> session = cluster.connect("mykeyspace")
            +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
            +>>> prepared = session.prepare(query)
            +>>> session.execute(prepared, (user.id, user.name, user.age))
            +
            +
            +

            Or you may bind values to the prepared statement ahead of time:

            +
            >>> prepared = session.prepare(query)
            +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
            +>>> session.execute(bound_stmt)
            +
            +
            +

            Of course, prepared statements may (and should) be reused:

            +
            >>> prepared = session.prepare(query)
            +>>> for user in users:
            +...     bound = prepared.bind((user.id, user.name, user.age))
            +...     session.execute(bound)
            +
            +
            +

            Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

            +
            >>> analyticskeyspace_prepared = session.prepare(
            +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
            +...     keyspace="analyticskeyspace")  # note the different keyspace
            +
            +
            +

            Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

            +

            custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

            +
            + +
            +
            +shutdown()
            +

            Close all connections. Session instances should not be used +for any purpose after being shutdown.

            +
            + +
            +
            +set_keyspace(keyspace)
            +

            Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

            +
            + +
            +
            +get_execution_profile(name)
            +

            Returns the execution profile associated with the provided name.

            +
            +
            Parameters:
            +

            name – The name (or key) of the execution profile.

            +
            +
            +
            + +
            +
            +execution_profile_clone_update(ep, **kwargs)
            +

            Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

            +

            This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

            +
            + +
            +
            +add_request_init_listener(fn, *args, **kwargs)
            +

            Adds a callback with arguments to be called when any request is created.

            +

            It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

            +

            response_future is the ResponseFuture for the request.

            +

            Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

            +

            See this example in the +source tree for an example.

            +
            + +
            +
            +remove_request_init_listener(fn, *args, **kwargs)
            +

            Removes a callback and arguments from the list.

            +

            See Session.add_request_init_listener().

            +
            + +
            + +
            +
            +class cassandra.cluster.ResponseFuture
            +

            An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

            +
            +
            There are two ways for results to be delivered:
            +
            +
            +
            +
            +query = None
            +
            + +
            +
            +result()
            +

            Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

            +

            Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

            +

            Example usage:

            +
            >>> future = session.execute_async("SELECT * FROM mycf")
            +>>> # do other stuff...
            +
            +>>> try:
            +...     rows = future.result()
            +...     for row in rows:
            +...         ... # process results
            +... except Exception:
            +...     log.exception("Operation failed:")
            +
            +
            +
            + +
            +
            +get_query_trace()
            +

            Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

            +

            Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

            +

            If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

            +

            query_cl is the consistency level used to poll the trace tables.

            +
            + +
            +
            +get_all_query_traces()
            +

            Fetches and returns the query traces for all query pages, if tracing was enabled.

            +

            See note in get_query_trace() regarding possible exceptions.

            +
            + +
            +
            +custom_payload
            +

            The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

            +

            Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

            +
            +
            Returns:
            +

            Custom Payloads.

            +
            +
            +
            + +
            +
            +is_schema_agreed = True
            +
            + +
            +
            +has_more_pages
            +

            Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

            +
            +

            New in version 2.0.0.

            +
            +
            + +
            +
            +warnings
            +

            Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

            +

            Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

            +

            Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

            +
            + +
            +
            +start_fetching_next_page()
            +

            If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

            +

            This should only be called after the first page has been returned.

            +
            +

            New in version 2.0.0.

            +
            +
            + +
            +
            +add_callback(fn, *args, **kwargs)
            +

            Attaches a callback function to be called when the final results arrive.

            +

            By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

            +

            If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

            +

            If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

            +

            Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

            +

            Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

            +

            Usage example:

            +
            >>> session = cluster.connect("mykeyspace")
            +
            +>>> def handle_results(rows, start_time, should_log=False):
            +...     if should_log:
            +...         log.info("Total time: %f", time.time() - start_time)
            +...     ...
            +
            +>>> future = session.execute_async("SELECT * FROM users")
            +>>> future.add_callback(handle_results, time.time(), should_log=True)
            +
            +
            +
            + +
            +
            +add_errback(fn, *args, **kwargs)
            +

            Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

            +
            + +
            +
            +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None)
            +

            A convenient combination of add_callback() and +add_errback().

            +

            Example usage:

            +
            >>> session = cluster.connect()
            +>>> query = "SELECT * FROM mycf"
            +>>> future = session.execute_async(query)
            +
            +>>> def log_results(results, level='debug'):
            +...     for row in results:
            +...         log.log(level, "Result: %s", row)
            +
            +>>> def log_error(exc, query):
            +...     log.error("Query '%s' failed: %s", query, exc)
            +
            +>>> future.add_callbacks(
            +...     callback=log_results, callback_kwargs={'level': 'info'},
            +...     errback=log_error, errback_args=(query,))
            +
            +
            +
            + +
            + +
            +
            +class cassandra.cluster.ResultSet
            +

            An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

            +

            You can treat this as a normal iterator over rows:

            +
            >>> from cassandra.query import SimpleStatement
            +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
            +>>> for user_row in session.execute(statement):
            +...     process_user(user_row)
            +
            +
            +

            Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

            +
            +
            +all()
            +

            Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

            +

            This function is not recommended for queries that return a large number of elements.

            +
            + +
            +
            +property current_rows
            +

            The list of current page rows. May be empty if the result was empty, +or this is the last page.

            +
            + +
            +
            +fetch_next_page()
            +

            Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

            +
            + +
            +
            +get_all_query_traces(max_wait_sec_per=None)
            +

            Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

            +
            + +
            +
            +get_query_trace(max_wait_sec=None)
            +

            Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

            +
            + +
            +
            +property has_more_pages
            +

            True if the last response indicated more pages; False otherwise

            +
            + +
            +
            +one()
            +

            Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

            +
            + +
            +
            +property paging_state
            +

            Server paging state of the query. Can be None if the query was not paged.

            +

            The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

            +
            + +
            +
            +property was_applied
            +

            For LWT results, returns whether the transaction was applied.

            +

            Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

            +

            Only valid when one of the of the internal row factories is in use.

            +
            + +
            + +
            +
            +exception cassandra.cluster.QueryExhausted
            +

            Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

            +
            +

            New in version 2.0.0.

            +
            +
            + +
            +
            +exception cassandra.cluster.NoHostAvailable
            +

            Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

            +
            + +
            +
            +exception cassandra.cluster.UserTypeDoesNotExist
            +

            An attempt was made to use a user-defined type that does not exist.

            +
            +

            New in version 2.1.0.

            +
            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/concurrent.html b/3.25.11-scylla/api/cassandra/concurrent.html new file mode 100644 index 0000000000..45749fc768 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/concurrent.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.concurrent - Utilities for Concurrent Statement Execution

            +
            +
            +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
            +

            Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

            +

            The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

            +

            If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

            +

            results_generator controls how the results are returned.

            +
              +
            • If False, the results are returned only after all requests have completed.

            • +
            • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

            • +
            +

            execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

            +

            A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

            +

            Example usage:

            +
            select_statement = session.prepare("SELECT * FROM users WHERE id=?")
            +
            +statements_and_params = []
            +for user_id in user_ids:
            +    params = (user_id, )
            +    statements_and_params.append((select_statement, params))
            +
            +results = execute_concurrent(
            +    session, statements_and_params, raise_on_first_error=False)
            +
            +for (success, result) in results:
            +    if not success:
            +        handle_error(result)  # result will be an Exception
            +    else:
            +        process_user(result[0])  # result will be a list of rows
            +
            +
            +

            Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

            +
            + +
            +
            +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
            +

            Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

            +

            Example usage:

            +
            statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
            +parameters = [(x,) for x in range(1000)]
            +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
            +
            +
            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/connection.html b/3.25.11-scylla/api/cassandra/connection.html new file mode 100644 index 0000000000..2b4d7c1030 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/connection.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.connection - Low Level Connection Info

            +
            +
            +exception cassandra.connection.ConnectionException
            +

            An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

            +
            + +
            +
            +exception cassandra.connection.ConnectionShutdown
            +

            Raised when a connection has been marked as defunct or has been closed.

            +
            + +
            +
            +exception cassandra.connection.ConnectionBusy
            +

            An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

            +
            + +
            +
            +exception cassandra.connection.ProtocolError
            +

            Communication did not match the protocol that this driver expects.

            +
            + +
            +
            +class cassandra.connection.EndPoint
            +

            Represents the information to connect to a cassandra node.

            +
            +
            +property address
            +

            The IP address of the node. This is the RPC address the driver uses when connecting to the node

            +
            + +
            +
            +property port
            +

            The port of the node.

            +
            + +
            +
            +resolve()
            +

            Resolve the endpoint to an address/port. This is called +only on socket connection.

            +
            + +
            +
            +property socket_family
            +

            The socket family of the endpoint.

            +
            + +
            +
            +property ssl_options
            +

            SSL options specific to this endpoint.

            +
            + +
            + +
            +
            +class cassandra.connection.EndPointFactory
            +
            +
            +configure(cluster)
            +

            This is called by the cluster during its initialization.

            +
            + +
            +
            +create(row)
            +

            Create an EndPoint from a system.peers row.

            +
            + +
            + +
            +
            +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
            +

            SNI Proxy EndPoint implementation.

            +
            + +
            +
            +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
            +
            + +
            +
            +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
            +

            Unix Socket EndPoint implementation.

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cqlengine/columns.html b/3.25.11-scylla/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..33b6ff55d2 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cqlengine/columns.html @@ -0,0 +1,984 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cqlengine.columns - Column types for object mapping models

            +
            +

            Columns

            +

            Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

            +

            Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

            +

            Each column on your model definitions needs to be an instance of a Column class.

            +
            +
            +class cassandra.cqlengine.columns.Column(**kwargs)
            +
            +
            +primary_key = False
            +

            bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

            +
            + +
            +
            +partition_key = False
            +

            indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

            +
            + +
            +
            +index = False
            +

            bool flag, indicates an index should be created for this column

            +
            + +
            +
            +custom_index = False
            +

            bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

            +
            + +
            +
            +db_field = None
            +

            the fieldname this field will map to in the database

            +
            + +
            +
            +default = None
            +

            the default value, can be a value or a callable (no args)

            +
            + +
            +
            +required = False
            +

            boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

            +
            + +
            +
            +clustering_order = None
            +

            only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

            +
            + +
            +
            +discriminator_column = False
            +

            boolean, if set to True, this column will be used for discriminating records +of inherited models.

            +

            Should only be set on a column of an abstract model being used for inheritance.

            +

            There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

            +
            + +
            +
            +static = False
            +

            boolean, if set to True, this is a static column, with a single value per partition

            +
            + +
            + +
            +
            +

            Column Types

            +

            Columns of all types are initialized by passing Column attributes to the constructor by keyword.

            +
            +
            +class cassandra.cqlengine.columns.Ascii(**kwargs)
            +

            Stores a US-ASCII character string

            +
            +
            Parameters:
            +
              +
            • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

            • +
            • max_length (int) – Sets the maximum length of this string, for validation purposes.

            • +
            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.columns.BigInt(**kwargs)
            +

            Stores a 64-bit signed integer value

            +
            + +
            +
            +class cassandra.cqlengine.columns.Blob(**kwargs)
            +

            Stores a raw binary value

            +
            + +
            +
            +cassandra.cqlengine.columns.Bytes
            +

            alias of Blob

            +
            + +
            +
            +class cassandra.cqlengine.columns.Boolean(**kwargs)
            +

            Stores a boolean True or False value

            +
            + +
            +
            +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
            +

            Stores a counter that can be incremented and decremented

            +
            + +
            +
            +class cassandra.cqlengine.columns.Date(**kwargs)
            +

            Stores a simple date, with no time-of-day

            +
            +

            Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

            +
            +

            requires C* 2.2+ and protocol v4+

            +
            + +
            +
            +class cassandra.cqlengine.columns.DateTime(**kwargs)
            +

            Stores a datetime value

            +
            +
            +truncate_microseconds = False
            +

            Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

            +
            DateTime.truncate_microseconds = True
            +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
            +
            +
            +

            Defaults to False to preserve legacy behavior. May change in the future.

            +
            + +
            + +
            +
            +class cassandra.cqlengine.columns.Decimal(**kwargs)
            +

            Stores a variable precision decimal value

            +
            + +
            +
            +class cassandra.cqlengine.columns.Double(**kwargs)
            +

            Stores a double-precision floating-point value

            +
            + +
            +
            +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
            +

            Stores a single-precision floating-point value

            +
            + +
            +
            +class cassandra.cqlengine.columns.Integer(**kwargs)
            +

            Stores a 32-bit signed integer value

            +
            + +
            +
            +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
            +

            Stores a list of ordered values

            +

            http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

            +
            +
            Parameters:
            +

            value_type – a column class indicating the types of the value

            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
            +

            Stores a key -> value map (dictionary)

            +

            https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

            +
            +
            Parameters:
            +
              +
            • key_type – a column class indicating the types of the key

            • +
            • value_type – a column class indicating the types of the value

            • +
            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
            +

            Stores a set of unordered, unique values

            +

            http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

            +
            +
            Parameters:
            +
              +
            • value_type – a column class indicating the types of the value

            • +
            • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

            • +
            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.columns.SmallInt(**kwargs)
            +

            Stores a 16-bit signed integer value

            +
            +

            New in version 2.6.0.

            +
            +

            requires C* 2.2+ and protocol v4+

            +
            + +
            +
            +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
            +

            Stores a UTF-8 encoded string

            +
            +
            Parameters:
            +
              +
            • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

            • +
            • max_length (int) – Sets the maximum length of this string, for validation purposes.

            • +
            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.columns.Time(**kwargs)
            +

            Stores a timezone-naive time-of-day, with nanosecond precision

            +
            +

            New in version 2.6.0.

            +
            +

            requires C* 2.2+ and protocol v4+

            +
            + +
            +
            +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
            +

            UUID containing timestamp

            +
            + +
            +
            +class cassandra.cqlengine.columns.TinyInt(**kwargs)
            +

            Stores an 8-bit signed integer value

            +
            +

            New in version 2.6.0.

            +
            +

            requires C* 2.2+ and protocol v4+

            +
            + +
            +
            +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
            +

            User Defined Type column

            +

            http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

            +

            These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

            +

            Please see User Defined Types for examples and discussion.

            +
            +
            Parameters:
            +

            user_type (type) – specifies the UserType model of the column

            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.columns.UUID(**kwargs)
            +

            Stores a type 1 or 4 UUID

            +
            + +
            +
            +class cassandra.cqlengine.columns.VarInt(**kwargs)
            +

            Stores an arbitrary-precision integer

            +
            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cqlengine/connection.html b/3.25.11-scylla/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..2c429efde1 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cqlengine/connection.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cqlengine.connection - Connection management for cqlengine

            +
            +
            +cassandra.cqlengine.connection.default()
            +

            Configures the default connection to localhost, using the driver defaults +(except for row_factory)

            +
            + +
            +
            +cassandra.cqlengine.connection.set_session(s)
            +

            Configures the default connection with a preexisting cassandra.cluster.Session

            +

            Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

            +
            + +
            +
            +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
            +

            Setup a the driver connection used by the mapper

            +
            +
            Parameters:
            +
              +
            • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

            • +
            • default_keyspace (str) – The default keyspace to use

            • +
            • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

            • +
            • lazy_connect (bool) – True if should not connect until first use

            • +
            • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

            • +
            • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

            • +
            +
            +
            +
            + +
            +
            +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
            +

            Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

            +
            +
            Parameters:
            +
              +
            • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

            • +
            • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

            • +
            • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

            • +
            • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

            • +
            • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

            • +
            • default (bool) – If True, set the new connection as the cqlengine +default

            • +
            • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

            • +
            +
            +
            +
            + +
            +
            +cassandra.cqlengine.connection.unregister_connection(name)
            +
            + +
            +
            +cassandra.cqlengine.connection.set_default_connection(name)
            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cqlengine/management.html b/3.25.11-scylla/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..2fe351f344 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cqlengine/management.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cqlengine.management - Schema management for cqlengine

            +

            A collection of functions for managing keyspace and table schema.

            +
            +
            +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
            +

            Creates a keyspace with SimpleStrategy for replica placement

            +

            If the keyspace already exists, it will not be modified.

            +

            This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

            +

            There are plans to guard schema-modifying functions with an environment-driven conditional.

            +
            +
            Parameters:
            +
              +
            • name (str) – name of keyspace to create

            • +
            • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

            • +
            • durable_writes (bool) – Write log is bypassed if set to False

            • +
            • connections (list) – List of connection names

            • +
            +
            +
            +
            + +
            +
            +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
            +

            Creates a keyspace with NetworkTopologyStrategy for replica placement

            +

            If the keyspace already exists, it will not be modified.

            +

            This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

            +

            There are plans to guard schema-modifying functions with an environment-driven conditional.

            +
            +
            Parameters:
            +
              +
            • name (str) – name of keyspace to create

            • +
            • dc_replication_map (dict) – map of dc_names: replication_factor

            • +
            • durable_writes (bool) – Write log is bypassed if set to False

            • +
            • connections (list) – List of connection names

            • +
            +
            +
            +
            + +
            +
            +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
            +

            Drops a keyspace, if it exists.

            +

            There are plans to guard schema-modifying functions with an environment-driven conditional.

            +

            This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

            +
            +
            Parameters:
            +
              +
            • name (str) – name of keyspace to drop

            • +
            • connections (list) – List of connection names

            • +
            +
            +
            +
            + +
            +
            +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
            +

            Inspects the model and creates / updates the corresponding table and columns.

            +

            If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

            +

            If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

            +

            Any User Defined Types used in the table are implicitly synchronized.

            +

            This function can only add fields that are not part of the primary key.

            +

            Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

            +

            This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

            +

            There are plans to guard schema-modifying functions with an environment-driven conditional.

            +
            + +
            +
            +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
            +

            Inspects the type_model and creates / updates the corresponding type.

            +

            Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

            +

            This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

            +

            There are plans to guard schema-modifying functions with an environment-driven conditional.

            +
            + +
            +
            +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
            +

            Drops the table indicated by the model, if it exists.

            +

            If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

            +

            If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

            +

            This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

            +

            There are plans to guard schema-modifying functions with an environment-driven conditional.

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cqlengine/models.html b/3.25.11-scylla/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..baf77f17c9 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cqlengine/models.html @@ -0,0 +1,964 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cqlengine.models - Table models for object mapping

            +
            +

            Model

            +
            +
            +class cassandra.cqlengine.models.Model(\*\*kwargs)
            +

            The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

            +
            class Person(Model):
            +    id = columns.UUID(primary_key=True)
            +    first_name  = columns.Text()
            +    last_name = columns.Text()
            +
            +person = Person(first_name='Blake', last_name='Eggleston')
            +person.first_name  #returns 'Blake'
            +person.last_name  #returns 'Eggleston'
            +
            +
            +

            Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

            +
            +
            +__abstract__ = False
            +

            Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

            +
            + +
            +
            +__table_name__ = None
            +

            Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

            +
            + +
            +
            +__table_name_case_sensitive__ = False
            +

            Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

            +
            + +
            +
            +__keyspace__ = None
            +

            Sets the name of the keyspace used by this model.

            +
            + +
            +
            +__connection__ = None
            +

            Sets the name of the default connection used by this model.

            +
            + +
            +
            +__default_ttl__ = None
            +

            Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

            +
            + +
            +
            +__discriminator_value__ = None
            +

            Optional Specifies a value for the discriminator column when using model inheritance.

            +

            See Model Inheritance for usage examples.

            +
            + +

            Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

            +

            When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

            +

            Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

            +

            See the list of supported table properties for more information.

            +
            +
            +__options__
            +

            For example:

            +
            class User(Model):
            +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
            +                                  'sstable_size_in_mb': '64',
            +                                  'tombstone_threshold': '.2'},
            +                   'comment': 'User data stored here'}
            +
            +    user_id = columns.UUID(primary_key=True)
            +    name = columns.Text()
            +
            +
            +

            or :

            +
            class TimeData(Model):
            +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
            +                                  'bucket_low': '.3',
            +                                  'bucket_high': '2',
            +                                  'min_threshold': '2',
            +                                  'max_threshold': '64',
            +                                  'tombstone_compaction_interval': '86400'},
            +                   'gc_grace_seconds': '0'}
            +
            +
            +
            + +
            +
            +__compute_routing_key__ = True
            +

            Optional Setting False disables computing the routing key for TokenAwareRouting

            +
            + +

            The base methods allow creating, storing, and querying modeled objects.

            +
            +
            +classmethod create(**kwargs)
            +

            Create an instance of this model in the database.

            +

            Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

            +

            Returns the instance.

            +
            + +
            +
            +if_not_exists()
            +

            Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

            +

            If the insertion isn’t applied, a LWTException is raised.

            +
            try:
            +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
            +except LWTException as e:
            +    # handle failure case
            +    print e.existing  # dict containing LWT result fields
            +
            +
            +

            This method is supported on Cassandra 2.0 or later.

            +
            + +
            +
            +if_exists()
            +

            Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

            +

            If the update or delete isn’t applied, a LWTException is raised.

            +
            try:
            +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
            +except LWTException as e:
            +    # handle failure case
            +    pass
            +
            +
            +

            This method is supported on Cassandra 2.0 or later.

            +
            + +
            +
            +save()
            +

            Saves an object to the database.

            +
            #create a person instance
            +person = Person(first_name='Kimberly', last_name='Eggleston')
            +#saves it to Cassandra
            +person.save()
            +
            +
            +
            + +
            +
            +update(**values)
            +

            Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

            +

            It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

            +
            + +
            +
            +iff(**values)
            +

            Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

            +

            If the insertion isn’t applied, a LWTException is raised.

            +
            t = TestTransactionModel(text='some text', count=5)
            +try:
            +     t.iff(count=5).update('other text')
            +except LWTException as e:
            +    # handle failure case
            +    print e.existing # existing object
            +
            +
            +
            + +
            +
            +classmethod get(*args, **kwargs)
            +

            Returns a single object based on the passed filter constraints.

            +

            This is a pass-through to the model objects().:method:~cqlengine.queries.get.

            +
            + +
            +
            +classmethod filter(*args, **kwargs)
            +

            Returns a queryset based on filter parameters.

            +

            This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

            +
            + +
            +
            +classmethod all()
            +

            Returns a queryset representing all stored objects

            +

            This is a pass-through to the model objects().all()

            +
            + +
            +
            +delete()
            +

            Deletes the object from the database

            +
            + +
            +
            +batch(batch_object)
            +

            Sets the batch object to run instance updates and inserts queries with.

            +

            See Batch Queries for usage examples

            +
            + +
            +
            +timeout(timeout)
            +

            Sets a timeout for use in save(), update(), and delete() +operations

            +
            + +
            +
            +timestamp(timedelta_or_datetime)
            +

            Sets the timestamp for the query

            +
            + +
            +
            +ttl(ttl_in_sec)
            +

            Sets the ttl values to run instance updates and inserts queries with.

            +
            + +
            +
            +using(connection=None)
            +

            Change the context on the fly of the model instance (keyspace, connection)

            +
            + +
            +
            +classmethod column_family_name(include_keyspace=True)
            +

            Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

            +
            + +

            Models also support dict-like access:

            +
            +
            +len(m)
            +

            Returns the number of columns defined in the model

            +
            + +
            +
            +m[col_name]()
            +

            Returns the value of column col_name

            +
            + +
            +
            +m[col_name] = value
            +

            Set m[col_name] to value

            +
            + +
            +
            +keys()
            +

            Returns a list of column IDs.

            +
            + +
            +
            +values()
            +

            Returns list of column values.

            +
            + +
            +
            +items()
            +

            Returns a list of column ID/value tuples.

            +
            + +
            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cqlengine/query.html b/3.25.11-scylla/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..0de7f412f1 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cqlengine/query.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cqlengine.query - Query and filter model objects

            +
            +

            QuerySet

            +

            QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

            +
            +
            +class cassandra.cqlengine.query.ModelQuerySet(model)
            +
            +
            +all()
            +

            Returns a queryset matching all rows

            +
            for user in User.objects().all():
            +    print(user)
            +
            +
            +
            + +
            +
            +batch(batch_obj)
            +

            Set a batch object to run the query on.

            +

            Note: running a select query with a batch object will raise an exception

            +
            + +
            +
            +consistency(consistency)
            +

            Sets the consistency level for the operation. See ConsistencyLevel.

            +
            for user in User.objects(id=3).consistency(CL.ONE):
            +    print(user)
            +
            +
            +
            + +
            +
            +count()
            +

            Returns the number of rows matched by this query.

            +

            Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

            +
            + +
            +
            +len(queryset)
            +

            Returns the number of rows matched by this query. This function uses count() internally.

            +

            Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

            +
            + +
            +
            +distinct(distinct_fields=None)
            +

            Returns the DISTINCT rows matched by this query.

            +

            distinct_fields default to the partition key fields if not specified.

            +

            Note: distinct_fields must be a partition key or a static column

            +
            class Automobile(Model):
            +    manufacturer = columns.Text(partition_key=True)
            +    year = columns.Integer(primary_key=True)
            +    model = columns.Text(primary_key=True)
            +    price = columns.Decimal()
            +
            +sync_table(Automobile)
            +
            +# create rows
            +
            +Automobile.objects.distinct()
            +
            +# or
            +
            +Automobile.objects.distinct(['manufacturer'])
            +
            +
            +
            + +
            +
            +filter(*args, **kwargs)
            +

            Adds WHERE arguments to the queryset, returning a new queryset

            +

            See Retrieving objects with filters

            +

            Returns a QuerySet filtered on the keyword arguments

            +
            + +
            +
            +get(*args, **kwargs)
            +

            Returns a single instance matching this query, optionally with additional filter kwargs.

            +

            See Retrieving objects with filters

            +

            Returns a single object matching the QuerySet.

            +
            user = User.get(id=1)
            +
            +
            +

            If no objects are matched, a DoesNotExist exception is raised.

            +

            If more than one object is found, a MultipleObjectsReturned exception is raised.

            +
            + +
            +
            +limit(v)
            +

            Limits the number of results returned by Cassandra. Use 0 or None to disable.

            +

            Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

            +
            # Fetch 100 users
            +for user in User.objects().limit(100):
            +    print(user)
            +
            +# Fetch all users
            +for user in User.objects().limit(None):
            +    print(user)
            +
            +
            +
            + +
            +
            +fetch_size(v)
            +

            Sets the number of rows that are fetched at a time.

            +

            Note that driver’s default fetch size is 5000.

            +
            for user in User.objects().fetch_size(500):
            +    print(user)
            +
            +
            +
            + +
            +
            +if_not_exists()
            +

            Check the existence of an object before insertion.

            +

            If the insertion isn’t applied, a LWTException is raised.

            +
            + +
            +
            +if_exists()
            +

            Check the existence of an object before an update or delete.

            +

            If the update or delete isn’t applied, a LWTException is raised.

            +
            + +
            +
            +order_by(*colnames)
            +

            Sets the column(s) to be used for ordering

            +

            Default order is ascending, prepend a ‘-’ to any column name for descending

            +

            Note: column names must be a clustering key

            +
            from uuid import uuid1,uuid4
            +
            +class Comment(Model):
            +    photo_id = UUID(primary_key=True)
            +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
            +    comment = Text()
            +
            +sync_table(Comment)
            +
            +u = uuid4()
            +for x in range(5):
            +    Comment.create(photo_id=u, comment="test %d" % x)
            +
            +print("Normal")
            +for comment in Comment.objects(photo_id=u):
            +    print comment.comment_id
            +
            +print("Reversed")
            +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
            +    print comment.comment_id
            +
            +
            +
            + +
            +
            +allow_filtering()
            +

            Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

            +
            + +
            +
            +only(fields)
            +

            Load only these fields for the returned query

            +
            + +
            +
            +defer(fields)
            +

            Don’t load these fields for the returned query

            +
            + +
            +
            +timestamp(timestamp)
            +

            Allows for custom timestamps to be saved with the record.

            +
            + +
            +
            +ttl(ttl)
            +

            Sets the ttl (in seconds) for modified data.

            +

            Note that running a select query with a ttl value will raise an exception

            +
            + +
            +
            +using(keyspace=None, connection=None)
            +

            Change the context on-the-fly of the Model class (keyspace, connection)

            +
            + +
            +
            +update(**values)
            +

            Performs an update on the row selected by the queryset. Include values to update in the +update like so:

            +
            Model.objects(key=n).update(value='x')
            +
            +
            +

            Passing in updates for columns which are not part of the model will raise a ValidationError.

            +

            Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

            +

            For example:

            +
            class User(Model):
            +    id = Integer(primary_key=True)
            +    name = Text()
            +
            +setup(["localhost"], "test")
            +sync_table(User)
            +
            +u = User.create(id=1, name="jon")
            +
            +User.objects(id=1).update(name="Steve")
            +
            +# sets name to null
            +User.objects(id=1).update(name=None)
            +
            +
            +

            Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

            +

            Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

            +

            Given the model below, here are the operations that can be performed on the different container columns:

            +
            class Row(Model):
            +    row_id      = columns.Integer(primary_key=True)
            +    set_column  = columns.Set(Integer)
            +    list_column = columns.List(Integer)
            +    map_column  = columns.Map(Integer, Integer)
            +
            +
            +

            Set

            +
              +
            • add: adds the elements of the given set to the column

            • +
            • remove: removes the elements of the given set to the column

            • +
            +
            # add elements to a set
            +Row.objects(row_id=5).update(set_column__add={6})
            +
            +# remove elements to a set
            +Row.objects(row_id=5).update(set_column__remove={4})
            +
            +
            +

            List

            +
              +
            • append: appends the elements of the given list to the end of the column

            • +
            • prepend: prepends the elements of the given list to the beginning of the column

            • +
            +
            # append items to a list
            +Row.objects(row_id=5).update(list_column__append=[6, 7])
            +
            +# prepend items to a list
            +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
            +
            +
            +

            Map

            +
              +
            • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

            • +
            +
            # add items to a map
            +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
            +
            +# remove items from a map
            +Row.objects(row_id=5).update(map_column__remove={1, 2})
            +
            +
            +
            + +
            + +
            +
            +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
            +

            Handles the batching of queries

            +

            http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

            +

            See Batch Queries for more details.

            +
            +
            Parameters:
            +
              +
            • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

            • +
            • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

            • +
            • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

            • +
            • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

            • +
            • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

            • +
            • connection (str) – Connection name to use for the batch execution

            • +
            +
            +
            +
            +
            +add_query(query)
            +
            + +
            +
            +execute()
            +
            + +
            +
            +add_callback(fn, *args, **kwargs)
            +

            Add a function and arguments to be passed to it to be executed after the batch executes.

            +

            A batch can support multiple callbacks.

            +

            Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

            +
            +
            Parameters:
            +
              +
            • fn (callable) – Callable object

            • +
            • *args – Positional arguments to be passed to the callback at the time of execution

            • +
            • **kwargs – Named arguments to be passed to the callback at the time of execution

            • +
            +
            +
            +
            + +
            + +
            +
            +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
            +

            A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

            +
            +
            Parameters:
            +
              +
            • *args – One or more models. A model should be a class type, not an instance.

            • +
            • **kwargs – (optional) Context parameters: can be keyspace or connection

            • +
            +
            +
            +

            For example:

            +
            with ContextQuery(Automobile, keyspace='test2') as A:
            +    A.objects.create(manufacturer='honda', year=2008, model='civic')
            +    print len(A.objects.all())  # 1 result
            +
            +with ContextQuery(Automobile, keyspace='test4') as A:
            +    print len(A.objects.all())  # 0 result
            +
            +# Multiple models
            +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
            +    print len(A.objects.all())
            +    print len(A2.objects.all())
            +
            +
            +
            + +
            +
            +class cassandra.cqlengine.query.DoesNotExist
            +
            + +
            +
            +class cassandra.cqlengine.query.MultipleObjectsReturned
            +
            + +
            +
            +class cassandra.cqlengine.query.LWTException(existing)
            +

            Lightweight conditional exception.

            +

            This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

            +
            +
            Parameters:
            +

            existing – The current state of the data which prevented the write.

            +
            +
            +
            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/cqlengine/usertype.html b/3.25.11-scylla/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..94fe6e560e --- /dev/null +++ b/3.25.11-scylla/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.cqlengine.usertype - Model classes for User Defined Types

            +
            +

            UserType

            +
            +
            +class cassandra.cqlengine.usertype.UserType(**values)
            +

            This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

            +
            # connect with default keyspace ...
            +
            +from cassandra.cqlengine.columns import Text, Integer
            +from cassandra.cqlengine.usertype import UserType
            +
            +class address(UserType):
            +    street = Text()
            +    zipcode = Integer()
            +
            +from cassandra.cqlengine import management
            +management.sync_type(address)
            +
            +
            +

            Please see User Defined Types for a complete example and discussion.

            +
            +
            +__type_name__ = None
            +

            Optional. Sets the name of the CQL type for this type.

            +

            If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

            +
            + +
            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/datastax/graph/fluent/index.html b/3.25.11-scylla/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..48d182dfe5 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.datastax.graph.fluent

            +
            +
            +class cassandra.datastax.graph.fluent.DseGraph
            +

            Dse Graph utility class for GraphTraversal construction and execution.

            +
            +
            +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
            +

            Graph query language, Default is ‘bytecode-json’ (GraphSON).

            +
            + +
            +
            +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
            +

            Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

            +
            +
            Parameters:
            +
              +
            • graph_name – The graph name

            • +
            • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

            • +
            +
            +
            +
            + +
            +
            +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
            +

            From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

            +
            +
            Parameters:
            +
              +
            • traversal – The GraphTraversal object

            • +
            • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

            • +
            • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

            • +
            +
            +
            +
            + +
            +
            +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
            +

            Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

            +
            +
            Parameters:
            +
              +
            • session – (Optional) A DSE session

            • +
            • graph_name – (Optional) DSE Graph name

            • +
            • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

            • +
            • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

            • +
            +
            +
            +
            from cassandra.cluster import Cluster
            +from cassandra.datastax.graph.fluent import DseGraph
            +
            +c = Cluster()
            +session = c.connect()
            +
            +g = DseGraph.traversal_source(session, 'my_graph')
            +print g.V().valueMap().toList()
            +
            +
            +
            + +
            +
            +static batch(session=None, execution_profile=None)
            +

            Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
            +

            A Tinkerpop RemoteConnection to execute traversal queries on DSE.

            +
            +
            Parameters:
            +
              +
            • session – A DSE session

            • +
            • graph_name – (Optional) DSE Graph name.

            • +
            • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

            • +
            +
            +
            +
            + +
            +
            +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
            +

            Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

            +
            +
            Currently supported:
              +
            • bulk results

            • +
            +
            +
            +
            + +
            +
            +cassandra.datastax.graph.fluent.graph_traversal_row_factory
            +

            alias of _GremlinGraphSON2RowFactory

            +
            + +
            +
            +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
            +

            alias of _DseGraphSON2RowFactory

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/datastax/graph/fluent/predicates.html b/3.25.11-scylla/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..b1438d501f --- /dev/null +++ b/3.25.11-scylla/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.datastax.graph.fluent.predicates

            +
            +
            +class cassandra.datastax.graph.fluent.predicates.Search
            +
            +
            +static token(value)
            +

            Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

            +
            + +
            +
            +static token_prefix(value)
            +

            Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

            +
            + +
            +
            +static token_regex(value)
            +

            Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

            +
            + +
            +
            +static prefix(value)
            +

            Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

            +
            + +
            +
            +static regex(value)
            +

            Search for this regular expression inside the text property targeted. +:param value: the value to look for.

            +
            + +
            +
            +static fuzzy(value, distance)
            +

            Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

            +
            + +
            +
            +static token_fuzzy(value, distance)
            +

            Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

            +
            + +
            +
            +static phrase(value, proximity)
            +

            Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.fluent.predicates.CqlCollection
            +
            +
            +static contains(value)
            +

            Search for a value inside a cql list/set column. +:param value: the value to look for.

            +
            + +
            +
            +static contains_value(value)
            +

            Search for a map value. +:param value: the value to look for.

            +
            + +
            +
            +static contains_key(value)
            +

            Search for a map key. +:param value: the value to look for.

            +
            + +
            +
            +static entry_eq(value)
            +

            Search for a map entry. +:param value: the value to look for.

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.fluent.predicates.Geo
            +
            +
            +static inside(value, units=1)
            +

            Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/datastax/graph/fluent/query.html b/3.25.11-scylla/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..378c39cf37 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.datastax.graph.fluent.query

            +
            +
            +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
            +

            A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

            +

            If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

            +
            +
            Parameters:
            +
              +
            • session – (Optional) A DSE session

            • +
            • execution_profile – (Optional) The execution profile to use for the batch execution

            • +
            +
            +
            +
            +
            +add(traversal)
            +

            Add a traversal to the batch.

            +
            +
            Parameters:
            +

            traversal – A gremlin GraphTraversal

            +
            +
            +
            + +
            +
            +add_all(traversals)
            +

            Adds a sequence of traversals to the batch.

            +
            +
            Parameters:
            +

            traversals – A sequence of gremlin GraphTraversal

            +
            +
            +
            + +
            +
            +execute()
            +

            Execute the traversal batch if bounded to a DSE Session.

            +
            + +
            +
            +as_graph_statement(graph_protocol=b'graphson-2.0')
            +

            Return the traversal batch as GraphStatement.

            +
            +
            Parameters:
            +

            graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

            +
            +
            +
            + +
            +
            +clear()
            +

            Clear a traversal batch for reuse.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/datastax/graph/index.html b/3.25.11-scylla/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..d0243d675b --- /dev/null +++ b/3.25.11-scylla/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1065 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.datastax.graph - Graph Statements, Options, and Row Factories

            +
            +
            +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
            +

            returns the JSON string value of graph results

            +
            + +
            +
            +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
            +

            Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

            +
            + +
            +
            +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
            +

            Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

            +
            + +
            +
            +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
            +

            Row factory to deserialize GraphSON2 results.

            +
            + +
            +
            +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
            +

            Row factory to deserialize GraphSON3 results.

            +
            + +
            +
            +cassandra.datastax.graph.to_int(value)
            +

            Wraps a value to be explicitly serialized as a graphson Int.

            +
            + +
            +
            +cassandra.datastax.graph.to_bigint(value)
            +

            Wraps a value to be explicitly serialized as a graphson Bigint.

            +
            + +
            +
            +cassandra.datastax.graph.to_smallint(value)
            +

            Wraps a value to be explicitly serialized as a graphson Smallint.

            +
            + +
            +
            +cassandra.datastax.graph.to_float(value)
            +

            Wraps a value to be explicitly serialized as a graphson Float.

            +
            + +
            +
            +cassandra.datastax.graph.to_double(value)
            +

            Wraps a value to be explicitly serialized as a graphson Double.

            +
            + +
            +
            +class cassandra.datastax.graph.GraphProtocol
            +
            +
            +GRAPHSON_1_0 = b'graphson-1.0'
            +

            GraphSON1

            +
            + +
            +
            +GRAPHSON_2_0 = b'graphson-2.0'
            +

            GraphSON2

            +
            + +
            +
            +GRAPHSON_3_0 = b'graphson-3.0'
            +

            GraphSON3

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.GraphOptions(**kwargs)
            +

            Options for DSE Graph Query handler.

            +
            +
            +graph_name
            +

            name of the targeted graph.

            +
            + +
            +
            +graph_source
            +

            choose the graph traversal source, configured on the server side.

            +
            + +
            +
            +graph_language
            +

            the language used in the queries (default “gremlin-groovy”)

            +
            + +
            +
            +graph_read_consistency_level
            +

            read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

            +
            + +
            +
            +graph_write_consistency_level
            +

            write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

            +
            + +
            +
            +is_default_source
            +
            + +
            +
            +is_analytics_source
            +

            True if graph_source is set to the server-defined analytics traversal source (‘a’)

            +
            + +
            +
            +is_graph_source
            +

            True if graph_source is set to the server-defined graph traversal source (‘g’)

            +
            + +
            +
            +set_source_default()
            +

            Sets graph_source to the server-defined default traversal source (‘default’)

            +
            + +
            +
            +set_source_analytics()
            +

            Sets graph_source to the server-defined analytic traversal source (‘a’)

            +
            + +
            +
            +set_source_graph()
            +

            Sets graph_source to the server-defined graph traversal source (‘g’)

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
            +

            Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

            +

            query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

            +

            See Statement attributes for a description of the other parameters.

            +
            + +
            +
            +class cassandra.datastax.graph.Result(value)
            +

            Represents deserialized graph results. +Property and item getters are provided for convenience.

            +
            +
            +value = None
            +

            Deserialized value from the result

            +
            + +
            +
            +as_vertex()
            +

            Return a Vertex parsed from this result

            +

            Raises TypeError if parsing fails (i.e. the result structure is not valid).

            +
            + +
            +
            +as_edge()
            +

            Return a Edge parsed from this result

            +

            Raises TypeError if parsing fails (i.e. the result structure is not valid).

            +
            + +
            +
            +as_path()
            +

            Return a Path parsed from this result

            +

            Raises TypeError if parsing fails (i.e. the result structure is not valid).

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.Vertex(id, label, type, properties)
            +

            Represents a Vertex element from a graph query.

            +

            Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

            +
            + +
            +
            +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
            +

            Vertex properties have a top-level value and an optional dict of properties.

            +
            +
            +label = None
            +

            label of the property

            +
            + +
            +
            +value = None
            +

            Value of the property

            +
            + +
            +
            +properties = None
            +

            dict of properties attached to the property

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
            +

            Represents an Edge element from a graph query.

            +

            Attributes match initializer parameters.

            +
            + +
            +
            +class cassandra.datastax.graph.Path(labels, objects)
            +

            Represents a graph path.

            +

            Labels list is taken verbatim from the results.

            +

            Objects are either Result or Vertex/Edge for recognized types

            +
            +
            +labels = None
            +

            List of labels in the path

            +
            + +
            +
            +objects = None
            +

            List of objects in the path

            +
            + +
            + +
            +
            +class cassandra.datastax.graph.T(name, val)
            +

            Represents a collection of tokens for more concise Traversal definitions.

            +
            +
            +id = T.id
            +
            + +
            +
            +key = T.key
            +
            + +
            +
            +label = T.label
            +
            + +
            +
            +value = T.value
            +
            + +
            + +
            +
            +class cassandra.datastax.graph.GraphSON1Serializer
            +

            Serialize python objects to graphson types.

            +
            + +
            +
            +class cassandra.datastax.graph.GraphSON1Deserializer
            +

            Deserialize graphson1 types to python objects.

            +
            +
            +classmethod deserialize_date(value)
            +
            + +
            +
            +classmethod deserialize_timestamp(value)
            +
            + +
            +
            +classmethod deserialize_time(value)
            +
            + +
            +
            +classmethod deserialize_duration(value)
            +
            + +
            +
            +classmethod deserialize_int(value)
            +
            + +
            +
            +classmethod deserialize_bigint(value)
            +
            + +
            +
            +classmethod deserialize_double(value)
            +
            + +
            +
            +classmethod deserialize_float(value)
            +
            + +
            +
            +classmethod deserialize_uuid(value)
            +
            + +
            +
            +classmethod deserialize_blob(value)
            +
            + +
            +
            +classmethod deserialize_decimal(value)
            +
            + +
            +
            +classmethod deserialize_point(value)
            +
            + +
            +
            +classmethod deserialize_linestring(value)
            +
            + +
            +
            +classmethod deserialize_polygon(value)
            +
            + +
            + +
            +
            +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
            +

            GraphSON2 Reader that parse json and deserialize to python objects.

            +
            +
            Parameters:
            +

            extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

            +
            +
            +
            +
            +read(json_data)
            +

            Read and deserialize json_data.

            +
            + +
            +
            +deserialize(obj)
            +

            Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/decoder.html b/3.25.11-scylla/api/cassandra/decoder.html new file mode 100644 index 0000000000..47135ef495 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/decoder.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.decoder - Data Return Formats

            +
            +
            +cassandra.decoder.tuple_factory()
            +

            Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

            +
            + +
            +
            +cassandra.decoder.named_tuple_factory()
            +

            Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

            +
            + +
            +
            +cassandra.decoder.dict_factory()
            +

            Deprecated in 2.0.0. Use cassandra.query.dict_factory()

            +
            + +
            +
            +cassandra.decoder.ordered_dict_factory()
            +

            Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/encoder.html b/3.25.11-scylla/api/cassandra/encoder.html new file mode 100644 index 0000000000..35ccdc3535 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/encoder.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.encoder - Encoders for non-prepared Statements

            +
            +
            +class cassandra.encoder.Encoder
            +

            A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

            +
            +
            +mapping = None
            +

            A map of python types to encoder functions.

            +
            + +
            +
            +cql_encode_none()
            +

            Converts None to the string ‘NULL’.

            +
            + +
            +
            +cql_encode_object()
            +

            Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

            +
            + +
            +
            +cql_encode_all_types()
            +

            Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

            +
            + +
            +
            +cql_encode_sequence()
            +

            Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

            +
            + +
            +
            +cql_encode_str()
            +

            Escapes quotes in str objects.

            +
            + +
            +
            +cql_encode_unicode()
            +

            Converts unicode objects to UTF-8 encoded strings with quote escaping.

            +
            + +
            +
            +cql_encode_bytes()
            +

            Converts strings, buffers, and bytearrays into CQL blob literals.

            +
            + +
            +
            +cql_encode_datetime()
            +

            Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

            +
            + +
            +
            +cql_encode_date()
            +

            Converts a datetime.date object to a string with format +YYYY-MM-DD.

            +
            + +
            +
            +cql_encode_map_collection()
            +

            Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

            +
            + +
            +
            +cql_encode_list_collection()
            +

            Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

            +
            + +
            +
            +cql_encode_set_collection()
            +

            Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

            +
            + +
            +
            +cql_encode_tuple()
            +

            Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/graph.html b/3.25.11-scylla/api/cassandra/graph.html new file mode 100644 index 0000000000..983e3fdb69 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/graph.html @@ -0,0 +1,1098 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.graph - Graph Statements, Options, and Row Factories

            +
            +

            Note

            +

            This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

            +
            +
            +
            +cassandra.graph.single_object_row_factory(column_names, rows)
            +

            returns the JSON string value of graph results

            +
            + +
            +
            +cassandra.graph.graph_result_row_factory(column_names, rows)
            +

            Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

            +
            + +
            +
            +cassandra.graph.graph_object_row_factory(column_names, rows)
            +

            Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

            +
            + +
            +
            +cassandra.graph.graph_graphson2_row_factory(cluster)
            +

            Row factory to deserialize GraphSON2 results.

            +
            + +
            +
            +cassandra.graph.graph_graphson3_row_factory(cluster)
            +

            Row factory to deserialize GraphSON3 results.

            +
            + +
            +
            +cassandra.graph.to_int(value)
            +

            Wraps a value to be explicitly serialized as a graphson Int.

            +
            + +
            +
            +cassandra.graph.to_bigint(value)
            +

            Wraps a value to be explicitly serialized as a graphson Bigint.

            +
            + +
            +
            +cassandra.graph.to_smallint(value)
            +

            Wraps a value to be explicitly serialized as a graphson Smallint.

            +
            + +
            +
            +cassandra.graph.to_float(value)
            +

            Wraps a value to be explicitly serialized as a graphson Float.

            +
            + +
            +
            +cassandra.graph.to_double(value)
            +

            Wraps a value to be explicitly serialized as a graphson Double.

            +
            + +
            +
            +class cassandra.graph.GraphProtocol
            +
            +
            +GRAPHSON_1_0 = b'graphson-1.0'
            +

            GraphSON1

            +
            + +
            +
            +GRAPHSON_2_0 = b'graphson-2.0'
            +

            GraphSON2

            +
            + +
            +
            +GRAPHSON_3_0 = b'graphson-3.0'
            +

            GraphSON3

            +
            + +
            + +
            +
            +class cassandra.graph.GraphOptions(**kwargs)
            +

            Options for DSE Graph Query handler.

            +
            +
            +graph_name
            +

            name of the targeted graph.

            +
            + +
            +
            +graph_source
            +

            choose the graph traversal source, configured on the server side.

            +
            + +
            +
            +graph_language
            +

            the language used in the queries (default “gremlin-groovy”)

            +
            + +
            +
            +graph_read_consistency_level
            +

            read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

            +
            + +
            +
            +graph_write_consistency_level
            +

            write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

            +
            + +
            +
            +is_default_source
            +
            + +
            +
            +is_analytics_source
            +

            True if graph_source is set to the server-defined analytics traversal source (‘a’)

            +
            + +
            +
            +is_graph_source
            +

            True if graph_source is set to the server-defined graph traversal source (‘g’)

            +
            + +
            +
            +set_source_default()
            +

            Sets graph_source to the server-defined default traversal source (‘default’)

            +
            + +
            +
            +set_source_analytics()
            +

            Sets graph_source to the server-defined analytic traversal source (‘a’)

            +
            + +
            +
            +set_source_graph()
            +

            Sets graph_source to the server-defined graph traversal source (‘g’)

            +
            + +
            + +
            +
            +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
            +

            Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

            +

            query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

            +

            See Statement attributes for a description of the other parameters.

            +
            + +
            +
            +class cassandra.graph.Result(value)
            +

            Represents deserialized graph results. +Property and item getters are provided for convenience.

            +
            +
            +value = None
            +

            Deserialized value from the result

            +
            + +
            +
            +as_vertex()
            +

            Return a Vertex parsed from this result

            +

            Raises TypeError if parsing fails (i.e. the result structure is not valid).

            +
            + +
            +
            +as_edge()
            +

            Return a Edge parsed from this result

            +

            Raises TypeError if parsing fails (i.e. the result structure is not valid).

            +
            + +
            +
            +as_path()
            +

            Return a Path parsed from this result

            +

            Raises TypeError if parsing fails (i.e. the result structure is not valid).

            +
            + +
            + +
            +
            +class cassandra.graph.Vertex(id, label, type, properties)
            +

            Represents a Vertex element from a graph query.

            +

            Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

            +
            + +
            +
            +class cassandra.graph.VertexProperty(label, value, properties=None)
            +

            Vertex properties have a top-level value and an optional dict of properties.

            +
            +
            +label = None
            +

            label of the property

            +
            + +
            +
            +value = None
            +

            Value of the property

            +
            + +
            +
            +properties = None
            +

            dict of properties attached to the property

            +
            + +
            + +
            +
            +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
            +

            Represents an Edge element from a graph query.

            +

            Attributes match initializer parameters.

            +
            + +
            +
            +class cassandra.graph.Path(labels, objects)
            +

            Represents a graph path.

            +

            Labels list is taken verbatim from the results.

            +

            Objects are either Result or Vertex/Edge for recognized types

            +
            +
            +labels = None
            +

            List of labels in the path

            +
            + +
            +
            +objects = None
            +

            List of objects in the path

            +
            + +
            + +
            +
            +class cassandra.graph.GraphSON1Serializer
            +

            Serialize python objects to graphson types.

            +
            + +
            +
            +class cassandra.graph.GraphSON1Deserializer
            +

            Deserialize graphson1 types to python objects.

            +
            +
            +classmethod deserialize_date(value)
            +
            + +
            +
            +classmethod deserialize_timestamp(value)
            +
            + +
            +
            +classmethod deserialize_time(value)
            +
            + +
            +
            +classmethod deserialize_duration(value)
            +
            + +
            +
            +classmethod deserialize_int(value)
            +
            + +
            +
            +classmethod deserialize_bigint(value)
            +
            + +
            +
            +classmethod deserialize_double(value)
            +
            + +
            +
            +classmethod deserialize_float(value)
            +
            + +
            +
            +classmethod deserialize_uuid(value)
            +
            + +
            +
            +classmethod deserialize_blob(value)
            +
            + +
            +
            +classmethod deserialize_decimal(value)
            +
            + +
            +
            +classmethod deserialize_point(value)
            +
            + +
            +
            +classmethod deserialize_linestring(value)
            +
            + +
            +
            +classmethod deserialize_polygon(value)
            +
            + +
            + +
            +
            +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
            +

            GraphSON2 Reader that parse json and deserialize to python objects.

            +
            +
            Parameters:
            +

            extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

            +
            +
            +
            +
            +read(json_data)
            +

            Read and deserialize json_data.

            +
            + +
            +
            +deserialize(obj)
            +

            Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

            +
            + +
            + +
            +
            +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
            +

            GraphSON3 Reader that parse json and deserialize to python objects.

            +
            +
            Parameters:
            +
              +
            • context – A dict of the context, mostly used as context for udt deserialization.

            • +
            • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

            • +
            +
            +
            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/io/asyncioreactor.html b/3.25.11-scylla/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..96f1289077 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.io.asyncioreactor - asyncio Event Loop

            +
            +
            +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
            +

            An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

            +

            Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

            +
            +
            +classmethod initialize_reactor()
            +

            Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/io/asyncorereactor.html b/3.25.11-scylla/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..c9a59b3be3 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.io.asyncorereactor - asyncore Event Loop

            +
            +
            +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
            +

            An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

            +
            +
            +classmethod initialize_reactor()
            +

            Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

            +
            + +
            +
            +classmethod handle_fork()
            +

            Called after a forking. This should cleanup any remaining reactor state +from the parent process.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/io/eventletreactor.html b/3.25.11-scylla/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..29c29c9de8 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/io/eventletreactor.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.io.eventletreactor - eventlet-compatible Connection

            +
            +
            +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
            +

            An implementation of Connection that utilizes eventlet.

            +

            This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

            +
            +
            +classmethod initialize_reactor()
            +

            Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

            +
            + +
            +
            +classmethod service_timeouts()
            +

            cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/io/geventreactor.html b/3.25.11-scylla/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..664c0f390b --- /dev/null +++ b/3.25.11-scylla/api/cassandra/io/geventreactor.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.io.geventreactor - gevent-compatible Event Loop

            +
            +
            +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
            +

            An implementation of Connection that utilizes gevent.

            +

            This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

            +
            +
            +classmethod initialize_reactor()
            +

            Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/io/libevreactor.html b/3.25.11-scylla/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..523b206e4d --- /dev/null +++ b/3.25.11-scylla/api/cassandra/io/libevreactor.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.io.libevreactor - libev Event Loop

            +
            +
            +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
            +

            An implementation of Connection that uses libev for its event loop.

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/io/twistedreactor.html b/3.25.11-scylla/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..bc50f7ab05 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/io/twistedreactor.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.io.twistedreactor - Twisted Event Loop

            +
            +
            +class cassandra.io.twistedreactor.TwistedConnection
            +

            An implementation of Connection that uses +Twisted’s reactor as its event loop.

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/metadata.html b/3.25.11-scylla/api/cassandra/metadata.html new file mode 100644 index 0000000000..8c424b2926 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/metadata.html @@ -0,0 +1,1104 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.metadata - Schema and Ring Topology

            +
            +
            +cassandra.metadata.cql_keywords
            +

            set() -> new empty set object +set(iterable) -> new set object

            +

            Build an unordered collection of unique elements.

            +
            + +
            +
            +cassandra.metadata.cql_keywords_unreserved
            +

            set() -> new empty set object +set(iterable) -> new set object

            +

            Build an unordered collection of unique elements.

            +
            + +
            +
            +cassandra.metadata.cql_keywords_reserved
            +

            set() -> new empty set object +set(iterable) -> new set object

            +

            Build an unordered collection of unique elements.

            +
            + +
            +
            +class cassandra.metadata.Metadata
            +

            Holds a representation of the cluster schema and topology.

            +
            +
            +add_or_return_host(host)
            +

            Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

            +
            + +
            +
            +all_hosts()
            +

            Returns a list of all known Host instances in the cluster.

            +
            + +
            +
            +export_schema_as_string()
            +

            Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

            +
            + +
            +
            +get_host(endpoint_or_address, port=None)
            +

            Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

            +
            + +
            +
            +get_host_by_host_id(host_id)
            +

            Same as get_host() but use host_id for lookup.

            +
            + +
            +
            +get_replicas(keyspace, key)
            +

            Returns a list of Host instances that are replicas for a given +partition key.

            +
            + +
            + +
            +

            Schemas

            +
            +
            +class cassandra.metadata.KeyspaceMetadata
            +

            A representation of the schema for a single keyspace.

            +
            +
            +as_cql_query()
            +

            Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

            +
            + +
            +
            +export_as_string()
            +

            Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

            +
            + +
            + +
            +
            +class cassandra.metadata.UserType
            +

            A user defined type, as created by CREATE TYPE statements.

            +

            User-defined types were introduced in Cassandra 2.1.

            +
            +

            New in version 2.1.0.

            +
            +
            +
            +as_cql_query(formatted=False)
            +

            Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

            +
            + +
            + +
            +
            +class cassandra.metadata.Function
            +

            A user defined function, as created by CREATE FUNCTION statements.

            +

            User-defined functions were introduced in Cassandra 2.2

            +
            +

            New in version 2.6.0.

            +
            +
            +
            +as_cql_query(formatted=False)
            +

            Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

            +
            + +
            + +
            +
            +class cassandra.metadata.Aggregate
            +

            A user defined aggregate function, as created by CREATE AGGREGATE statements.

            +

            Aggregate functions were introduced in Cassandra 2.2

            +
            +

            New in version 2.6.0.

            +
            +
            +
            +as_cql_query(formatted=False)
            +

            Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

            +
            + +
            + +
            +
            +class cassandra.metadata.TableMetadata
            +

            A representation of the schema for a single table.

            +
            +
            +as_cql_query(formatted=False)
            +

            Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

            +
            + +
            +
            +export_as_string()
            +

            Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

            +
            + +
            +
            +property is_cql_compatible
            +

            A boolean indicating if this table can be represented as CQL in export

            +
            + +
            +
            +property primary_key
            +

            A list of ColumnMetadata representing the components of +the primary key for this table.

            +
            + +
            + +
            +
            +class cassandra.metadata.TableMetadataV3
            +

            For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

            +
            +
            +property is_cql_compatible
            +

            A boolean indicating if this table can be represented as CQL in export

            +
            + +
            + +
            +
            +class cassandra.metadata.TableMetadataDSE68
            +
            +
            +as_cql_query(formatted=False)
            +

            Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

            +
            + +
            + +
            +
            +class cassandra.metadata.ColumnMetadata
            +

            A representation of a single column in a table.

            +
            + +
            +
            +class cassandra.metadata.IndexMetadata
            +

            A representation of a secondary index on a column.

            +
            +
            +as_cql_query()
            +

            Returns a CQL query that can be used to recreate this index.

            +
            + +
            +
            +export_as_string()
            +

            Returns a CQL query string that can be used to recreate this index.

            +
            + +
            + +
            +
            +class cassandra.metadata.MaterializedViewMetadata
            +

            A representation of a materialized view on a table

            +
            +
            +as_cql_query(formatted=False)
            +

            Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

            +
            + +
            + +
            +
            +class cassandra.metadata.VertexMetadata
            +

            A representation of a vertex on a table

            +
            + +
            +
            +class cassandra.metadata.EdgeMetadata
            +

            A representation of an edge on a table

            +
            + +
            +
            +

            Tokens and Ring Topology

            +
            +
            +class cassandra.metadata.TokenMap
            +

            Information about the layout of the ring.

            +
            +
            +get_replicas(keyspace, token)
            +

            Get a set of Host instances representing all of the +replica nodes for a given Token.

            +
            + +
            + +
            +
            +class cassandra.metadata.Token
            +

            Abstract class representing a token.

            +
            + +
            +
            +class cassandra.metadata.Murmur3Token(token)
            +

            A token for Murmur3Partitioner.

            +

            token is an int or string representing the token.

            +
            + +
            +
            +class cassandra.metadata.MD5Token(token)
            +

            A token for RandomPartitioner.

            +
            + +
            +
            +class cassandra.metadata.BytesToken(token)
            +

            A token for ByteOrderedPartitioner.

            +
            +
            +classmethod from_string(token_string)
            +

            token_string should be the string representation from the server.

            +
            + +
            + +
            +
            +cassandra.metadata.ReplicationStrategy
            +

            alias of _ReplicationStrategy

            +
            + +
            +
            +class cassandra.metadata.ReplicationFactor(all_replicas, transient_replicas=None)
            +

            Represent the replication factor of a keyspace.

            +
            + +
            +
            +class cassandra.metadata.SimpleStrategy(options_map)
            +
            +
            +export_for_schema()
            +

            Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

            +
            + +
            +
            +property replication_factor
            +

            The replication factor for this keyspace.

            +

            For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

            +
            + +
            + +
            +
            +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
            +
            +
            +export_for_schema()
            +

            Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

            +
            + +
            + +
            +
            +class cassandra.metadata.LocalStrategy(options_map)
            +
            +
            +export_for_schema()
            +

            Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

            +
            + +
            + +
            +
            +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
            +

            Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

            +

            If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

            +

            Example usage:

            +
            >>> result = group_keys_by_replica(
            +...     session, "system", "peers",
            +...     (("127.0.0.1", ), ("127.0.0.2", )))
            +
            +
            +
            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/metrics.html b/3.25.11-scylla/api/cassandra/metrics.html new file mode 100644 index 0000000000..619a5523a3 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/metrics.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.metrics - Performance Metrics

            +
            +
            +class cassandra.metrics.Metrics
            +

            A collection of timers and counters for various performance metrics.

            +

            Timer metrics are represented as floating point seconds.

            +
            +
            +request_timer = None
            +

            A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

            +
              +
            • count - number of requests that have been timed

            • +
            • min - min latency

            • +
            • max - max latency

            • +
            • mean - mean latency

            • +
            • stddev - standard deviation for latencies

            • +
            • median - median latency

            • +
            • 75percentile - 75th percentile latencies

            • +
            • 95percentile - 95th percentile latencies

            • +
            • 98percentile - 98th percentile latencies

            • +
            • 99percentile - 99th percentile latencies

            • +
            • 999percentile - 99.9th percentile latencies

            • +
            +
            + +
            +
            +connection_errors = None
            +

            A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

            +
            + +
            +
            +write_timeouts = None
            +

            A greplin.scales.IntStat count of write requests that resulted +in a timeout.

            +
            + +
            +
            +read_timeouts = None
            +

            A greplin.scales.IntStat count of read requests that resulted +in a timeout.

            +
            + +
            +
            +unavailables = None
            +

            A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

            +
            + +
            +
            +other_errors = None
            +

            A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

            +
            + +
            +
            +retries = None
            +

            A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

            +
            + +
            +
            +ignores = None
            +

            A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

            +
            + +
            +
            +known_hosts = None
            +

            A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

            +
            + +
            +
            +connected_to = None
            +

            A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

            +
            + +
            +
            +open_connections = None
            +

            A greplin.scales.IntStat count of the number connections +the driver currently has open.

            +
            + +
            +
            +get_stats()
            +

            Returns the metrics for the registered cluster instance.

            +
            + +
            +
            +set_stats_name(stats_name)
            +

            Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/policies.html b/3.25.11-scylla/api/cassandra/policies.html new file mode 100644 index 0000000000..43eeefb276 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/policies.html @@ -0,0 +1,1880 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.policies - Load balancing and Failure Handling Policies

            +
            +

            Load Balancing

            +
            +
            +class cassandra.policies.HostDistance
            +

            A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

            +
            +
            +IGNORED = -1
            +

            A node with this distance should never be queried or have +connections opened to it.

            +
            + +
            +
            +LOCAL = 0
            +

            Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

            +

            This distance is typically used for nodes within the same +datacenter as the client.

            +
            + +
            +
            +REMOTE = 1
            +

            Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

            +

            This distance is typically used for nodes outside of the +datacenter that the client is running in.

            +
            + +
            + +
            +
            +class cassandra.policies.LoadBalancingPolicy
            +

            Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

            +

            In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

            +

            You may also use subclasses of LoadBalancingPolicy for +custom behavior.

            +
            +
            +distance(host)
            +

            Returns a measure of how remote a Host is in +terms of the HostDistance enums.

            +
            + +
            +
            +populate(cluster, hosts)
            +

            This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

            +
            + +
            +
            +make_query_plan(working_keyspace=None, query=None)
            +

            Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

            +

            Note that the query argument may be None when preparing +statements.

            +

            working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

            +
            + +
            +
            +check_supported()
            +

            This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

            +
            + +
            + +
            +
            +class cassandra.policies.RoundRobinPolicy
            +

            A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

            +
            +
            +populate(cluster, hosts)
            +

            This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

            +
            + +
            +
            +distance(host)
            +

            Returns a measure of how remote a Host is in +terms of the HostDistance enums.

            +
            + +
            +
            +make_query_plan(working_keyspace=None, query=None)
            +

            Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

            +

            Note that the query argument may be None when preparing +statements.

            +

            working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

            +
            + +
            +
            +on_up(host)
            +

            Called when a node is marked up.

            +
            + +
            +
            +on_down(host)
            +

            Called when a node is marked down.

            +
            + +
            +
            +on_add(host)
            +

            Called when a node is added to the cluster. The newly added node +should be considered up.

            +
            + +
            +
            +on_remove(host)
            +

            Called when a node is removed from the cluster.

            +
            + +
            + +
            +
            +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
            +

            Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

            +

            The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

            +

            used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

            +
            +
            +populate(cluster, hosts)
            +

            This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

            +
            + +
            +
            +distance(host)
            +

            Returns a measure of how remote a Host is in +terms of the HostDistance enums.

            +
            + +
            +
            +make_query_plan(working_keyspace=None, query=None)
            +

            Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

            +

            Note that the query argument may be None when preparing +statements.

            +

            working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

            +
            + +
            +
            +on_up(host)
            +

            Called when a node is marked up.

            +
            + +
            +
            +on_down(host)
            +

            Called when a node is marked down.

            +
            + +
            +
            +on_add(host)
            +

            Called when a node is added to the cluster. The newly added node +should be considered up.

            +
            + +
            +
            +on_remove(host)
            +

            Called when a node is removed from the cluster.

            +
            + +
            + +
            +
            +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
            +

            A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

            +

            This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

            +

            The hosts parameter should be a sequence of hosts to permit +connections to.

            +
            +
            +populate(cluster, hosts)
            +

            This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

            +
            + +
            +
            +distance(host)
            +

            Returns a measure of how remote a Host is in +terms of the HostDistance enums.

            +
            + +
            +
            +on_up(host)
            +

            Called when a node is marked up.

            +
            + +
            +
            +on_add(host)
            +

            Called when a node is added to the cluster. The newly added node +should be considered up.

            +
            + +
            + +
            +
            +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
            +

            A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

            +

            This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

            +

            If no routing_key is set on the query, the child +policy’s query plan will be used as is.

            +
            +
            +shuffle_replicas = False
            +

            Yield local replicas in a random order.

            +
            + +
            +
            +populate(cluster, hosts)
            +

            This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

            +
            + +
            +
            +check_supported()
            +

            This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

            +
            + +
            +
            +distance(*args, **kwargs)
            +

            Returns a measure of how remote a Host is in +terms of the HostDistance enums.

            +
            + +
            +
            +make_query_plan(working_keyspace=None, query=None)
            +

            Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

            +

            Note that the query argument may be None when preparing +statements.

            +

            working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

            +
            + +
            +
            +on_up(*args, **kwargs)
            +

            Called when a node is marked up.

            +
            + +
            +
            +on_down(*args, **kwargs)
            +

            Called when a node is marked down.

            +
            + +
            +
            +on_add(*args, **kwargs)
            +

            Called when a node is added to the cluster. The newly added node +should be considered up.

            +
            + +
            +
            +on_remove(*args, **kwargs)
            +

            Called when a node is removed from the cluster.

            +
            + +
            + +
            +
            +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
            +

            A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

            +

            This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

            +
            def address_is_ignored(host):
            +    return host.address in [ignored_address0, ignored_address1]
            +
            +blacklist_filter_policy = HostFilterPolicy(
            +    child_policy=RoundRobinPolicy(),
            +    predicate=address_is_ignored
            +)
            +
            +cluster = Cluster(
            +    primary_host,
            +    load_balancing_policy=blacklist_filter_policy,
            +)
            +
            +
            +

            See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

            +

            Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

            +
            +
            Parameters:
            +
              +
            • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

            • +
            • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

            • +
            +
            +
            +
            +
            +predicate(host)
            +

            A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

            +

            This is a read-only value set in __init__, implemented as a +property.

            +
            + +
            +
            +distance(host)
            +

            Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

            +
            + +
            +
            +make_query_plan(working_keyspace=None, query=None)
            +

            Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

            +

            Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

            +
            + +
            + +
            +
            +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
            +

            A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

            +

            If no host is set on the query, the child policy’s query plan will be used as is.

            +
            +
            +populate(cluster, hosts)
            +

            This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

            +
            + +
            +
            +make_query_plan(working_keyspace=None, query=None)
            +

            Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

            +

            Note that the query argument may be None when preparing +statements.

            +

            working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

            +
            + +
            + +
            +
            +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
            +

            Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

            +
            + +
            +
            +

            Translating Server Node Addresses

            +
            +
            +class cassandra.policies.AddressTranslator
            +

            Interface for translating cluster-defined endpoints.

            +

            The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

            +

            Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

            +
            +
            +translate(addr)
            +

            Accepts the node ip address, and returns a translated address to be used connecting to this node.

            +
            + +
            + +
            +
            +class cassandra.policies.IdentityTranslator
            +

            Returns the endpoint with no translation

            +
            +
            +translate(addr)
            +

            Accepts the node ip address, and returns a translated address to be used connecting to this node.

            +
            + +
            + +
            +
            +class cassandra.policies.EC2MultiRegionTranslator
            +

            Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

            +
            +
            +translate(addr)
            +

            Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

            +
            + +
            + +
            +
            +

            Marking Hosts Up or Down

            +
            +
            +class cassandra.policies.ConvictionPolicy(host)
            +

            A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

            +

            If custom behavior is needed, this class may be subclassed.

            +

            host is an instance of Host.

            +
            +
            +add_failure(connection_exc)
            +

            Implementations should return True if the host should be +convicted, False otherwise.

            +
            + +
            +
            +reset()
            +

            Implementations should clear out any convictions or state regarding +the host.

            +
            + +
            + +
            +
            +class cassandra.policies.SimpleConvictionPolicy(host)
            +

            The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

            +

            host is an instance of Host.

            +
            +
            +add_failure(connection_exc)
            +

            Implementations should return True if the host should be +convicted, False otherwise.

            +
            + +
            +
            +reset()
            +

            Implementations should clear out any convictions or state regarding +the host.

            +
            + +
            + +
            +
            +

            Reconnecting to Dead Hosts

            +
            +
            +class cassandra.policies.ReconnectionPolicy
            +

            This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

            +

            If custom behavior is needed, this class may be subclassed.

            +
            +
            +new_schedule()
            +

            This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

            +
            + +
            + +
            +
            +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
            +

            A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

            +

            delay should be a floating point number of seconds to wait inbetween +each attempt.

            +

            max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

            +
            +
            +new_schedule()
            +

            This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

            +
            + +
            + +
            +
            +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
            +

            A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

            +

            A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

            +

            base_delay and max_delay should be in floating point units of +seconds.

            +

            max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

            +
            +
            +new_schedule()
            +

            This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

            +
            + +
            + +
            +
            +

            Retrying Failed Operations

            +
            +
            +class cassandra.policies.WriteType
            +

            For usage with RetryPolicy, this describe a type +of write operation.

            +
            +
            +SIMPLE = 0
            +

            A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

            +
            + +
            +
            +BATCH = 1
            +

            A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

            +
            + +
            +
            +UNLOGGED_BATCH = 2
            +

            A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

            +
            + +
            +
            +COUNTER = 3
            +

            A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

            +
            + +
            +
            +BATCH_LOG = 4
            +

            The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

            +
            + +
            +
            +CAS = 5
            +

            A lighweight-transaction write, such as “DELETE … IF EXISTS”.

            +
            + +
            +
            +VIEW = 6
            +

            This WriteType is only seen in results for requests that were unable to +complete MV operations.

            +
            + +
            +
            +CDC = 7
            +

            This WriteType is only seen in results for requests that were unable to +complete CDC operations.

            +
            + +
            + +
            +
            +class cassandra.policies.RetryPolicy
            +

            A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

            +

            To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

            +

            To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

            +

            If custom behavior is needed for retrying certain operations, +this class may be subclassed.

            +
            +
            +RETRY = 0
            +

            This should be returned from the below methods if the operation +should be retried on the same connection.

            +
            + +
            +
            +RETHROW = 1
            +

            This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

            +
            + +
            +
            +IGNORE = 2
            +

            This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

            +
            + +
            +
            +RETRY_NEXT_HOST = 3
            +

            This should be returned from the below methods if the operation +should be retried on another connection.

            +
            + +
            +
            +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
            +

            This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

            +
            + +
            +
            +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
            +

            This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            write_type is one of the WriteType enums describing the +type of write operation.

            +

            The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

            +
            + +
            +
            +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
            +

            This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

            +

            query is the Statement that failed.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

            +
            + +
            +
            +on_request_error(query, consistency, error, retry_num)
            +

            This is called when an unexpected error happens. This can be in the +following situations:

            +
              +
            • On a connection error

            • +
            • On server errors: overloaded, isBootstrapping, serverError, etc.

            • +
            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            error the instance of the exception.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            The default, it triggers a retry on the next host in the query plan +with the same consistency level.

            +
            + +
            + +
            +
            +class cassandra.policies.FallthroughRetryPolicy
            +

            A retry policy that never retries and always propagates failures to +the application.

            +
            +
            +on_read_timeout(*args, **kwargs)
            +

            This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

            +
            + +
            +
            +on_write_timeout(*args, **kwargs)
            +

            This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            write_type is one of the WriteType enums describing the +type of write operation.

            +

            The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

            +
            + +
            +
            +on_unavailable(*args, **kwargs)
            +

            This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

            +

            query is the Statement that failed.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

            +
            + +
            +
            +on_request_error(*args, **kwargs)
            +

            This is called when an unexpected error happens. This can be in the +following situations:

            +
              +
            • On a connection error

            • +
            • On server errors: overloaded, isBootstrapping, serverError, etc.

            • +
            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            error the instance of the exception.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            The default, it triggers a retry on the next host in the query plan +with the same consistency level.

            +
            + +
            + +
            +
            +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
            +

            Deprecated: This retry policy will be removed in the next major release.

            +

            A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

            +

            BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

            +

            This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

            +
              +
            • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

            • +
            • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

            • +
            • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

            • +
            +

            The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

            +
              +
            • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

            • +
            • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

            • +
            +

            In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

            +
            +
            +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
            +

            This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

            +
            + +
            +
            +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
            +

            This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

            +

            query is the Statement that timed out.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            write_type is one of the WriteType enums describing the +type of write operation.

            +

            The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

            +
            + +
            +
            +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
            +

            This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

            +

            query is the Statement that failed.

            +

            consistency is the ConsistencyLevel that the operation was +attempted at.

            +

            required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

            +

            retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

            +

            By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

            +
            + +
            + +
            +
            +

            Retrying Idempotent Operations

            +
            +
            +class cassandra.policies.SpeculativeExecutionPolicy
            +

            Interface for specifying speculative execution plans

            +
            +
            +new_plan(keyspace, statement)
            +

            Returns

            +
            +
            Parameters:
            +
              +
            • keyspace

            • +
            • statement

            • +
            +
            +
            Returns:
            +

            +
            +
            +
            + +
            + +
            +
            +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
            +

            A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

            +
            +
            +new_plan(keyspace, statement)
            +

            Returns

            +
            +
            Parameters:
            +
              +
            • keyspace

            • +
            • statement

            • +
            +
            +
            Returns:
            +

            +
            +
            +
            + +
            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/pool.html b/3.25.11-scylla/api/cassandra/pool.html new file mode 100644 index 0000000000..ba57d77037 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/pool.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.pool - Hosts and Connection Pools

            +

            Connection pooling and host management.

            +
            +
            +class cassandra.pool.Host
            +

            Represents a single Cassandra node.

            +
            +
            +property address
            +

            The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

            +
            + +
            +
            +property datacenter
            +

            The datacenter the node is in.

            +
            + +
            +
            +property rack
            +

            The rack the node is in.

            +
            + +
            + +
            +
            +exception cassandra.pool.NoConnectionsAvailable
            +

            All existing connections to a given host are busy, or there are +no open connections.

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/protocol.html b/3.25.11-scylla/api/cassandra/protocol.html new file mode 100644 index 0000000000..91cc037080 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/protocol.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.protocol - Protocol Features

            +
            +

            Custom Payloads

            +

            Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

            +

            By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

            +

            See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

            +
            +
            +class cassandra.protocol._ProtocolHandler
            +

            _ProtocolHander handles encoding and decoding messages.

            +

            This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

            +

            Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

            +
            +
            +message_types_by_opcode = {default mapping}
            +
            + +
            +
            +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
            +

            Encodes a message using the specified frame parameters, and compressor

            +
            +
            Parameters:
            +
              +
            • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

            • +
            • stream_id – protocol stream id for the frame header

            • +
            • protocol_version – version for the frame header, and used encoding contents

            • +
            • compressor – optional compression function to be used on the body

            • +
            +
            +
            +
            + +
            +
            +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
            +

            Decodes a native protocol message body

            +
            +
            Parameters:
            +
              +
            • protocol_version – version to use decoding contents

            • +
            • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

            • +
            • stream_id – native protocol stream id from the frame header

            • +
            • flags – native protocol flags bitmap from the header

            • +
            • opcode – native protocol opcode from the header

            • +
            • body – frame body

            • +
            • decompressor – optional decompression function to inflate the body

            • +
            +
            +
            Returns:
            +

            a message decoded from the body and frame attributes

            +
            +
            +
            + +
            + +
            +
            +

            Faster Deserialization

            +

            When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

            +
            from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
            +from cassandra.query import tuple_factory
            +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
            +s.row_factory = tuple_factory  #required for Numpy results
            +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
            +
            +
            +

            These protocol handlers comprise different parsers, and return results as described below:

            +
              +
            • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

            • +
            • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

            • +
            • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

            • +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/query.html b/3.25.11-scylla/api/cassandra/query.html new file mode 100644 index 0000000000..7e928e0e4c --- /dev/null +++ b/3.25.11-scylla/api/cassandra/query.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

            +
            +
            +cassandra.query.tuple_factory(colnames, rows)
            +

            Returns each row as a tuple

            +

            Example:

            +
            >>> from cassandra.query import tuple_factory
            +>>> session = cluster.connect('mykeyspace')
            +>>> session.row_factory = tuple_factory
            +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
            +>>> print rows[0]
            +('Bob', 42)
            +
            +
            +
            +

            Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

            +
            +
            + +
            +
            +cassandra.query.named_tuple_factory(colnames, rows)
            +

            Returns each row as a namedtuple. +This is the default row factory.

            +

            Example:

            +
            >>> from cassandra.query import named_tuple_factory
            +>>> session = cluster.connect('mykeyspace')
            +>>> session.row_factory = named_tuple_factory
            +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
            +>>> user = rows[0]
            +
            +>>> # you can access field by their name:
            +>>> print "name: %s, age: %d" % (user.name, user.age)
            +name: Bob, age: 42
            +
            +>>> # or you can access fields by their position (like a tuple)
            +>>> name, age = user
            +>>> print "name: %s, age: %d" % (name, age)
            +name: Bob, age: 42
            +>>> name = user[0]
            +>>> age = user[1]
            +>>> print "name: %s, age: %d" % (name, age)
            +name: Bob, age: 42
            +
            +
            +
            +

            Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

            +
            +
            + +
            +
            +cassandra.query.dict_factory(colnames, rows)
            +

            Returns each row as a dict.

            +

            Example:

            +
            >>> from cassandra.query import dict_factory
            +>>> session = cluster.connect('mykeyspace')
            +>>> session.row_factory = dict_factory
            +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
            +>>> print rows[0]
            +{u'age': 42, u'name': u'Bob'}
            +
            +
            +
            +

            Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

            +
            +
            + +
            +
            +cassandra.query.ordered_dict_factory(colnames, rows)
            +

            Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

            +
            +

            Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

            +
            +
            + +
            +
            +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
            +

            A simple, un-prepared query.

            +

            query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

            +

            See Statement attributes for a description of the other parameters.

            +
            + +
            +
            +class cassandra.query.PreparedStatement
            +

            A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

            +

            A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

            +

            A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

            +
            +
            +bind(values)
            +

            Creates and returns a BoundStatement instance using values.

            +

            See BoundStatement.bind() for rules on input values.

            +
            + +
            + +
            +
            +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
            +

            A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

            +

            prepared_statement should be an instance of PreparedStatement.

            +

            See Statement attributes for a description of the other parameters.

            +
            +
            +bind(values)
            +

            Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

            +
              +
            • a sequence, even if you are only binding one value, or

            • +
            • a dict that relates 1-to-1 between dict keys and columns

            • +
            +
            +

            Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

            +
              +
            • short sequences will be extended to match bind parameters with UNSET_VALUE

            • +
            • names may be omitted from a dict with UNSET_VALUE implied.

            • +
            +
            +
            +

            Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

            +
            +
            + +
            +
            +property routing_key
            +

            The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

            +

            If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

            +
            + +
            + +
            +
            +class cassandra.query.Statement
            +

            An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

            +
            +
            +property routing_key
            +

            The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

            +

            If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

            +
            + +
            +
            +property serial_consistency_level
            +

            The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

            +

            The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

            +

            The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

            +

            Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

            +

            See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

            +
            +

            New in version 2.0.0.

            +
            +
            + +
            + +
            +
            +cassandra.query.UNSET_VALUE
            +

            The base class of the class hierarchy.

            +

            When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

            +
            + +
            +
            +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
            +

            A protocol-level batch of operations which are applied atomically +by default.

            +
            +

            New in version 2.0.0.

            +
            +

            batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

            +

            retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

            +

            consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

            +

            custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

            +

            Example usage:

            +
            insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
            +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
            +
            +for (name, age) in users_to_insert:
            +    batch.add(insert_user, (name, age))
            +
            +session.execute(batch)
            +
            +
            +

            You can also mix different types of operations within a batch:

            +
            batch = BatchStatement()
            +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
            +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
            +session.execute(batch)
            +
            +
            +
            +

            New in version 2.0.0.

            +
            +
            +

            Changed in version 2.1.0: Added serial_consistency_level as a parameter

            +
            +
            +

            Changed in version 2.6.0: Added custom_payload as a parameter

            +
            +
            +
            +add(statement, parameters=None)
            +

            Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

            +

            Like with other statements, parameters must be a sequence, even +if there is only one item.

            +
            + +
            +
            +add_all(statements, parameters)
            +

            Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

            +
            + +
            +
            +clear()
            +

            This is a convenience method to clear a batch statement for reuse.

            +

            Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

            +
            + +
            +
            +serial_consistency_level = None
            +
            + +
            + +
            +
            +class cassandra.query.BatchType
            +

            A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

            +
            +

            New in version 2.0.0.

            +
            +
            +
            +LOGGED = BatchType.LOGGED
            +
            + +
            +
            +UNLOGGED = BatchType.UNLOGGED
            +
            + +
            +
            +COUNTER = BatchType.COUNTER
            +
            + +
            + +
            +
            +class cassandra.query.ValueSequence(iterable=(), /)
            +

            A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

            +

            This is typically needed when supplying a list of keys to select. +For example:

            +
            >>> my_user_ids = ('alice', 'bob', 'charles')
            +>>> query = "SELECT * FROM users WHERE user_id IN %s"
            +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
            +
            +
            +
            + +
            +
            +class cassandra.query.QueryTrace
            +

            A trace of the duration and events that occurred when executing +an operation.

            +
            +
            +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
            +

            Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

            +

            wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

            +

            query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

            +
            + +
            + +
            +
            +class cassandra.query.TraceEvent
            +

            Representation of a single event within a query trace.

            +
            + +
            +
            +exception cassandra.query.TraceUnavailable
            +

            Raised when complete trace details cannot be fetched from Cassandra.

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/timestamps.html b/3.25.11-scylla/api/cassandra/timestamps.html new file mode 100644 index 0000000000..f37a154b25 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/timestamps.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.timestamps - Timestamp Generation

            +
            +
            +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
            +

            An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

            +
            +

            New in version 3.8.0.

            +
            +
            +
            +warn_on_drift = True
            +

            If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

            +
            + +
            +
            +warning_threshold = 1
            +

            This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

            +
            + +
            +
            +warning_interval = 1
            +

            This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

            +
            + +
            +
            +_next_timestamp(now, last)
            +

            Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

            +
            +
            Parameters:
            +
              +
            • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

            • +
            • last (int) – an integer representing the last timestamp returned by +this object

            • +
            +
            +
            +
            + +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/cassandra/util.html b/3.25.11-scylla/api/cassandra/util.html new file mode 100644 index 0000000000..89cc0839d8 --- /dev/null +++ b/3.25.11-scylla/api/cassandra/util.html @@ -0,0 +1,1082 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            cassandra.util - Utilities

            +
            +
            +class cassandra.util.Date(value)
            +

            Idealized date: year, month, day

            +

            Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

            +

            Initializer value can be:

            +
              +
            • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

            • +
            • datetime.date: built-in date

            • +
            • string_type: a string time of the form “yyyy-mm-dd”

            • +
            +
            +
            +date()
            +

            Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

            +

            ValueError is raised for Dates outside this range.

            +
            + +
            +
            +property seconds
            +

            Absolute seconds from epoch (can be negative)

            +
            + +
            + +
            +
            +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
            +

            DSE DateRange Type

            +
            +
            +lower_bound
            +

            DateRangeBound representing the lower bound of a bounded range.

            +
            + +
            +
            +upper_bound
            +

            DateRangeBound representing the upper bound of a bounded range.

            +
            + +
            +
            +value
            +

            DateRangeBound representing the value of a single-value range.

            +
            + +

            As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

            +
            +
            Parameters:
            +
            +
            +
            +
            + +
            +
            +class cassandra.util.DateRangeBound(value, precision)
            +

            Represents a single date value and its precision for DateRange.

            +
            +
            +milliseconds
            +

            Integer representing milliseconds since the UNIX epoch. May be negative.

            +
            + +
            +
            +precision
            +

            String representing the precision of a bound. Must be a valid +DateRangePrecision member.

            +
            + +

            DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

            +
            +
            Parameters:
            +
              +
            • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

            • +
            • precision – a string representing precision

            • +
            +
            +
            +
            +
            +datetime()
            +

            Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

            +
            + +
            +
            +classmethod from_value(value)
            +

            Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

            +
            +
            Parameters:
            +

            value – a dictlike or iterable object

            +
            +
            +
            + +
            + +
            +
            +class cassandra.util.DateRangePrecision
            +

            An “enum” representing the valid values for DateRange.precision.

            +
            + +
            +
            +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
            +

            Represents a Distance geometry for DSE

            +
            +
            +static from_wkt(s)
            +

            Parse a Distance geometry from a wkt string and return a new Distance object.

            +
            + +
            + +
            +
            +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
            +

            Cassandra Duration Type

            +
            + +
            +
            +class cassandra.util.LineString(coords=())
            +

            Represents a linestring geometry for DSE

            +

            ‘coords`: a sequence of (x, y) coordinates of points in the linestring

            +
            +
            +static from_wkt(s)
            +

            Parse a LineString geometry from a wkt string and return a new LineString object.

            +
            + +
            + +
            +
            +class cassandra.util.OrderedMap(*args, **kwargs)
            +

            An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

            +
            >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
            +...                  ({'three': 3, 'four': 4}, 'value2')])
            +>>> list(od.keys())
            +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
            +>>> list(od.values())
            +['value', 'value2']
            +
            +
            +

            These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

            +
            CREATE TABLE example (
            +    ...
            +    value map<frozen<map<int, int>>, double>
            +    ...
            +)
            +
            +
            +

            This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

            +
            + +
            +
            +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
            +
            + +
            +
            +class cassandra.util.Point(x=nan, y=nan)
            +

            Represents a point geometry for DSE

            +
            +
            +static from_wkt(s)
            +

            Parse a Point geometry from a wkt string and return a new Point object.

            +
            + +
            + +
            +
            +class cassandra.util.Polygon(exterior=(), interiors=None)
            +

            Represents a polygon geometry for DSE

            +

            ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

            +
            +
            +static from_wkt(s)
            +

            Parse a Polygon geometry from a wkt string and return a new Polygon object.

            +
            + +
            + +
            +
            +class cassandra.util.SortedSet(iterable=())
            +

            A sorted set based on sorted list

            +

            A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

            +

            #Not implemented: update functions, inplace operators

            +
            + +
            +
            +class cassandra.util.Time(value)
            +

            Idealized time, independent of day.

            +

            Up to nanosecond resolution

            +

            Initializer value can be:

            +
              +
            • integer_type: absolute nanoseconds in the day

            • +
            • datetime.time: built-in time

            • +
            • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

            • +
            +
            +
            +property hour
            +

            The hour component of this time (0-23)

            +
            + +
            +
            +property minute
            +

            The minute component of this time (0-59)

            +
            + +
            +
            +property nanosecond
            +

            The fractional seconds component of the time, in nanoseconds

            +
            + +
            +
            +property second
            +

            The second component of this time (0-59)

            +
            + +
            +
            +time()
            +

            Return a built-in datetime.time (nanosecond precision truncated to micros).

            +
            + +
            + +
            +
            +class cassandra.util.Version(version)
            +

            Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

            +

            TODO: when python2 support is removed, use packaging.version.

            +
            + +
            +
            +cassandra.util.datetime_from_timestamp(timestamp)
            +

            Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

            +
            +
            Parameters:
            +

            timestamp – a unix timestamp, in seconds

            +
            +
            +
            + +
            +
            +cassandra.util.datetime_from_uuid1(uuid_arg)
            +

            Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

            +
            +
            Parameters:
            +

            uuid_arg – a version 1 UUID

            +
            +
            +
            + +
            +
            +cassandra.util.max_uuid_from_time(timestamp)
            +

            Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

            +

            See uuid_from_time() for argument and return types.

            +
            + +
            +
            +cassandra.util.min_uuid_from_time(timestamp)
            +

            Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

            +

            See uuid_from_time() for argument and return types.

            +
            + +
            +
            +cassandra.util.ms_timestamp_from_datetime(dt)
            +

            Converts a datetime to a timestamp expressed in milliseconds.

            +
            +
            Parameters:
            +

            dt – a datetime.datetime

            +
            +
            +
            + +
            +
            +cassandra.util.sortedset
            +

            alias of SortedSet

            +
            + +
            +
            +cassandra.util.unix_time_from_uuid1(uuid_arg)
            +

            Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

            +
            +
            Parameters:
            +

            uuid_arg – a version 1 UUID

            +
            +
            +
            + +
            +
            +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
            +

            Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

            +

            Raises an OverflowError if the timestamp is out of range for +datetime.

            +
            +
            Parameters:
            +

            timestamp – timestamp, in milliseconds

            +
            +
            +
            + +
            +
            +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
            +

            Converts a datetime or timestamp to a type 1 uuid.UUID.

            +
            +
            Parameters:
            +
              +
            • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

            • +
            • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

            • +
            • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

            • +
            +
            +
            Return type:
            +

            uuid.UUID

            +
            +
            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/api/index.html b/3.25.11-scylla/api/index.html new file mode 100644 index 0000000000..0ff6d02ced --- /dev/null +++ b/3.25.11-scylla/api/index.html @@ -0,0 +1,872 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            API Documentation

            +
            +

            Core Driver

            +
            + +
            +
            +
            +

            Object Mapper

            + +
            +
            +

            DataStax Graph

            + +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/batches.html b/3.25.11-scylla/cqlengine/batches.html new file mode 100644 index 0000000000..874c66077c --- /dev/null +++ b/3.25.11-scylla/cqlengine/batches.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + + + +
            +

            Batch Queries

            +

            cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

            +
            +

            Batch Query General Use Pattern

            +

            You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

            +
            from cassandra.cqlengine.query import BatchQuery
            +
            +#using a context manager
            +with BatchQuery() as b:
            +    now = datetime.now()
            +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
            +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
            +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
            +
            +# -- or --
            +
            +#manually
            +b = BatchQuery()
            +now = datetime.now()
            +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
            +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
            +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
            +b.execute()
            +
            +# updating in a batch
            +
            +b = BatchQuery()
            +em1.description = "new description"
            +em1.batch(b).save()
            +em2.description = "another new description"
            +em2.batch(b).save()
            +b.execute()
            +
            +# deleting in a batch
            +b = BatchQuery()
            +ExampleModel.objects(id=some_id).batch(b).delete()
            +ExampleModel.objects(id=some_id2).batch(b).delete()
            +b.execute()
            +
            +
            +

            Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

            +
            with BatchQuery(execute_on_exception=True) as b:
            +    LogEntry.batch(b).create(k=1, v=1)
            +    mystery_function() # exception thrown in here
            +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
            +
            +
            +

            If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

            +
            +
            +

            Batch Query Execution Callbacks

            +

            In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

            +

            Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

            +

            The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

            +
            def my_callback(*args, **kwargs):
            +    pass
            +
            +batch = BatchQuery()
            +
            +batch.add_callback(my_callback)
            +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
            +
            +# if you need reference to the batch within the callback,
            +# just trap it in the arguments to be passed to the callback:
            +batch.add_callback(my_callback, cqlengine_batch=batch)
            +
            +# once the batch executes...
            +batch.execute()
            +
            +# the effect of the above scheduled callbacks will be similar to
            +my_callback()
            +my_callback('positional arg', named_arg='named arg value')
            +my_callback(cqlengine_batch=batch)
            +
            +
            +

            Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

            +
            +

            Logged vs Unlogged Batches

            +

            By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

            +
            from cassandra.cqlengine.query import BatchType
            +with BatchQuery(batch_type=BatchType.Unlogged) as b:
            +    LogEntry.batch(b).create(k=1, v=1)
            +    LogEntry.batch(b).create(k=1, v=2)
            +
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/connections.html b/3.25.11-scylla/cqlengine/connections.html new file mode 100644 index 0000000000..c889684628 --- /dev/null +++ b/3.25.11-scylla/cqlengine/connections.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + + + +
            +

            Connections

            +

            Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

            +
            +

            Register a new connection

            +

            To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

            +
            from cassandra.cqlengine import connection
            +
            +connection.setup(['127.0.0.1')
            +connection.register_connection('cluster2', ['127.0.0.2'])
            +
            +
            +

            register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

            +
            from cassandra.cqlengine import connection
            +from cassandra.cluster import Cluster
            +
            +session = Cluster(['127.0.0.1']).connect()
            +connection.register_connection('cluster3', session=session)
            +
            +
            +
            +
            +

            Change the default connection

            +

            You can change the default cqlengine connection on registration:

            +
            from cassandra.cqlengine import connection
            +
            +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
            +
            +
            +

            or on the fly using set_default_connection()

            +
            connection.set_default_connection('cluster2')
            +
            +
            +
            +
            +

            Unregister a connection

            +

            You can unregister a connection using unregister_connection():

            +
            connection.unregister_connection('cluster2')
            +
            +
            +
            +
            +

            Management

            +

            When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

            +
            from cassandra.cqlengine import management
            +
            +keyspaces = ['ks1', 'ks2']
            +conns = ['cluster1', 'cluster2']
            +
            +# registers your connections
            +# ...
            +
            +# create all keyspaces on all connections
            +for ks in keyspaces:
            +    management.create_simple_keyspace(ks, connections=conns)
            +
            +# define your Automobile model
            +# ...
            +
            +# sync your models
            +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
            +
            +
            +
            +
            +

            Connection Selection

            +

            cqlengine will select the default connection, unless your specify a connection using one of the following methods.

            +
            +

            Default Model Connection

            +

            You can specify a default connection per model:

            +
            class Automobile(Model):
            +    __keyspace__ = 'test'
            +    __connection__ = 'cluster2'
            +    manufacturer = columns.Text(primary_key=True)
            +    year = columns.Integer(primary_key=True)
            +    model = columns.Text(primary_key=True)
            +
            +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
            +
            +
            +
            +
            +

            QuerySet and model instance

            +

            You can use the using() method to select a connection (or keyspace):

            +
            Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
            +q = Automobile.objects.filter(manufacturer='Tesla')
            +autos = q.using(keyspace='ks2', connection='cluster2').all()
            +
            +for auto in autos:
            +    auto.using(connection='cluster1').save()
            +
            +
            +
            +
            +

            Context Manager

            +

            You can use the ContextQuery as well to select a connection:

            +
            with ContextQuery(Automobile, connection='cluster1') as A:
            +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
            +
            +
            +
            +
            +

            BatchQuery

            +

            With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

            +
            with BatchQuery(connection='cluster1') as b:
            +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
            +
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/faq.html b/3.25.11-scylla/cqlengine/faq.html new file mode 100644 index 0000000000..9222cd01f2 --- /dev/null +++ b/3.25.11-scylla/cqlengine/faq.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Frequently Asked Questions

            +
            +

            Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

            +

            The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

            +
            +
            +

            How to preserve ordering in batch query?

            +

            Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

            +
              +
            • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

            • +
            • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

            • +
            • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

            • +
            +

            Below is an example to show this scenario.

            +
            class MyMode(Model):
            +    id    = columns.Integer(primary_key=True)
            +    count = columns.Integer()
            +    text  = columns.Text()
            +
            +with BatchQuery() as b:
            +   MyModel.batch(b).create(id=1, count=2, text='123')
            +   MyModel.batch(b).create(id=1, count=3, text='111')
            +
            +assert MyModel.objects(id=1).first().count == 3
            +assert MyModel.objects(id=1).first().text  == '123'
            +
            +
            +

            The largest value of count is 3, and the largest value of text would be ‘123’.

            +

            The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

            +
            with BatchQuery() as b:
            +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
            +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
            +
            +assert MyModel.objects(id=1).first().count == 3
            +assert MyModel.objects(id=1).first().text  == '111'
            +
            +
            +
            +
            +

            How can I delete individual values from a row?

            +

            When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

            +
            class MyModel(Model):
            +    id    = columns.Integer(primary_key=True)
            +    text  = columns.Text()
            +
            +m = MyModel.create(id=1, text='We can delete this with None')
            +assert MyModel.objects(id=1).first().text is not None
            +
            +m.update(text=None)
            +assert MyModel.objects(id=1).first().text is None
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/models.html b/3.25.11-scylla/cqlengine/models.html new file mode 100644 index 0000000000..1935fe7246 --- /dev/null +++ b/3.25.11-scylla/cqlengine/models.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + + + +
            +

            Models

            +

            A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

            +

            Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

            +

            Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

            +
            +

            Example Definitions

            +

            This example defines a Person table, with the columns first_name and last_name

            +
            from cassandra.cqlengine import columns
            +from cassandra.cqlengine.models import Model
            +
            + class Person(Model):
            +     id = columns.UUID(primary_key=True)
            +     first_name  = columns.Text()
            +     last_name = columns.Text()
            +
            +
            +

            The Person model would create this CQL table:

            +
            CREATE TABLE cqlengine.person (
            +    id uuid,
            +    first_name text,
            +    last_name text,
            +    PRIMARY KEY (id)
            +);
            +
            +
            +

            Here’s an example of a comment table created with clustering keys, in descending order:

            +
            from cassandra.cqlengine import columns
            +from cassandra.cqlengine.models import Model
            +
            +class Comment(Model):
            +    photo_id = columns.UUID(primary_key=True)
            +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
            +    comment = columns.Text()
            +
            +
            +

            The Comment model’s create table would look like the following:

            +
            CREATE TABLE comment (
            +  photo_id uuid,
            +  comment_id timeuuid,
            +  comment text,
            +  PRIMARY KEY (photo_id, comment_id)
            +) WITH CLUSTERING ORDER BY (comment_id DESC);
            +
            +
            +

            To sync the models to the database, you may do the following*:

            +
            from cassandra.cqlengine.management import sync_table
            +sync_table(Person)
            +sync_table(Comment)
            +
            +
            +

            *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

            +

            For examples on manipulating data and creating queries, see Making Queries

            +
            +
            +

            Manipulating model instances as dictionaries

            +

            Model instances can be accessed like dictionaries.

            +
            class Person(Model):
            +    first_name  = columns.Text()
            +    last_name = columns.Text()
            +
            +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
            +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
            +kevin['first_name']  # returns 'Kevin'
            +kevin.keys()  # returns ['first_name', 'last_name']
            +kevin.values()  # returns ['Kevin', 'Deldycke']
            +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
            +
            +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
            +
            +
            +
            +
            +

            Extending Model Validation

            +

            Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

            +

            However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

            +
            class Member(Model):
            +    person_id = UUID(primary_key=True)
            +    name = Text(required=True)
            +
            +    def validate(self):
            +        super(Member, self).validate()
            +        if self.name == 'jon':
            +            raise ValidationError('no jon\'s allowed')
            +
            +
            +

            Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

            +
            +
            +

            Model Inheritance

            +

            It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

            +

            For instance, suppose you want a table that stores rows of pets owned by an owner:

            +
            class Pet(Model):
            +    __table_name__ = 'pet'
            +    owner_id = UUID(primary_key=True)
            +    pet_id = UUID(primary_key=True)
            +    pet_type = Text(discriminator_column=True)
            +    name = Text()
            +
            +    def eat(self, food):
            +        pass
            +
            +    def sleep(self, time):
            +        pass
            +
            +class Cat(Pet):
            +    __discriminator_value__ = 'cat'
            +    cuteness = Float()
            +
            +    def tear_up_couch(self):
            +        pass
            +
            +class Dog(Pet):
            +    __discriminator_value__ = 'dog'
            +    fierceness = Float()
            +
            +    def bark_all_night(self):
            +        pass
            +
            +
            +

            After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

            +

            To setup a model structure with inheritance, follow these steps

            +
              +
            1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

            2. +
            3. Create subclass models, and define a unique __discriminator_value__ value on each

            4. +
            5. Run sync_table on each of the sub tables

            6. +
            +

            About the discriminator value

            +

            The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

            +
            +
            +

            User Defined Types

            +

            cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

            +
            from cassandra.cqlengine.columns import *
            +from cassandra.cqlengine.models import Model
            +from cassandra.cqlengine.usertype import UserType
            +
            +class address(UserType):
            +    street = Text()
            +    zipcode = Integer()
            +
            +class users(Model):
            +    __keyspace__ = 'account'
            +    name = Text(primary_key=True)
            +    addr = UserDefinedType(address)
            +
            +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
            +user = users.objects(name="Joe")[0]
            +print user.name, user.addr
            +# Joe address(street=u'Easy St.', zipcode=99999)
            +
            +
            +

            UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

            +

            sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

            +

            Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

            +

            *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/queryset.html b/3.25.11-scylla/cqlengine/queryset.html new file mode 100644 index 0000000000..79ae7d95e6 --- /dev/null +++ b/3.25.11-scylla/cqlengine/queryset.html @@ -0,0 +1,996 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Making Queries

            +
            +

            Retrieving objects

            +

            Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

            +
            +

            Retrieving all objects

            +

            The simplest query you can make is to return all objects from a table.

            +

            This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

            +

            Using the Person example model, we would get all Person objects like this:

            +
            all_objects = Person.objects.all()
            +
            +
            +
            +
            +

            Retrieving objects with filters

            +

            Typically, you’ll want to query only a subset of the records in your database.

            +

            That can be accomplished with the QuerySet’s .filter(\*\*) method.

            +

            For example, given the model definition:

            +
            class Automobile(Model):
            +    manufacturer = columns.Text(primary_key=True)
            +    year = columns.Integer(primary_key=True)
            +    model = columns.Text()
            +    price = columns.Decimal()
            +    options = columns.Set(columns.Text)
            +
            +
            +

            …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +
            +
            +

            You can also use the more convenient syntax:

            +
            q = Automobile.objects(Automobile.manufacturer == 'Tesla')
            +
            +
            +

            We can then further filter our query with another call to .filter

            +
            q = q.filter(year=2012)
            +
            +
            +

            Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

            +
            +
            +
            +

            Accessing objects in a QuerySet

            +

            There are several methods for getting objects out of a queryset

            +
              +
            • +
              iterating over the queryset
              for car in Automobile.objects.all():
              +    #...do something to the car instance
              +    pass
              +
              +
              +
              +
              +
            • +
            • +
              list index
              q = Automobile.objects.all()
              +q[0] #returns the first result
              +q[1] #returns the second result
              +
              +
              +
              +

              Note

              +
                +
              • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

              • +
              • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

              • +
              +
              +
              +
              +
            • +
            • +
              list slicing
              q = Automobile.objects.all()
              +q[1:] #returns all results except the first
              +q[1:9] #returns a slice of the results
              +
              +
              +
              +

              Note

              +
                +
              • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

              • +
              • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

              • +
              +
              +
              +
              +
            • +
            • +
              calling get() on the queryset
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year=2012)
              +car = q.get()
              +
              +
              +

              this returns the object matching the queryset

              +
              +
              +
            • +
            • +
              calling first() on the queryset
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year=2012)
              +car = q.first()
              +
              +
              +

              this returns the first value in the queryset

              +
              +
              +
            • +
            +
            +
            +

            Filtering Operators

            +

            Equal To

            +

            The default filtering operator.

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year=2012)  #year == 2012
            +
            +
            +

            In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

            +

            in (__in)

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year__in=[2011, 2012])
            +
            +
            +

            > (__gt)

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year__gt=2010)  # year > 2010
            +
            +# or the nicer syntax
            +
            +q.filter(Automobile.year > 2010)
            +
            +
            +

            >= (__gte)

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year__gte=2010)  # year >= 2010
            +
            +# or the nicer syntax
            +
            +q.filter(Automobile.year >= 2010)
            +
            +
            +

            < (__lt)

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year__lt=2012)  # year < 2012
            +
            +# or...
            +
            +q.filter(Automobile.year < 2012)
            +
            +
            +

            <= (__lte)

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q = q.filter(year__lte=2012)  # year <= 2012
            +
            +q.filter(Automobile.year <= 2012)
            +
            +
            +

            CONTAINS (__contains)

            +

            The CONTAINS operator is available for all collection types (List, Set, Map).

            +
            q = Automobile.objects.filter(manufacturer='Tesla')
            +q.filter(options__contains='backup camera').allow_filtering()
            +
            +
            +

            Note that we need to use allow_filtering() since the options column has no secondary index.

            +

            LIKE (__like)

            +

            The LIKE operator is available for text columns that have a SASI secondary index.

            +
            q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
            +
            +
            +

            IS NOT NULL (IsNotNull(column_name))

            +

            The IS NOT NULL operator is not yet supported for C*.

            +
            q = Automobile.objects.filter(IsNotNull('model'))
            +
            +
            +

            Limitations:

            +
              +
            • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

            • +
            • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

            • +
            +
            +
            +

            TimeUUID Functions

            +

            In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

            +
            +
            +class cqlengine.queryset.MinTimeUUID(datetime)
            +

            returns the minimum time uuid value possible for the given datetime

            +
            + +
            +
            +class cqlengine.queryset.MaxTimeUUID(datetime)
            +

            returns the maximum time uuid value possible for the given datetime

            +
            + +

            Example

            +
            class DataStream(Model):
            +    id      = columns.UUID(partition_key=True)
            +    time    = columns.TimeUUID(primary_key=True)
            +    data    = columns.Bytes()
            +
            +min_time = datetime(1982, 1, 1)
            +max_time = datetime(1982, 3, 9)
            +
            +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
            +
            +
            +
            +
            +

            Token Function

            +

            Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

            +

            See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

            +

            Example

            +
            class Items(Model):
            +    id      = columns.Text(primary_key=True)
            +    data    = columns.Bytes()
            +
            +query = Items.objects.all().limit(10)
            +
            +first_page = list(query);
            +last = first_page[-1]
            +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
            +
            +
            +
            +
            +

            QuerySets are immutable

            +

            When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

            +

            Example

            +
            #this produces 3 different querysets
            +#q does not change after it's initial definition
            +q = Automobiles.objects.filter(year=2012)
            +tesla2012 = q.filter(manufacturer='Tesla')
            +honda2012 = q.filter(manufacturer='Honda')
            +
            +
            +
            +
            +

            Ordering QuerySets

            +

            Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

            +

            However, you can set a column to order on with the .order_by(column_name) method.

            +

            Example

            +
            #sort ascending
            +q = Automobiles.objects.all().order_by('year')
            +#sort descending
            +q = Automobiles.objects.all().order_by('-year')
            +
            +
            +

            Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

            +

            For instance, given our Automobile model, year is the only column we can order on.

            +
            +
            +

            Values Lists

            +

            There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

            +
            items = list(range(20))
            +random.shuffle(items)
            +for i in items:
            +    TestModel.create(id=1, clustering_key=i)
            +
            +values = list(TestModel.objects.values_list('clustering_key', flat=True))
            +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
            +
            +
            +
            +
            +

            Per Query Timeouts

            +

            By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

            +
            class Row(Model):
            +    id = columns.Integer(primary_key=True)
            +    name = columns.Text()
            +
            +
            +

            Fetch all objects with a timeout of 5 seconds

            +
            Row.objects().timeout(5).all()
            +
            +
            +

            Create a single row with a 50ms timeout

            +
            Row(id=1, name='Jon').timeout(0.05).create()
            +
            +
            +

            Delete a single row with no timeout

            +
            Row(id=1).timeout(None).delete()
            +
            +
            +

            Update a single row with no timeout

            +
            Row(id=1).timeout(None).update(name='Blake')
            +
            +
            +

            Batch query timeouts

            +
            with BatchQuery(timeout=10) as b:
            +    Row(id=1, name='Jon').create()
            +
            +
            +

            NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

            +
            +
            +

            Default TTL and Per Query TTL

            +

            Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

            +

            Example:

            +
            class User(Model):
            +    __options__ = {'default_time_to_live': 20}
            +
            +    user_id = columns.UUID(primary_key=True)
            +    ...
            +
            +
            +

            You can set TTL per-query if needed. Here are a some examples:

            +

            Example:

            +
            class User(Model):
            +    __options__ = {'default_time_to_live': 20}
            +
            +    user_id = columns.UUID(primary_key=True)
            +    ...
            +
            +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
            +
            +user.ttl(30).update(age=21)            # Update the TTL to 30
            +User.objects.ttl(10).create(user_id=1)  # TTL 10
            +User(user_id=1, age=21).ttl(10).save()  # TTL 10
            +
            +
            +
            +
            +

            Named Tables

            +

            Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

            +
            from cassandra.cqlengine.connection import setup
            +setup("127.0.0.1", "cqlengine_test")
            +
            +from cassandra.cqlengine.named import NamedTable
            +user = NamedTable("cqlengine_test", "user")
            +user.objects()
            +user.objects()[0]
            +
            +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/third_party.html b/3.25.11-scylla/cqlengine/third_party.html new file mode 100644 index 0000000000..00180c3e2a --- /dev/null +++ b/3.25.11-scylla/cqlengine/third_party.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Third party integrations

            +
            +

            Celery

            +

            Here’s how, in substance, CQLengine can be plugged to Celery:

            +
            from celery import Celery
            +from celery.signals import worker_process_init, beat_init
            +from cassandra.cqlengine import connection
            +from cassandra.cqlengine.connection import (
            +    cluster as cql_cluster, session as cql_session)
            +
            +def cassandra_init(**kwargs):
            +    """ Initialize a clean Cassandra connection. """
            +    if cql_cluster is not None:
            +        cql_cluster.shutdown()
            +    if cql_session is not None:
            +        cql_session.shutdown()
            +    connection.setup()
            +
            +# Initialize worker context for both standard and periodic tasks.
            +worker_process_init.connect(cassandra_init)
            +beat_init.connect(cassandra_init)
            +
            +app = Celery()
            +
            +
            +
            +
            +

            uWSGI

            +

            This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

            +
            from cassandra.cqlengine import connection
            +from cassandra.cqlengine.connection import (
            +    cluster as cql_cluster, session as cql_session)
            +
            +try:
            +    from uwsgidecorators import postfork
            +except ImportError:
            +    # We're not in a uWSGI context, no need to hook Cassandra session
            +    # initialization to the postfork event.
            +    pass
            +else:
            +    @postfork
            +    def cassandra_init(**kwargs):
            +        """ Initialize a new Cassandra session in the context.
            +
            +        Ensures that a new session is returned for every new request.
            +        """
            +        if cql_cluster is not None:
            +            cql_cluster.shutdown()
            +        if cql_session is not None:
            +            cql_session.shutdown()
            +        connection.setup()
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/cqlengine/upgrade_guide.html b/3.25.11-scylla/cqlengine/upgrade_guide.html new file mode 100644 index 0000000000..edd022c0bf --- /dev/null +++ b/3.25.11-scylla/cqlengine/upgrade_guide.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + + + +
            +

            Upgrade Guide

            +

            This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

            +

            THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

            +
            +

            Functional Changes

            +
            +

            List Prepend Reversing

            +

            Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

            +
            +
            +

            Date Column Type

            +

            The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

            +
            +
            +
            +

            Remove cqlengine

            +

            To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

            +

            The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

            +
            +
            +

            Organization

            +
            +

            Imports

            +

            cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

            +
            from cassandra.cqlengine import columns
            +
            +
            +

            is now:

            +
            from cassandra.cqlengine import columns
            +
            +
            +
            +
            +

            Package-Level Aliases

            +

            Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

            +

            Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

            +

            These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

            +
            +
            +

            Exceptions

            +

            The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

            + + + + + + + + + + + + + + + + + + + + + + + + + + +

            Exception class

            New module

            CQLEngineException

            cassandra.cqlengine

            ModelException

            cassandra.cqlengine.models

            ValidationError

            cassandra.cqlengine

            UndefinedKeyspaceException

            cassandra.cqlengine.connection

            LWTException

            cassandra.cqlengine.query

            IfNotExistsWithCounterColumn

            cassandra.cqlengine.query

            +
            +
            +

            UnicodeMixin Consolidation

            +

            class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

            +
            +
            +
            +

            API Deprecations

            +

            This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

            +
            +

            Float/Double Overload

            +

            Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

            +
            +
            +

            Schema Management

            +

            cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

            + +

            cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

            +
            +
            +

            Model Inheritance

            +

            The names for class attributes controlling model inheritance are changing. Changes are as follows:

            + +

            The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

            +

            The example below shows a simple translation:

            +

            Before:

            +
            class Pet(Model):
            +    __table_name__ = 'pet'
            +    owner_id = UUID(primary_key=True)
            +    pet_id = UUID(primary_key=True)
            +    pet_type = Text(polymorphic_key=True)
            +    name = Text()
            +
            +class Cat(Pet):
            +    __polymorphic_key__ = 'cat'
            +
            +class Dog(Pet):
            +    __polymorphic_key__ = 'dog'
            +
            +
            +

            After:

            +
            class Pet(models.Model):
            +    __table_name__ = 'pet'
            +    owner_id = UUID(primary_key=True)
            +    pet_id = UUID(primary_key=True)
            +    pet_type = Text(discriminator_column=True)
            +    name = Text()
            +
            +class Cat(Pet):
            +    __discriminator_value__ = 'cat'
            +
            +class Dog(Pet):
            +    __discriminator_value__ = 'dog'
            +
            +
            +
            +
            +

            TimeUUID.from_datetime

            +

            This function is deprecated in favor of the core utility function uuid_from_time().

            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/dates_and_times.html b/3.25.11-scylla/dates_and_times.html new file mode 100644 index 0000000000..eba14c0c00 --- /dev/null +++ b/3.25.11-scylla/dates_and_times.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Working with Dates and Times

            +

            This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

            +
            +

            timestamps (Cassandra DateType)

            +

            Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

            +
            +

            Write Path

            +

            When inserting timestamps, the driver handles serialization for the write path as follows:

            +

            If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

            +
              +
            • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

            • +
            • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

            • +
            +

            Note the second point above applies even to “local” times created using now():

            +
            >>> d = datetime.now()
            +
            +>>> print(d.tzinfo)
            +None
            +
            +
            +

            These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

            +

            If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

            +
            +
            +

            Read Path

            +

            The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

            +

            The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

            +
            import pytz
            +user_tz = pytz.timezone('US/Central')
            +timestamp_naive = row.ts
            +timestamp_utc = pytz.utc.localize(timestamp_naive)
            +timestamp_presented = timestamp_utc.astimezone(user_tz)
            +
            +
            +

            This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

            +
            +
            +
            +

            date, time (Cassandra DateType)

            +

            Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

            +
            +

            Write Path

            +

            For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

            +

            For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

            +
            +
            +

            Read Path

            +

            The driver always returns custom types for date and time.

            +

            The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

            +

            The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/execution_profiles.html b/3.25.11-scylla/execution_profiles.html new file mode 100644 index 0000000000..3c8eee1725 --- /dev/null +++ b/3.25.11-scylla/execution_profiles.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Execution Profiles

            +

            Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

            +

            The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

            +

            An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

            +

            This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

            +
            +

            Mapping Legacy Parameters to Profiles

            +

            Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

            + +

            When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

            +
            +
            +

            Using Execution Profiles

            +
            +

            Default

            +
            from cassandra.cluster import Cluster
            +cluster = Cluster()
            +session = cluster.connect()
            +local_query = 'SELECT rpc_address FROM system.local'
            +for _ in cluster.metadata.all_hosts():
            +    print session.execute(local_query)[0]
            +
            +
            +
            Row(rpc_address='127.0.0.2')
            +Row(rpc_address='127.0.0.1')
            +
            +
            +

            The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

            +
            +
            +

            Initializing cluster with profiles

            +
            from cassandra.cluster import ExecutionProfile
            +from cassandra.policies import WhiteListRoundRobinPolicy
            +
            +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
            +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
            +
            +profiles = {'node1': node1_profile, 'node2': node2_profile}
            +session = Cluster(execution_profiles=profiles).connect()
            +for _ in cluster.metadata.all_hosts():
            +    print session.execute(local_query, execution_profile='node1')[0]
            +
            +
            +
            Row(rpc_address='127.0.0.1')
            +Row(rpc_address='127.0.0.1')
            +
            +
            +
            for _ in cluster.metadata.all_hosts():
            +    print session.execute(local_query, execution_profile='node2')[0]
            +
            +
            +
            Row(rpc_address='127.0.0.2')
            +Row(rpc_address='127.0.0.2')
            +
            +
            +
            for _ in cluster.metadata.all_hosts():
            +    print session.execute(local_query)[0]
            +
            +
            +
            Row(rpc_address='127.0.0.2')
            +Row(rpc_address='127.0.0.1')
            +
            +
            +

            Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

            +
            from cassandra.cluster import EXEC_PROFILE_DEFAULT
            +profile = ExecutionProfile(request_timeout=30)
            +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
            +
            +
            +
            +
            +

            Adding named profiles

            +

            New profiles can be added constructing from scratch, or deriving from default:

            +
            locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
            +node1_profile = 'node1_whitelist'
            +cluster.add_execution_profile(node1_profile, locked_execution)
            +
            +for _ in cluster.metadata.all_hosts():
            +    print session.execute(local_query, execution_profile=node1_profile)[0]
            +
            +
            +
            Row(rpc_address='127.0.0.1')
            +Row(rpc_address='127.0.0.1')
            +
            +
            +

            See Cluster.add_execution_profile() for details and optional parameters.

            +
            +
            +

            Passing a profile instance without mapping

            +

            We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

            +
            from cassandra.query import tuple_factory
            +
            +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
            +
            +print session.execute(local_query, execution_profile=tmp)[0]
            +print session.execute(local_query, execution_profile='node1')[0]
            +
            +
            +
            ('127.0.0.1',)
            +Row(rpc_address='127.0.0.1')
            +
            +
            +

            The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/faq.html b/3.25.11-scylla/faq.html new file mode 100644 index 0000000000..e883bddcf0 --- /dev/null +++ b/3.25.11-scylla/faq.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Frequently Asked Questions

            +

            See also cqlengine FAQ

            +
            +

            Why do connections or IO operations timeout in my WSGI application?

            +

            Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

            +

            To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

            +
            from flask import Flask
            +from uwsgidecorators import postfork
            +from cassandra.cluster import Cluster
            +
            +session = None
            +prepared = None
            +
            +@postfork
            +def connect():
            +    global session, prepared
            +    session = Cluster().connect()
            +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
            +
            +app = Flask(__name__)
            +
            +@app.route('/')
            +def server_version():
            +    row = session.execute(prepared, ('local',))[0]
            +    return row.release_version
            +
            +
            +

            uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

            +
            +
            +

            How do I trace a request?

            +

            Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

            +
            >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
            +>>> result = future.result()
            +>>> trace = future.get_query_trace()
            +>>> for e in trace.events:
            +>>>     print e.source_elapsed, e.description
            +
            +0:00:00.000077 Parsing select * from system.local
            +0:00:00.000153 Preparing statement
            +0:00:00.000309 Computing ranges to query
            +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
            +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
            +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
            +0:00:00.000669 Read 1 live and 0 tombstone cells
            +0:00:00.000755 Scanned 1 rows and matched 1
            +
            +
            +

            trace is a QueryTrace object.

            +
            +
            +

            How do I determine the replicas for a query?

            +

            With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

            +
            >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
            +>>> bound = prepared.bind((1,))
            +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
            +>>> for h in replicas:
            +>>>   print h.address
            +127.0.0.1
            +127.0.0.2
            +
            +
            +

            replicas is a list of Host objects.

            +
            +
            +

            How does the driver manage request retries?

            +

            By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

            +

            Retries are presently attempted on the same coordinator, but this may change in the future.

            +

            Please see policies.RetryPolicy for further details.

            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/getting_started.html b/3.25.11-scylla/getting_started.html new file mode 100644 index 0000000000..b51b333b06 --- /dev/null +++ b/3.25.11-scylla/getting_started.html @@ -0,0 +1,1107 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Getting Started

            +

            First, make sure you have the driver properly installed.

            +
            +

            Connecting to a Cluster

            +

            Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

            +

            First, make sure you have the Cassandra driver properly installed.

            +
            +

            Connecting to Cassandra

            +

            The simplest way to create a Cluster is like this:

            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster()
            +
            +
            +

            This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
            +
            +
            +

            The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

            +

            If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

            +
            from cassandra.cluster import Cluster
            +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
            +
            +
            +

            Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

            +
            cluster = Cluster()
            +session = cluster.connect()
            +
            +
            +
            +
            +
            +

            Session Keyspace

            +

            The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

            +
            cluster = Cluster()
            +session = cluster.connect('mykeyspace')
            +
            +
            +

            You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

            +
            session.set_keyspace('users')
            +# or you can do this instead
            +session.execute('USE users')
            +
            +
            +
            +
            +

            Execution Profiles

            +

            Profiles are passed in by execution_profiles dict.

            +

            In this case we can construct the base ExecutionProfile passing all attributes:

            +
            from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
            +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
            +from cassandra.query import tuple_factory
            +
            +profile = ExecutionProfile(
            +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
            +    retry_policy=DowngradingConsistencyRetryPolicy(),
            +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
            +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
            +    request_timeout=15,
            +    row_factory=tuple_factory
            +)
            +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
            +session = cluster.connect()
            +
            +print(session.execute("SELECT release_version FROM system.local").one())
            +
            +
            +

            Users are free to setup additional profiles to be used by name:

            +
            profile_long = ExecutionProfile(request_timeout=30)
            +cluster = Cluster(execution_profiles={'long': profile_long})
            +session = cluster.connect()
            +session.execute(statement, execution_profile='long')
            +
            +
            +

            Also, parameters passed to Session.execute or attached to Statements are still honored as before.

            +
            +
            +

            Executing Queries

            +

            Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

            +
            rows = session.execute('SELECT name, age, email FROM users')
            +for user_row in rows:
            +    print user_row.name, user_row.age, user_row.email
            +
            +
            +

            This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

            +

            By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

            +
            rows = session.execute('SELECT name, age, email FROM users')
            +for row in rows:
            +    print row.name, row.age, row.email
            +
            +
            +
            rows = session.execute('SELECT name, age, email FROM users')
            +for (name, age, email) in rows:
            +    print name, age, email
            +
            +
            +
            rows = session.execute('SELECT name, age, email FROM users')
            +for row in rows:
            +    print row[0], row[1], row[2]
            +
            +
            +

            If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

            +

            As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

            +
            +
            +

            Prepared Statements

            +

            Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

            +

            To prepare a query, use Session.prepare():

            +
            user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
            +
            +users = []
            +for user_id in user_ids_to_query:
            +    user = session.execute(user_lookup_stmt, [user_id])
            +    users.append(user)
            +
            +
            +

            prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

            +

            Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

            +
            +
            +

            Passing Parameters to CQL Queries

            +

            Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

            +

            Positional parameters are used with a %s placeholder. For example, +when you execute:

            +
            session.execute(
            +    """
            +    INSERT INTO users (name, credits, user_id)
            +    VALUES (%s, %s, %s)
            +    """,
            +    ("John O'Reilly", 42, uuid.uuid1())
            +)
            +
            +
            +

            It is translated to the following CQL query:

            +
            INSERT INTO users (name, credits, user_id)
            +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
            +
            +
            +

            Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

            +
            session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
            +
            +
            +

            Instead, use %s for the age placeholder.

            +

            If you need to use a literal % character, use %%.

            +

            Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

            +
            session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
            +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
            +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
            +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
            +
            +
            +

            Note that the second line is incorrect because in Python, single-element tuples +require a comma.

            +

            Named place-holders use the %(name)s form:

            +
            session.execute(
            +    """
            +    INSERT INTO users (name, credits, user_id, username)
            +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
            +    """,
            +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
            +)
            +
            +
            +

            Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

            +

            Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

            +
            +
            +

            Type Conversions

            +

            For non-prepared statements, Python types are cast to CQL literals in the +following way:

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

            Python Type

            CQL Literal Type

            None

            NULL

            bool

            boolean

            float

            +
            float
            +
            double
            +
            +
            +
            int
            +
            long
            +
            +
            +
            int
            +
            bigint
            +
            varint
            +
            smallint
            +
            tinyint
            +
            counter
            +
            +

            decimal.Decimal

            decimal

            +
            str
            +
            unicode
            +
            +
            +
            ascii
            +
            varchar
            +
            text
            +
            +
            +
            buffer
            +
            bytearray
            +
            +

            blob

            date

            date

            datetime

            timestamp

            time

            time

            +
            list
            +
            tuple
            +
            generator
            +
            +

            list

            +
            set
            +
            frozenset
            +
            +

            set

            +
            dict
            +
            OrderedDict
            +
            +

            map

            uuid.UUID

            +
            timeuuid
            +
            uuid
            +
            +
            +
            +
            +

            Asynchronous Queries

            +

            The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

            +

            The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

            +
            from cassandra import ReadTimeout
            +
            +query = "SELECT * FROM users WHERE user_id=%s"
            +future = session.execute_async(query, [user_id])
            +
            +# ... do some other work
            +
            +try:
            +    rows = future.result()
            +    user = rows[0]
            +    print user.name, user.age
            +except ReadTimeout:
            +    log.exception("Query timed out:")
            +
            +
            +

            This works well for executing many queries concurrently:

            +
            # build a list of futures
            +futures = []
            +query = "SELECT * FROM users WHERE user_id=%s"
            +for user_id in ids_to_fetch:
            +    futures.append(session.execute_async(query, [user_id])
            +
            +# wait for them to complete and use the results
            +for future in futures:
            +    rows = future.result()
            +    print rows[0].name
            +
            +
            +

            Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

            +
            def handle_success(rows):
            +    user = rows[0]
            +    try:
            +        process_user(user.name, user.age, user.id)
            +    except Exception:
            +        log.error("Failed to process user %s", user.id)
            +        # don't re-raise errors in the callback
            +
            +def handle_error(exception):
            +    log.error("Failed to fetch user info: %s", exception)
            +
            +
            +future = session.execute_async(query)
            +future.add_callbacks(handle_success, handle_error)
            +
            +
            +
            +
            There are a few important things to remember when working with callbacks:
              +
            • Exceptions that are raised inside the callback functions will be logged and then ignored.

            • +
            • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

            • +
            +
            +
            +
            +
            +

            Setting a Consistency Level

            +

            The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

            +

            By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

            +
            from cassandra import ConsistencyLevel
            +from cassandra.query import SimpleStatement
            +
            +query = SimpleStatement(
            +    "INSERT INTO users (name, age) VALUES (%s, %s)",
            +    consistency_level=ConsistencyLevel.QUORUM)
            +session.execute(query, ('John', 42))
            +
            +
            +
            +
            +

            Setting a Consistency Level with Prepared Statements

            +

            To specify a consistency level for prepared statements, you have two options.

            +

            The first is to set a default consistency level for every execution of the +prepared statement:

            +
            from cassandra import ConsistencyLevel
            +
            +cluster = Cluster()
            +session = cluster.connect("mykeyspace")
            +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
            +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
            +
            +# these will both use QUORUM
            +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
            +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
            +
            +
            +

            The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

            +
            # override the QUORUM default
            +user3_lookup = user_lookup_stmt.bind([user_id3])
            +user3_lookup.consistency_level = ConsistencyLevel.ALL
            +user3 = session.execute(user3_lookup)
            +
            +
            +
            +
            +

            Speculative Execution

            +

            Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

            +

            To enable speculative execution:

            +
              +
            • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

            • +
            • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

            • +
            +

            Example:

            +
            from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
            +from cassandra.policies import ConstantSpeculativeExecutionPolicy
            +from cassandra.query import SimpleStatement
            +
            +# Configure the speculative execution policy
            +ep = ExecutionProfile(
            +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
            +)
            +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
            +session = cluster.connect()
            +
            +# Mark the query idempotent
            +query = SimpleStatement(
            +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
            +    is_idempotent=True
            +)
            +
            +# Execute. A new query will be sent to the server every 0.5 second
            +# until we receive a response, for a max number attempts of 10.
            +session.execute(query)
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/index.html b/3.25.11-scylla/index.html new file mode 100644 index 0000000000..78d2ff30b5 --- /dev/null +++ b/3.25.11-scylla/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Python Driver for Scylla and Apache Cassandra®

            +

            A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

            +

            The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8.

            +

            This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

            +

            Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

            +
            +

            Contents

            +
            +
            Installation

            How to install the driver.

            +
            +
            Getting Started

            A guide through the first steps of connecting to Scylla and executing queries

            +
            +
            Scylla Specific Features

            A list of feature available only on scylla-driver

            +
            +
            Execution Profiles

            An introduction to a more flexible way of configuring request execution

            +
            +
            Lightweight Transactions (Compare-and-set)

            Working with results of conditional requests

            +
            +
            Object Mapper

            Introduction to the integrated object mapper, cqlengine

            +
            +
            Performance Notes

            Tips for getting good performance.

            +
            +
            Paging Large Queries

            Notes on paging large query results

            +
            +
            Security

            An overview of the security features of the driver

            +
            +
            Upgrading

            A guide to upgrading versions of the driver

            +
            +
            User Defined Types

            Working with Scylla’s user-defined types (UDT)

            +
            +
            Working with Dates and Times

            Some discussion on the driver’s approach to working with timestamp, date, time types

            +
            +
            Scylla Cloud

            Connect to Scylla Cloud

            +
            +
            CHANGELOG

            Log of changes to the driver, organized by version.

            +
            +
            Frequently Asked Questions

            A collection of Frequently Asked Questions

            +
            +
            API Documentation

            The API documentation.

            +
            +
            +
            +
            +
            +
            +

            Getting Help

            +

            Visit the FAQ section in this documentation.

            +

            Please send questions to the Scylla user list.

            +
            +
            +

            Reporting Issues

            +

            Please report any bugs and make any feature requests on the Github project issues

            +
            + +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/installation.html b/3.25.11-scylla/installation.html new file mode 100644 index 0000000000..a711c36961 --- /dev/null +++ b/3.25.11-scylla/installation.html @@ -0,0 +1,859 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Installation

            +
            +

            Supported Platforms

            +

            Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

            +

            Linux, OSX, and Windows are supported.

            +
            +
            +

            Installation through pip

            +

            pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

            +
            pip install scylla-driver
            +
            +
            +

            You can use pip install --pre scylla-driver if you need to install a beta version.

            +

            *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

            +
            +
            +

            Verifying your Installation

            +

            To check if the installation was successful, you can run:

            +
            python -c 'import cassandra; print cassandra.__version__'
            +
            +
            +

            It should print something like “3.22.0”.

            +
            +
            +

            (Optional) Graph

            +

            The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

            +
            pip install scylla-driver[graph]
            +
            +
            +
            +
            +

            (Optional) Compression Support

            +

            Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

            +

            For lz4 support:

            +
            pip install lz4
            +
            +
            +

            For snappy support:

            +
            pip install python-snappy
            +
            +
            +

            (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

            +
            +
            +

            (Optional) Metrics Support

            +

            The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

            +
            pip install scales
            +
            +
            +
            +

            Speeding Up Installation

            +

            By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

            +

            In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

            +
            $ # installing from source
            +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
            +$ # installing from pip
            +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
            +
            +
            +
            +
            +

            OSX Installation Error

            +

            If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

            +
            clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
            +
            +
            +

            To fix this, re-run the installation with an extra compilation flag:

            +
            ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
            +
            +
            +
            +
            +
            +

            Windows Installation Notes

            +

            Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

            +

            Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

            +

            It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

            +
            +
            +

            Manual Installation

            +

            You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

            +

            Once the dependencies are installed, simply run:

            +
            python setup.py install
            +
            +
            +
            +
            +

            (Optional) Non-python Dependencies

            +

            The driver has several optional features that have non-Python dependencies.

            +
            +

            C Extensions

            +

            By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

            +

            When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

            +

            To compile the extensions, ensure that GCC and the Python headers are available.

            +

            On Ubuntu and Debian, this can be accomplished by running:

            +
            $ sudo apt-get install gcc python-dev
            +
            +
            +

            On RedHat and RedHat-based systems like CentOS and Fedora:

            +
            $ sudo yum install gcc python-devel
            +
            +
            +

            On OS X, homebrew installations of Python should provide the necessary headers.

            +

            See Windows Installation Notes for notes on configuring the build environment on Windows.

            +
            +

            Cython-based Extensions

            +

            By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

            +

            This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

            +
            python setup.py install --no-cython
            +
            +
            +

            Alternatively, an environment variable can be used to switch this option regardless of +context:

            +
            CASS_DRIVER_NO_CYTHON=1 <your script here>
            +- or, to disable all extensions:
            +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
            +
            +
            +

            This method is required when using pip, which provides no other way of injecting user options in a single command:

            +
            CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
            +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
            +
            +
            +

            The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

            +

            If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

            +
            sudo pip install six futures
            +sudo pip install --install-option="--no-cython"
            +
            +
            +
            +
            +
            +

            libev support

            +

            The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

            +

            If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

            +
            $ sudo apt-get install libev4 libev-dev
            +
            +
            +

            On RHEL/CentOS/Fedora:

            +
            $ sudo yum install libev libev-devel
            +
            +
            +

            If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

            +
            $ brew install libev
            +
            +
            +

            The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

            +

            If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

            +
            >>> from cassandra.io.libevreactor import LibevConnection
            +>>> from cassandra.cluster import Cluster
            +
            +>>> cluster = Cluster()
            +>>> cluster.connection_class = LibevConnection
            +>>> session = cluster.connect()
            +
            +
            +
            +
            +
            +

            (Optional) Configuring SSL

            +

            Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/lwt.html b/3.25.11-scylla/lwt.html new file mode 100644 index 0000000000..14b12e1fe2 --- /dev/null +++ b/3.25.11-scylla/lwt.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Lightweight Transactions (Compare-and-set)

            +

            Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

            +

            For pertinent execution parameters, see Statement.serial_consistency_level.

            +

            This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

            +
            +

            Specialized Results

            +

            The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

            +

            The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

            +
              +
            • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

            • +
            • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

            • +
            • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

            • +
            +

            How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

            +
            CREATE TABLE test.t (
            +    k int PRIMARY KEY,
            +    v int,
            +    x int
            +)
            +
            +
            +

            … the following sections show the expected result for a number of example statements, using the three base row factories.

            +
            +

            named_tuple_factory (default)

            +

            The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

            +
            >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
            +Row(applied=True)
            +
            +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
            +Row(applied=False, k=0, v=0, x=None)
            +
            +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
            +Row(applied=True)
            +
            +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
            +Row(applied=False, v=1, x=2)
            +
            +
            +
            +
            +

            tuple_factory

            +

            This return type does not refer to names, but the boolean value applied is always present in position 0:

            +
            >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
            +(True,)
            +
            +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
            +(False, 0, 0, None)
            +
            +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
            +(True,)
            +
            +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
            +(False, 1, 2)
            +
            +
            +
            +
            +

            dict_factory

            +

            The retuned dict contains the [applied] key:

            +
            >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
            +{u'[applied]': True}
            +
            +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
            +{u'x': 2, u'[applied]': False, u'v': 1}
            +
            +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
            +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
            +
            +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
            +{u'[applied]': True}
            +
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/object_mapper.html b/3.25.11-scylla/object_mapper.html new file mode 100644 index 0000000000..149b1b44cf --- /dev/null +++ b/3.25.11-scylla/object_mapper.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Object Mapper

            +

            cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

            +

            Jump to Getting Started

            +
            +

            Contents

            +
            +
            Upgrade Guide

            For migrating projects from legacy cqlengine, to the integrated product

            +
            +
            Models

            Examples defining models, and mapping them to tables

            +
            +
            Making Queries

            Overview of query sets and filtering

            +
            +
            Batch Queries

            Working with batch mutations

            +
            +
            Connections

            Working with multiple sessions

            +
            +
            API Documentation

            Index of API documentation

            +
            +
            Third party integrations

            High-level examples in Celery and uWSGI

            +
            +
            +

            Frequently Asked Questions

            +
            +
            +
            +
            +

            Getting Started

            +
            import uuid
            +from cassandra.cqlengine import columns
            +from cassandra.cqlengine import connection
            +from datetime import datetime
            +from cassandra.cqlengine.management import sync_table
            +from cassandra.cqlengine.models import Model
            +
            +#first, define a model
            +class ExampleModel(Model):
            +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
            +    example_type    = columns.Integer(index=True)
            +    created_at      = columns.DateTime()
            +    description     = columns.Text(required=False)
            +
            +#next, setup the connection to your cassandra server(s)...
            +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
            +# the list of hosts will be passed to create a Cluster() instance
            +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
            +
            +#...and create your CQL table
            +>>> sync_table(ExampleModel)
            +
            +#now we can create some rows:
            +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
            +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
            +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
            +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
            +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
            +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
            +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
            +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
            +
            +#and now we can run some queries against our table
            +>>> ExampleModel.objects.count()
            +8
            +>>> q = ExampleModel.objects(example_type=1)
            +>>> q.count()
            +4
            +>>> for instance in q:
            +>>>     print instance.description
            +example5
            +example6
            +example7
            +example8
            +
            +#here we are applying additional filtering to an existing query
            +#query objects are immutable, so calling filter returns a new
            +#query object
            +>>> q2 = q.filter(example_id=em5.example_id)
            +
            +>>> q2.count()
            +1
            +>>> for instance in q2:
            +>>>     print instance.description
            +example5
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/objects.inv b/3.25.11-scylla/objects.inv new file mode 100644 index 0000000000..11bbc4415f Binary files /dev/null and b/3.25.11-scylla/objects.inv differ diff --git a/3.25.11-scylla/performance.html b/3.25.11-scylla/performance.html new file mode 100644 index 0000000000..309ae774b0 --- /dev/null +++ b/3.25.11-scylla/performance.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Performance Notes

            +

            The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

            +

            Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

            +

            The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

            +

            Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

            +
            +

            PyPy

            +

            PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

            +
            +
            +

            Cython Extensions

            +

            Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

            +

            See Installation for details on controlling this build.

            +
            +
            +

            multiprocessing

            +

            All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

            +

            Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

            +

            For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/py-modindex.html b/3.25.11-scylla/py-modindex.html new file mode 100644 index 0000000000..b516b0e450 --- /dev/null +++ b/3.25.11-scylla/py-modindex.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + + + +
            + + + + + +
            + + +
            +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/query_paging.html b/3.25.11-scylla/query_paging.html new file mode 100644 index 0000000000..8624d04155 --- /dev/null +++ b/3.25.11-scylla/query_paging.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Paging Large Queries

            +

            Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

            +
            +

            Controlling the Page Size

            +

            By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

            +
            +
            +

            Handling Paged Results

            +

            Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

            +
            from cassandra.query import SimpleStatement
            +query = "SELECT * FROM users"  # users contains 100 rows
            +statement = SimpleStatement(query, fetch_size=10)
            +for user_row in session.execute(statement):
            +    process_user(user_row)
            +
            +
            +

            Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

            +

            If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

            +
            +
            +

            Handling Paged Results with Callbacks

            +

            If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

            +

            Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

            +
            class PagedResultHandler(object):
            +
            +    def __init__(self, future):
            +        self.error = None
            +        self.finished_event = Event()
            +        self.future = future
            +        self.future.add_callbacks(
            +            callback=self.handle_page,
            +            errback=self.handle_err)
            +
            +    def handle_page(self, rows):
            +        for row in rows:
            +            process_row(row)
            +
            +        if self.future.has_more_pages:
            +            self.future.start_fetching_next_page()
            +        else:
            +            self.finished_event.set()
            +
            +    def handle_error(self, exc):
            +        self.error = exc
            +        self.finished_event.set()
            +
            +future = session.execute_async("SELECT * FROM users")
            +handler = PagedResultHandler(future)
            +handler.finished_event.wait()
            +if handler.error:
            +    raise handler.error
            +
            +
            +
            +
            +

            Resume Paged Results

            +

            You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

            +
            from cassandra.query import SimpleStatement
            +query = "SELECT * FROM users"
            +statement = SimpleStatement(query, fetch_size=10)
            +results = session.execute(statement)
            +
            +# save the paging_state somewhere and return current results
            +web_session['paging_state'] = results.paging_state
            +
            +
            +# resume the pagination sometime later...
            +statement = SimpleStatement(query, fetch_size=10)
            +ps = web_session['paging_state']
            +results = session.execute(statement, paging_state=ps)
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/scylla_cloud.html b/3.25.11-scylla/scylla_cloud.html new file mode 100644 index 0000000000..3a7eb13c9a --- /dev/null +++ b/3.25.11-scylla/scylla_cloud.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + Scylla Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Cloud

            +

            To connect to a Scylla Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/scylla_specific.html b/3.25.11-scylla/scylla_specific.html new file mode 100644 index 0000000000..fe1123084e --- /dev/null +++ b/3.25.11-scylla/scylla_specific.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Specific Features

            +
            +

            Shard Awareness

            +

            scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

            +

            Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding

            +

            For using it you only need to enable TokenAwarePolicy on the Cluster

            +

            See the configuration of native_shard_aware_transport_port and native_shard_aware_transport_port_ssl on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol

            +
            from cassandra.cluster import Cluster
            +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
            +
            +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
            +
            +
            +
            +
            +

            New Cluster Helpers

            +
              +
            • shard_aware_options

              +

              Setting it to dict(disable=True) would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections

              +

              Other option is to configure scylla by setting enable_shard_aware_drivers: false on scylla.yaml.

              +
            • +
            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster(shard_aware_options=dict(disable=True))
            +session = cluster.connect()
            +
            +assert not cluster.is_shard_aware(), "Shard aware should be disabled"
            +
            +# or just disable the shard aware port logic
            +cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True))
            +session = cluster.connect()
            +
            +
            +
              +
            • cluster.is_shard_aware()

              +

              New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

              +
            • +
            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster()
            +session = cluster.connect()
            +
            +if cluster.is_shard_aware():
            +    print("connected to a scylla cluster")
            +
            +
            +
              +
            • cluster.shard_aware_stats()

              +

              New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

              +
            • +
            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster()
            +session = cluster.connect()
            +
            +stats = cluster.shard_aware_stats()
            +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
            +    print("successfully connected to all shards of all scylla nodes")
            +
            +
            +
            +
            +

            New Table Attributes

            +
              +
            • in_memory flag

              +

              New flag available on TableMetadata.options to indicate that it is an In Memory table

              +
            • +
            +
            +

            Note

            +

            in memory tables is a feature existing only in Scylla Enterprise

            +
            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster()
            +session = cluster.connect()
            +session.execute("""
            +    CREATE KEYSPACE IF NOT EXISTS keyspace1
            +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
            +""")
            +
            +session.execute("""
            +    CREATE TABLE IF NOT EXISTS keyspace1.standard1 (
            +        key blob PRIMARY KEY,
            +        "C0" blob
            +    ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'}
            +""")
            +
            +cluster.refresh_table_metadata("keyspace1", "standard1")
            +assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True
            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/search.html b/3.25.11-scylla/search.html new file mode 100644 index 0000000000..8aa5283747 --- /dev/null +++ b/3.25.11-scylla/search.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + + + + + +
            + + + + + +
            + + +
            +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/searchindex.js b/3.25.11-scylla/searchindex.js new file mode 100644 index 0000000000..d4598a480e --- /dev/null +++ b/3.25.11-scylla/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third_party", "cqlengine/upgrade_guide", "dates_and_times", "execution_profiles", "faq", "getting_started", "index", "installation", "lwt", "object_mapper", "performance", "query_paging", "scylla_cloud", "scylla_specific", "security", "upgrading", "user_defined_types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third_party.rst", "cqlengine/upgrade_guide.rst", "dates_and_times.rst", "execution_profiles.rst", "faq.rst", "getting_started.rst", "index.rst", "installation.rst", "lwt.rst", "object_mapper.rst", "performance.rst", "query_paging.rst", "scylla_cloud.rst", "scylla_specific.rst", "security.rst", "upgrading.rst", "user_defined_types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "Scylla Cloud", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"march": 0, "2021": 0, "ensur": [0, 3, 4, 9, 27, 39, 46, 53], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 55], "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55], "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 53, 54, 55], "invalid": [0, 1, 26, 30], "peer": [0, 5, 25], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54], "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 53], "system": [0, 5, 25, 38, 42, 43, 44, 46, 54], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 53, 54, 55], "1260": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 53, 54], "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 52], "v5": [0, 1], "checksum": 0, "1258": 0, "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 53], "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 54], "mechan": [0, 2, 3, 27, 53], "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 52, 53, 55], "astra": 0, "1265": 0, "asyncor": [0, 33, 46], "race": 0, "condit": [0, 1, 3, 8, 10, 30, 45], "caus": [0, 3, 10, 26, 37, 47], "log": [0, 3, 8, 27, 30, 31, 44, 45, 54], "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53], "shutdown": [0, 3, 39], "1266": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 54], "reserv": 0, "keyword": [0, 3, 6, 7, 9, 10], "1269": 0, "drop": [0, 6, 8, 29], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 52, 53, 54, 55], "1220": 0, "secur": [0, 45, 54], "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 53, 54], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53], "protocol_tl": [0, 53], "1264": 0, "june": 0, "2020": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 53, 54], "geomet": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 52, 53, 54, 55], "depend": [0, 2, 41, 43, 47, 49], "runtim": [0, 46, 49], "1237": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 54, 55], "use_default_tempdir": 0, "cloud": [0, 3, 27, 45], "config": [0, 53], "1245": 0, "tcp": 0, "flow": 0, "control": [0, 3, 4, 27, 30, 40, 49, 53], "libevreactor": [0, 3, 33, 46], "1248": 0, "unabl": [0, 27, 46], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 46, 48, 49, 51, 53, 55], "ubuntu": [0, 46], "04": 0, "1238": 0, "plaintextauthprovid": [0, 2, 3, 33, 53, 54], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "unicod": [0, 17, 44], "char": 0, "python3": 0, "1241": 0, "graph": [0, 3], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 52, 55], "profil": [0, 3, 4, 12, 14, 45], "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 53], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 52, 53, 54], "local_quorum": [0, 1, 44], "1240": 0, "t": [0, 9, 10, 15, 31, 37, 38, 41, 43, 44, 47, 49, 53, 54, 55], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 52, 54, 55], "boolean": [0, 1, 6, 25, 27, 44, 47], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 55], "fluent": [0, 33, 46, 54], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 53], "1239": 0, "elementmap": 0, "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 52, 55], "deseri": [0, 15, 18, 33, 41], "1233": 0, "bump": 0, "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 54, 55], "1243": 0, "gremlinpython": [0, 46], "1212": 0, "improv": [0, 1, 35, 49, 54], "core": [0, 3, 4, 38, 40, 46, 49], "1244": 0, "april": 0, "transient": 0, "replic": [0, 3, 8, 25, 40, 52], "1207": 0, "peers_v2": 0, "port": [0, 3, 5, 25, 44, 52], "discoveri": 0, "c": [0, 6, 12, 25, 27, 38, 53], "700": 0, "1228": 0, "februari": 0, "26": [0, 38], "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 52, 53, 54], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 52, 53, 54], "resultset": [0, 3, 33, 50, 54], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 53, 54, 55], "schema": [0, 3, 9, 30, 33, 37, 44, 54], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 52, 53, 54], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 54, 55], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 52, 54, 55], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "788": 0, "nativ": [0, 1, 15, 18, 29, 37, 45], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 54, 55], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 52], "1027": 0, "enabl": [0, 3, 10, 44, 52, 53, 54], "page": [0, 1, 3, 45, 51], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 54, 55], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 53, 54], "numer": [0, 41], "wrapper": [0, 27, 30], "proper": [0, 39, 46], "definit": [0, 3, 6, 15, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 53], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "1057": 0, "bulkset": 0, "1060": 0, "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 55], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 53, 54], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 52, 53, 54, 55], "classic": 0, "1090": 0, "1039": 0, "expos": [0, 31, 54], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 15, 25, 26, 30, 32, 38, 45, 54], "1019": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "more": [0, 3, 4, 6, 9, 10, 15, 25, 27, 29, 31, 38, 40, 42, 44, 45, 49, 50, 53, 54], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 53], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 52, 53, 54], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 54, 55], "1205": 0, "januari": 0, "unifi": [0, 54], "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 54], "packag": [0, 2, 32, 41, 46, 48, 53, 54], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 52, 53, 54, 55], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 53], "twist": [0, 33, 44], "1161": 0, "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "1048": 0, "flexibl": [0, 45], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 54], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 55], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 53, 55], "mismatch": 0, "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "re": [0, 27, 30, 37, 38, 39, 44, 46, 53, 55], "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 54], "cqlengineexcept": [0, 40], "1166": 0, "asyncio": [0, 33], "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "process": [0, 3, 4, 20, 43, 44, 46, 49, 52, 53, 54], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 54], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 52, 53], "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "1181": 0, "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 53], "certif": [0, 53], "hostnam": [0, 27, 53], "sslcontext": [0, 53], "check_hostnam": [0, 53], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 55], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 54], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 53], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 53, 54, 55], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 53, 54, 55], "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 53], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "warn": [0, 1, 3, 31, 40, 54], "about": [0, 3, 25, 30, 37, 41, 44, 46, 53, 54], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 52, 53, 54], "balanc": [0, 3, 33, 42, 54], "polici": [0, 3, 33, 42, 43, 44, 52, 54], "1177": 0, "1122": 0, "publish": [0, 46, 53], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 54], "next": [0, 3, 21, 27, 42, 48, 50, 53], "major": [0, 27, 42, 53, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 53, 54], "defaultloadbalancingpolici": [0, 27, 54], "integr": [0, 29, 40, 41, 45, 46, 48, 54], "1047": 0, "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 52, 53, 54], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 52, 53, 54, 55], "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 54], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 53], "unknown": [0, 15, 18, 46, 54], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 53, 55], "819": 0, "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 53, 55], "773": 0, "authprovid": [0, 2, 3, 33, 53], "transit": 0, "mode": 0, "831": 0, "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 53], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 54], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45, 52], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 54], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 53], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 53], "574": 0, "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 52, 54], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 54], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 53], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 52], "avail": [0, 3, 10, 30, 38, 45, 46, 52, 54], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 46, 47, 48, 49, 50, 52, 53, 55], "runtimeerror": 0, "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 54], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 53, 55], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 52, 53], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 53, 54], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 53, 54], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 54], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 53, 54], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 54], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 54, 55], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 52, 53, 54], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "unexpectedli": 0, "709": 0, "socket": [0, 5, 53], "associ": [0, 3, 54], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46], "clean": [0, 39, 46, 54], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 53, 54], "673": 0, "fqdn": [0, 53], "ip": [0, 3, 5, 27, 28, 44, 53], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 53, 54, 55], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 55], "empti": [0, 2, 3, 25, 47], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "around": [0, 9, 32, 40, 41, 54], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 53, 54], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 55], "789": 0, "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 53, 54, 55], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 53], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 53, 54], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 53, 54, 55], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 53], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 54], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 46, 48, 53, 54], "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 53], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 52], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44], "1009": 0, "deadlock": [0, 4], "heartbeat": 0, "whilst": 0, "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 53, 54], "flight": [0, 5], "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 54], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 53], "1044": 0, "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 52, 53, 54], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 54], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 54], "1023": 0, "param": [0, 4, 13], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 15, 27, 33, 43, 46, 52], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 55], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 53, 54], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 55], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 54], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 54, 55], "1093": 0, "incorrect": [0, 44], "compact": [0, 9, 52], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 53], "1117": 0, "built": [0, 32, 42, 46, 49, 54], "sourc": [0, 3, 15, 18, 45, 46], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 52, 54], "doesn": [0, 31, 54], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45, 52], "1127": 0, "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 53, 55], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 53], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41], "1079": 0, "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 53], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 53, 54], "1082": 0, "let": [0, 3, 54], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 53, 54], "sortedset": [0, 32, 33, 54], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 54], "1068": 0, "ssl_context": [0, 3, 44, 53], "995": 0, "encrypt": [0, 53], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 15, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 52, 53, 55], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 54, 55], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 54, 55], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 53], "releas": [0, 9, 27, 40, 42, 53, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 53, 54, 55], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 54], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 53], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 52, 53, 54], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 52, 54], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 53, 55], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 53, 54], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 54], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 54], "1015": 0, "septemb": 0, "logic": [0, 37, 52], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 52, 54], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 53], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 53, 54], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 53, 54], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 53], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 53], "loop": [0, 3, 4, 21, 33, 44, 46, 53], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 53, 54], "subclass": [0, 1, 2, 3, 27, 30, 37, 53], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 54], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 53, 54], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 53, 54, 55], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 54], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 52], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 54], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 52, 53], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 53, 54], "cassandra_vers": 0, "910": 0, "refactor": [0, 41], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 53, 54, 55], "kind": [0, 27, 54], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 54, 55], "915": 0, "authent": [0, 1, 3, 33], "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 55], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 53, 55], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 55], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 54, 55], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 55], "865": 0, "deprecationwarn": [0, 54], "846": 0, "example_mapp": 0, "py": [0, 46], "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 53, 54], "execute_concurr": [0, 4, 33, 49], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 53], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 53], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 54], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 54], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 54, 55], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 54], "810": 0, "833": 0, "juli": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 53, 54], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46, 52], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 54], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 53], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 53], "772": 0, "pool": [0, 1, 3, 33, 54], "739": 0, "murmur3": [0, 3, 46], "big": [0, 52], "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 54], "785": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 53], "464": 0, "inupt": 0, "microsecond": [0, 31, 54], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "pr": 0, "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 52, 55], "705": 0, "get_query_trac": [0, 3, 43, 54], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 54], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44], "drain": 0, "734": 0, "resulset": 0, "trace": [0, 3, 33], "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 52, 54], "grow": 0, "720": 0, "size": [0, 3, 10, 54], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 52, 53, 54, 55], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 53], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "callback": [0, 3, 10, 44, 49, 53], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 54], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 52, 53], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 54], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 52], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 54], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 54], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 54], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 54], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 54], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 53, 54, 55], "lead": [0, 34, 49, 54], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 54, 55], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 53, 54], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 53, 54], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47, 52], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 53], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 54], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 54], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 55], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 54], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 54], "stat": [0, 26, 52], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 52, 54], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 53, 54], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 53, 54], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 54], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "alias": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 54], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 52], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "569": 0, "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 53], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 54, 55], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "compat": [0, 3, 18, 25, 33, 54], "434": 0, "unicodedecodeerror": 0, "bop": 0, "559": 0, "565": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 53, 54, 55], "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 52], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46, 52], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 54], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 53, 54], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 53, 54], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 53, 54], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 54], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 54, 55], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 53], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 54], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 53], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 52, 54], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 54], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 54], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 52, 53], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 52], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53], "489": 0, "typo": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": [0, 52], "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 54, 55], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 54], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55], "might": [0, 3, 30, 50, 53], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 53, 55], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 53, 54], "access": [0, 3, 9, 26, 30, 37, 44, 54], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 53, 54], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 53, 54, 55], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 53, 54], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28], "dc": [0, 3, 27, 54], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 54], "408": [0, 54], "400": [0, 54], "422": [0, 54], "292": [0, 54], "318": [0, 54], "368": [0, 54], "371": 0, "blist": 0, "soft": 0, "385": [0, 54], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44], "178": [0, 30, 54], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "well": [0, 27, 35, 44, 53], "pagedresult": [0, 50, 54], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "397": 0, "398": 0, "extens": [0, 3, 27, 41, 52], "file": [0, 40, 49, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 55], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 54], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 54], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 54], "round": [0, 27, 32], "341": 0, "sizeti": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55], "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 54], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 53], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 54], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 53], "patch": [0, 21, 22, 41, 53], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 53], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 54], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 54], "243": 0, "kerbero": [0, 53], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 54], "192": [0, 3, 44], "stream": [0, 29], "set_keyspac": [0, 3, 27, 44, 55], "195": 0, "implicit": [0, 10, 54], "204": 0, "collis": 0, "sasl": [0, 2, 53], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 54], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 54], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 54], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27], "contact_point": [0, 3, 7, 27, 53], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 54], "88": 0, "constructor": [0, 3, 6, 38], "basi": [0, 54], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 52], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53, 54], "use_client_timestamp": [0, 1, 3, 54], "overrid": [0, 3, 9, 15, 18, 42, 44, 54], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 52, 55], "refer": [0, 10, 34, 40, 42, 47, 54], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 54], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 54], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 53, 54, 55], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 54], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 53, 54, 55], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 53], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 53, 54, 55], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 53, 54], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 52], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 54], "help": [0, 38, 54], "done": [0, 3, 37, 41, 43, 53, 54], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 53, 54], "guarante": [0, 27, 30, 54], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 54, 55], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 53], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 52, 53, 54, 55], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 53, 54, 55], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 54], "left": [0, 3, 4, 9, 41, 54], "place": [0, 40, 44, 54], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 54], "dict_factori": [0, 3, 7, 16, 30, 33, 54], "ordered_dict_factori": [0, 3, 16, 30, 33, 54], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 53, 54, 55], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 54], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 54], "executor": 0, "becom": [0, 3, 8, 49, 54], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 53, 54], "lowercas": 0, "liter": [0, 15, 17, 18, 30, 41, 44, 54, 55], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 54], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 54, 55], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 53, 54], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 52, 53, 54], "never": [0, 27, 34, 47, 49, 54], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 52, 54], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": [0, 54], "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 53, 54], "main": [0, 3, 53, 55], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 49, 52, 53, 54], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 53, 54], "strong": 0, "garbag": [0, 54], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 54], "twice": 0, "had": [0, 40, 54], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 55], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 52], "parallel": 0, "sesssion": 0, "effort": [0, 40, 53], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 53], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 54], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 53], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 52], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 53], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 53], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 54, 55], "constant": [0, 53], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 54], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 53, 54], "ONE": [1, 3, 10, 40, 54], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 55], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 55], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 52, 53, 55], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 52, 55], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 54, 55], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 55], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 53], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 54], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27, 52], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 52], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 54], "higher": [1, 3, 4, 30, 53, 54], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 54], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 53], "author": [1, 53], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 54], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 53], "usernam": [2, 44, 53], "password": [2, 53], "passwordauthent": [2, 53], "auth_provid": [2, 3, 53], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 53], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 52, 53, 54, 55], "servic": [2, 53], "someth": [2, 27, 37, 38, 46, 53], "qop": [2, 53], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 53], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 53], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "mutabl": 3, "load_balancing_polici": [3, 27, 42, 44, 52], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 52, 53, 54], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 53], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 53, 55], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 53, 54], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50, 52], "purpos": [3, 6], "register_user_typ": [3, 54, 55], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 53, 54], "whose": 3, "mykeyspac": [3, 30, 44, 54, 55], "street": [3, 11, 37, 54, 55], "zipcod": [3, 11, 37, 54, 55], "locat": [3, 40, 53, 55], "def": [3, 27, 34, 37, 39, 43, 44, 50, 53, 54, 55], "self": [3, 15, 18, 37, 50, 54, 55], "INTO": [3, 4, 30, 44, 47, 55], "st": [3, 37, 55], "78723": [3, 55], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 55], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 54], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 54], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 53], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": [3, 52], "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 53], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 54], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 54], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 55], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "24": 3, "appropri": [3, 37, 46, 53], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 54], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 53], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 53], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 53, 54], "placehold": [3, 15, 18, 30, 44, 55], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 53], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 54], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 55], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 53], "expir": 3, "exceed": [3, 4], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 54], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 53], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 53, 54], "backward": [3, 18, 25, 54], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 53], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 54, 55], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 54], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 53], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 53], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 52], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 53], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 53], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 52], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 52], "www": 6, "com": [6, 10, 52, 53], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 52], "durable_writ": 8, "simplestrategi": [8, 25, 52], "caution": [8, 37], "product": [8, 48, 53, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 53, 54], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 52, 55], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 54], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 53], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 54], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 54], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 54], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 53], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 53], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 53], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 54], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 54], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "val": 15, "concis": 15, "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 54], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 53], "handle_fork": 20, "eventletconnect": [21, 33, 53], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 54], "twistedconnect": [24, 33, 53], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 54], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "replicationfactor": 25, "all_replica": 25, "transient_replica": 25, "options_map": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 53], "pmfstat": 26, "latenc": [26, 44, 52], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 53], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 52], "evenli": 27, "what": [27, 30, 37, 41, 53, 54, 55], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 53], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 53], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 52, 54], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 53, 54], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 53, 54], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 53], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 53], "silent": 27, "idea": 27, "best": [27, 44, 51, 53], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 53], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 53], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 54], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 53], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "23": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "asyncioreactor": 33, "eventletreactor": 33, "twistedreactor": [33, 53], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 53], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 52], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41, 54], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 53], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 53, 54], "presist": 37, "pattern": [37, 49], "joe": [37, 53], "99999": 37, "ll": [38, 53], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 53], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 54], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 52], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 54], "scylla": [38, 40, 46, 54], "21": [38, 54], "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "17": [38, 53], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45, 54], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 54], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 54], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 54], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": 42, "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 54, 55], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 53], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 55], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49], "handle_success": 44, "rememb": 44, "user1": [44, 53], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "upgrad": [45, 48, 53], "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 54], "reinstal": 46, "22": 46, "abl": 46, "snappi": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 53], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": [46, 52], "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 53], "mussei": [46, 53], "thorough": [46, 53], "outcom": 47, "pertin": 47, "appear": 47, "reject": 47, "statu": [47, 52], "squar": 47, "bracket": 47, "AND": [47, 52], "retun": 47, "jump": 48, "migrat": [48, 54], "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 53], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "p": 50, "onward": 52, "scylladb": 52, "md": 52, "intranod": 52, "native_shard_aware_transport_port": 52, "native_shard_aware_transport_port_ssl": 52, "shard_aware_opt": 52, "enable_shard_aware_driv": 52, "is_shard_awar": 52, "disable_shardaware_port": 52, "shard_aware_stat": 52, "shards_count": 52, "in_memori": 52, "enterpris": 52, "keyspace1": 52, "standard1": 52, "c0": 52, "inmemorycompactionstrategi": 52, "get_credenti": 53, "host_address": 53, "1234": 53, "wrap_socket": 53, "create_default_context": 53, "server_hostnam": 53, "keystor": 53, "intruct": 53, "cert": 53, "understand": 53, "demonstr": 53, "deploy": 53, "client_encryption_opt": 53, "keystore_password": 53, "mystorepass": 53, "require_client_auth": 53, "veri": 53, "verify_mod": 53, "cert_requir": 53, "load_verify_loc": 53, "rootca": 53, "crt": 53, "truststor": 53, "jk": 53, "truststore_password": 53, "pem": 53, "conf": 53, "gen_client_cert": 53, "eof": 53, "req": 53, "distinguished_nam": 53, "req_distinguished_nam": 53, "output_password": 53, "root_cert_pass": 53, "default_bit": 53, "2048": 53, "cert_countri": 53, "cert_org_nam": 53, "ou": 53, "cert_ou": 53, "cn": 53, "root": 53, "Then": 53, "openssl": 53, "newkei": 53, "rsa": 53, "keyout": 53, "csr": 53, "x509": 53, "root_ca_base_nam": 53, "cakei": 53, "passin": 53, "crt_sign": 53, "cert_valid": 53, "cacreateseri": 53, "load_cert_chain": 53, "certfil": 53, "keyfil": 53, "crypto": 53, "tlsv1_2_method": 53, "set_verifi": 53, "verify_p": 53, "lambda": 53, "_1": 53, "_2": 53, "_3": 53, "_4": 53, "use_certificate_fil": 53, "use_privatekey_fil": 53, "ca_cert": 53, "ssl_version": 53, "ssl_opt": 53, "my": 53, "cert_req": 53, "risen": 53, "advanc": 53, "dseplaintextauthprovid": 53, "act": 53, "permiss": 53, "grant": 53, "role": 53, "plain": 53, "authorization_id": 53, "ticket": 53, "kinit": 53, "offici": [53, 54], "fulli": 54, "benefit": 54, "dse_graph": 54, "swap": 54, "rework": 54, "mesh": 54, "afterward": 54, "got": 54, "row_list": 54, "first_result": 54, "variant": 54, "brought": 54, "overhaul": 54, "highlight": 54, "nomenclatur": 54, "keyspace_nam": 54, "031ebb0": 54, "refresh_": 54, "_metadata": 54, "419fcdf": 54, "submit_schema_refresh": 54, "574266d": 54, "cqltype": 54, "bb984ee": 54, "e16a073": 54, "cc94073": 54, "from_datetim": 54, "96489cc": 54, "a2d3a98": 54, "4bd5909": 54, "__polymorphic_": 54, "__discrimin": 54, "9d98c8e": 54, "79efe97": 54, "citi": 54, "zip": [54, 55], "though": 54, "notabl": 54, "simpler": 54, "unclean": 54, "tell": 55, "insert_stat": 55, "otherstuff": 55, "first_row": 55, "fine": 55, "unprepar": 55, "parameter": 55, "interpol": 55}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph": [[12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 3, 1, "", "ReplicationFactor"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 53, 54], "25": 0, "0": [0, 53, 54], "featur": [0, 29, 52, 54], "bug": 0, "fix": 0, "other": 0, "24": 0, "23": 0, "22": 0, "21": 0, "deprec": [0, 40, 54], "20": 0, "2": [0, 54], "1": [0, 54], "19": 0, "18": 0, "17": 0, "16": [0, 53], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 54], "x": [0, 54], "upgrad": [0, 40, 54], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 54], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 53, 54], "cluster": [3, 42, 44, 52, 54], "session": [3, 44, 54], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 54], "execut": [4, 34, 42, 44, 53, 54], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 54], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 54, 55], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 55], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38, 52], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 54], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 55], "user": [11, 37, 54, 55], "defin": [11, 37, 54, 55], "datastax": [12, 13, 14, 15, 33], "graph": [12, 13, 14, 15, 18, 33, 46, 54], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 54], "format": 16, "encod": [17, 54], "non": [17, 46, 54], "prepar": [17, 30, 44, 54], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 53], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 53], "metadata": [25, 54], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 53], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 53, 54], "custom": [29, 53, 54], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 54], "trace": [30, 43, 54], "timestamp": [31, 41, 54], "gener": [31, 34], "api": [33, 40, 54], "document": 33, "core": 33, "driver": [33, 43, 45, 54], "mapper": [33, 48], "us": [34, 42, 54, 55], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 55], "new": [35, 52], "chang": [35, 40, 54], "default": [35, 38, 42, 47, 54], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 54], "work": [36, 41, 54], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 54], "delet": 36, "individu": 36, "exampl": [37, 53], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 54], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 54], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 54], "organ": 40, "import": [40, 54], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": [42, 44], "legaci": 42, "paramet": [42, 44, 54], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 55], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "keyspac": 44, "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 54], "specul": 44, "python": [45, 46], "scylla": [45, 51, 52], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 54], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 53], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": 46, "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 54], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 54], "configur": [46, 53], "ssl": [46, 53], "lightweight": [47, 54], "transact": [47, 54], "compar": 47, "special": 47, "result": [47, 50, 54], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 54], "larg": 50, "control": 50, "size": 50, "resum": 50, "cloud": 51, "specif": 52, "shard": 52, "awar": 52, "helper": 52, "attribut": 52, "secur": 53, "v1": 53, "No": 53, "ident": 53, "verif": 53, "client": [53, 54], "version": 53, "lower": 53, "dse": [53, 54], "unifi": 53, "proxi": 53, "login": 53, "modul": 54, "execute_async": 54, "now": 54, "local_on": 54, "normal": 54, "inform": 54, "attach": 54, "bind": 54, "ignor": 54, "extra": 54, "blist": 54, "soft": 54, "sever": 54, "v3": 54, "nativ": 54, "side": 54, "v2": 54, "automat": 54, "sasl": 54, "call": 54, "shutdown": 54, "udt": 55, "dict": 55, "them": 55}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Frequently Asked Questions": [[36, "frequently-asked-questions"], [43, "frequently-asked-questions"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Execution Profiles": [[42, "execution-profiles"], [44, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "Model Inheritance": [[37, "model-inheritance"], [40, "model-inheritance"]], "User Defined Types": [[37, "user-defined-types"], [55, "user-defined-types"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Registering a UDT": [[55, "registering-a-udt"]], "Map a Class to a UDT": [[55, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[55, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[55, "using-udts-without-registering-them"]], "Security": [[53, "security"]], "Authentication": [[53, "authentication"]], "Custom Authenticators": [[53, "custom-authenticators"]], "Protocol v1 Authentication": [[53, "protocol-v1-authentication"]], "SSL": [[53, "ssl"]], "SSL with Twisted or Eventlet": [[53, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[53, "ssl-configuration-examples"]], "No identity verification": [[53, "no-identity-verification"]], "Client verifies server": [[53, "client-verifies-server"]], "Server verifies client": [[53, "server-verifies-client"]], "Server verifies client and client verifies server": [[53, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[53, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[53, "ssl-with-twisted"]], "DSE Authentication": [[53, "dse-authentication"]], "DSE Unified Authentication": [[53, "dse-unified-authentication"]], "Proxy Login": [[53, "proxy-login"]], "Proxy Execute": [[53, "proxy-execute"]], "Installation": [[46, "installation"], [54, "installation"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) Graph": [[46, "optional-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "Upgrading": [[54, "upgrading"]], "Upgrading from dse-driver": [[54, "upgrading-from-dse-driver"]], "Import from the cassandra module": [[54, "import-from-the-cassandra-module"]], "dse-graph": [[54, "dse-graph"]], "Session.execute and Session.execute_async API": [[54, "session-execute-and-session-execute-async-api"]], "Deprecations": [[54, "deprecations"], [54, "id2"], [0, "deprecations"], [0, "id38"], [0, "id163"]], "Upgrading to 3.0": [[54, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[54, "default-consistency-is-now-local-one"]], "Execution API Updates": [[54, "execution-api-updates"]], "Result return normalization": [[54, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[54, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[54, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[54, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[54, "metadata-api-updates"]], "Several deprecated features are removed": [[54, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[54, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[54, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[54, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[54, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[54, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[54, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[54, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[54, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[54, "protocol-level-batch-statements"]], "SASL-based Authentication": [[54, "sasl-based-authentication"]], "Lightweight Transactions": [[54, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[54, "calling-cluster-shutdown"]], "Dependency Changes": [[54, "dependency-changes"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Contents": [[45, "contents"], [48, "contents"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "Scylla Cloud": [[51, "scylla-cloud"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Scylla Specific Features": [[52, "scylla-specific-features"]], "Shard Awareness": [[52, "shard-awareness"]], "New Cluster Helpers": [[52, "new-cluster-helpers"]], "New Table Attributes": [[52, "new-table-attributes"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Connecting to a Cluster": [[44, "connecting-to-a-cluster"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Session Keyspace": [[44, "session-keyspace"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "CHANGELOG": [[0, "changelog"]], "3.25.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id7"], [0, "id10"], [0, "id13"], [0, "id16"], [0, "id23"], [0, "id26"], [0, "id30"], [0, "id35"], [0, "id45"], [0, "id49"], [0, "id52"], [0, "id56"], [0, "id60"], [0, "id64"], [0, "id68"], [0, "id74"], [0, "id80"], [0, "id83"], [0, "id86"], [0, "id91"], [0, "id94"], [0, "id99"], [0, "id104"], [0, "id108"], [0, "id110"], [0, "id117"], [0, "id121"], [0, "id123"], [0, "id128"], [0, "id131"], [0, "id134"], [0, "id137"], [0, "id140"], [0, "id148"], [0, "id155"], [0, "id157"], [0, "id161"], [0, "id165"], [0, "id171"], [0, "id181"], [0, "id183"], [0, "id188"], [0, "id191"], [0, "id193"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id8"], [0, "id11"], [0, "id14"], [0, "id17"], [0, "id19"], [0, "id21"], [0, "id24"], [0, "id27"], [0, "id31"], [0, "id33"], [0, "id36"], [0, "id40"], [0, "id43"], [0, "id46"], [0, "id53"], [0, "id57"], [0, "id61"], [0, "id65"], [0, "id69"], [0, "id72"], [0, "id75"], [0, "id78"], [0, "id81"], [0, "id84"], [0, "id87"], [0, "id89"], [0, "id92"], [0, "id95"], [0, "id100"], [0, "id102"], [0, "id105"], [0, "id109"], [0, "id111"], [0, "id113"], [0, "id115"], [0, "id118"], [0, "id120"], [0, "id122"], [0, "id124"], [0, "id126"], [0, "id129"], [0, "id132"], [0, "id135"], [0, "id138"], [0, "id141"], [0, "id144"], [0, "id146"], [0, "id149"], [0, "id151"], [0, "id153"], [0, "id156"], [0, "id158"], [0, "id162"], [0, "id166"], [0, "id169"], [0, "id172"], [0, "id175"], [0, "id178"], [0, "id180"], [0, "id184"], [0, "id186"], [0, "id189"], [0, "id192"], [0, "id194"], [0, "id196"]], "Others": [[0, "others"], [0, "id5"], [0, "id15"]], "3.24.0": [[0, "id2"]], "3.23.0": [[0, "id6"]], "3.22.0": [[0, "id9"]], "3.21.0": [[0, "id12"]], "Other": [[0, "other"], [0, "id28"], [0, "id37"], [0, "id41"], [0, "id47"], [0, "id50"], [0, "id54"], [0, "id58"], [0, "id62"], [0, "id66"], [0, "id70"], [0, "id76"], [0, "id106"], [0, "id142"], [0, "id147"], [0, "id159"], [0, "id167"], [0, "id173"], [0, "id176"], [0, "id179"], [0, "id182"], [0, "id185"], [0, "id187"], [0, "id190"], [0, "id195"]], "3.20.2": [[0, "id18"]], "3.20.1": [[0, "id20"]], "3.20.0": [[0, "id22"]], "3.19.0": [[0, "id25"]], "3.18.0": [[0, "id29"]], "3.17.1": [[0, "id32"]], "3.17.0": [[0, "id34"]], "3.16.0": [[0, "id39"]], "3.15.1": [[0, "id42"]], "3.15.0": [[0, "id44"]], "3.14.0": [[0, "id48"]], "3.13.0": [[0, "id51"]], "3.12.0": [[0, "id55"]], "3.11.0": [[0, "id59"]], "3.10.0": [[0, "id63"]], "3.9.0": [[0, "id67"]], "3.8.1": [[0, "id71"]], "3.8.0": [[0, "id73"]], "3.7.1": [[0, "id77"]], "3.7.0": [[0, "id79"]], "3.6.0": [[0, "id82"]], "3.5.0": [[0, "id85"]], "3.4.1": [[0, "id88"]], "3.4.0": [[0, "id90"]], "3.3.0": [[0, "id93"]], "3.2.2": [[0, "id96"]], "3.2.1": [[0, "id97"]], "3.2.0": [[0, "id98"]], "3.1.1": [[0, "id101"]], "3.1.0": [[0, "id103"]], "3.0.0": [[0, "id107"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id112"]], "2.7.1": [[0, "id114"]], "2.7.0": [[0, "id116"]], "2.6.0": [[0, "id119"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id125"]], "2.5.0": [[0, "id127"]], "2.1.4": [[0, "id130"]], "2.1.3": [[0, "id133"]], "2.1.2": [[0, "id136"]], "2.1.1": [[0, "id139"]], "2.1.0": [[0, "id143"]], "2.1.0c1": [[0, "id145"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id150"]], "2.0.1": [[0, "id152"]], "2.0.0": [[0, "id154"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id160"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id164"]], "1.1.1": [[0, "id168"]], "1.1.0": [[0, "id170"]], "1.0.2": [[0, "id174"]], "1.0.1": [[0, "id177"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationfactor (class in cassandra.metadata)": [[25, "cassandra.metadata.ReplicationFactor"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/3.25.11-scylla/security.html b/3.25.11-scylla/security.html new file mode 100644 index 0000000000..6cc0fa1efd --- /dev/null +++ b/3.25.11-scylla/security.html @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Security

            +

            The two main security components you will use with the +Python driver are Authentication and SSL.

            +
            +

            Authentication

            +

            Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

            +

            For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

            +
            from cassandra.cluster import Cluster
            +from cassandra.auth import PlainTextAuthProvider
            +
            +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
            +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
            +
            +
            +
            +

            Custom Authenticators

            +

            If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

            +
            +
            +

            Protocol v1 Authentication

            +

            When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

            +
            from cassandra.cluster import Cluster
            +
            +def get_credentials(host_address):
            +    return {'username': 'joe', 'password': '1234'}
            +
            +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
            +
            +
            +
            +
            +
            +

            SSL

            +

            SSL should be used when client encryption is enabled in Cassandra.

            +

            To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

            +

            To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

            +

            If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

            +

            The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

            + +

            It might be also useful to learn about the different levels of identity verification to understand the examples:

            + +
            +

            SSL with Twisted or Eventlet

            +

            Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

            +
            +
            +

            SSL Configuration Examples

            +

            Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

            +
            +

            No identity verification

            +

            No identity verification at all. Note that this is not recommended for for production deployments.

            +

            The Cassandra configuration:

            +
            client_encryption_options:
            +  enabled: true
            +  keystore: /path/to/127.0.0.1.keystore
            +  keystore_password: myStorePass
            +  require_client_auth: false
            +
            +
            +

            The driver configuration:

            +
            from cassandra.cluster import Cluster, Session
            +from ssl import SSLContext, PROTOCOL_TLS
            +
            +ssl_context = SSLContext(PROTOCOL_TLS)
            +
            +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
            +session = cluster.connect()
            +
            +
            +
            +
            +

            Client verifies server

            +

            Ensure the python driver verifies the identity of the server.

            +

            The Cassandra configuration:

            +
            client_encryption_options:
            +  enabled: true
            +  keystore: /path/to/127.0.0.1.keystore
            +  keystore_password: myStorePass
            +  require_client_auth: false
            +
            +
            +

            For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

            +
            from cassandra.cluster import Cluster, Session
            +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
            +
            +ssl_context = SSLContext(PROTOCOL_TLS)
            +ssl_context.load_verify_locations('/path/to/rootca.crt')
            +ssl_context.verify_mode = CERT_REQUIRED
            +
            +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
            +session = cluster.connect()
            +
            +
            +

            Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

            +
            from cassandra.cluster import Cluster, Session
            +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
            +
            +ssl_context = SSLContext(PROTOCOL_TLS)
            +ssl_context.load_verify_locations('/path/to/rootca.crt')
            +ssl_context.verify_mode = CERT_REQUIRED
            +ssl_context.check_hostname = True
            +ssl_options = {'server_hostname': '127.0.0.1'}
            +
            +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
            +session = cluster.connect()
            +
            +
            +
            +
            +

            Server verifies client

            +

            If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

            +

            The cassandra configuration:

            +
            client_encryption_options:
            +  enabled: true
            +  keystore: /path/to/127.0.0.1.keystore
            +  keystore_password: myStorePass
            +  require_client_auth: true
            +  truststore: /path/to/dse-truststore.jks
            +  truststore_password: myStorePass
            +
            +
            +

            The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

            +
            cat > gen_client_cert.conf <<EOF
            +[ req ]
            +distinguished_name = req_distinguished_name
            +prompt = no
            +output_password = ${ROOT_CERT_PASS}
            +default_bits = 2048
            +
            +[ req_distinguished_name ]
            +C = ${CERT_COUNTRY}
            +O = ${CERT_ORG_NAME}
            +OU = ${CERT_OU}
            +CN = client
            +EOF
            +
            +
            +

            Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

            +
            openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
            +
            +
            +

            And generate the client signed certificate:

            +
            openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
            +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
            +
            +
            +

            Finally, you can use that configuration with the following driver code:

            +
            from cassandra.cluster import Cluster, Session
            +from ssl import SSLContext, PROTOCOL_TLS
            +
            +ssl_context = SSLContext(PROTOCOL_TLS)
            +ssl_context.load_cert_chain(
            +    certfile='/path/to/client.crt_signed',
            +    keyfile='/path/to/client.key')
            +
            +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
            +session = cluster.connect()
            +
            +
            +
            +
            +

            Server verifies client and client verifies server

            +

            See the previous section for examples of Cassandra configuration and preparing +the client certificates.

            +

            The following driver code specifies that the connection should use two-way verification:

            +
            from cassandra.cluster import Cluster, Session
            +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
            +
            +ssl_context = SSLContext(PROTOCOL_TLS)
            +ssl_context.load_verify_locations('/path/to/rootca.crt')
            +ssl_context.verify_mode = CERT_REQUIRED
            +ssl_context.load_cert_chain(
            +    certfile='/path/to/client.crt_signed',
            +    keyfile='/path/to/client.key')
            +
            +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
            +session = cluster.connect()
            +
            +
            +

            The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

            +

            Server verifies client and client verifies server using Twisted and pyOpenSSL

            +
            from OpenSSL import SSL, crypto
            +from cassandra.cluster import Cluster
            +from cassandra.io.twistedreactor import TwistedConnection
            +
            +ssl_context = SSL.Context(SSL.TLSv1_2_METHOD)
            +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
            +ssl_context.use_certificate_file('/path/to/client.crt_signed')
            +ssl_context.use_privatekey_file('/path/to/client.key')
            +ssl_context.load_verify_locations('/path/to/rootca.crt')
            +
            +cluster = Cluster(
            +    contact_points=['127.0.0.1'],
            +    connection_class=TwistedConnection,
            +    ssl_context=ssl_context,
            +    ssl_options={'check_hostname': True}
            +)
            +session = cluster.connect()
            +
            +
            +

            Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

            +
            +
            +
            +

            Versions 3.16.0 and lower

            +

            To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

            +

            By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLS to match +Cassandra’s default protocol.

            +

            For example:

            +
            from cassandra.cluster import Cluster
            +from ssl import PROTOCOL_TLS, CERT_REQUIRED
            +
            +ssl_opts = {
            +    'ca_certs': '/path/to/my/ca.certs',
            +    'ssl_version': PROTOCOL_TLS,
            +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
            +}
            +cluster = Cluster(ssl_options=ssl_opts)
            +
            +
            +

            This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

            +
            +

            SSL with Twisted

            +

            In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

            +
            +
            +
            +
            +

            DSE Authentication

            +

            When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

            +
            from cassandra.auth import DSEGSSAPIAuthProvider
            +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
            +cluster = Cluster(auth_provider=auth_provider)
            +session = cluster.connect()
            +
            +
            +

            Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

            +
            +

            DSE Unified Authentication

            +

            With DSE (>=5.1), unified Authentication allows you to:

            +
              +
            • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

            • +
            • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

            • +
            +
            +

            Proxy Login

            +

            Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

            +
            GRANT PROXY.LOGIN on role user1 to server
            +
            +
            +

            then you can do the proxy authentication….

            +
            from cassandra.cluster import Cluster
            +from cassandra.auth import SaslAuthProvider
            +
            +sasl_kwargs = {
            +  "service": 'dse',
            +  "mechanism":"PLAIN",
            +  "username": 'server',
            +  'password': 'server',
            +  'authorization_id': 'user1'
            +}
            +
            +auth_provider = SaslAuthProvider(**sasl_kwargs)
            +c = Cluster(auth_provider=auth_provider)
            +s = c.connect()
            +s.execute(...)  # all requests will be executed as 'user1'
            +
            +
            +

            If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

            +
            from cassandra.cluster import Cluster
            +from cassandra.auth import DSEGSSAPIAuthProvider
            +
            +# Ensure the kerberos ticket of the server user is set with the kinit utility.
            +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
            +                                      authorization_id='user1@DATASTAX.COM')
            +c = Cluster(auth_provider=auth_provider)
            +s = c.connect()
            +s.execute(...)  # all requests will be executed as 'user1'
            +
            +
            +
            +
            +

            Proxy Execute

            +

            Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

            +
            GRANT PROXY.EXECUTE on role user1 to server
            +
            +
            +

            then you can do a proxy execute…

            +
            from cassandra.cluster import Cluster
            +from cassandra.auth import DSEPlainTextAuthProvider,
            +
            +auth_provider = DSEPlainTextAuthProvider('server', 'server')
            +
            +c = Cluster(auth_provider=auth_provider)
            +s = c.connect()
            +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
            +
            +
            +

            Please see the official documentation for more details on the feature and configuration process.

            +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/sitemap.xml b/3.25.11-scylla/sitemap.xml new file mode 100644 index 0000000000..c384357dc8 --- /dev/null +++ b/3.25.11-scylla/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/user_defined_types.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade_guide.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/dates_and_times.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/execution_profiles.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/getting_started.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third_party.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/object_mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query_paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_specific.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/3.25.11-scylla/upgrading.html b/3.25.11-scylla/upgrading.html new file mode 100644 index 0000000000..634628479a --- /dev/null +++ b/3.25.11-scylla/upgrading.html @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Upgrading

            +
            +
            +
            +

            Upgrading from dse-driver

            +

            Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes.

            +
            +

            Installation

            +

            Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

            +
            pip install scylla-driver
            +
            +
            +

            If you need the Graph Fluent API (features provided by dse-graph):

            +
            pip install scylla-driver[graph]
            +
            +
            +

            See Installation for more details.

            +
            +
            +

            Import from the cassandra module

            +

            There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

            +
            from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
            +from dse.auth import PlainTextAuthProvider
            +from dse.policies import WhiteListRoundRobinPolicy
            +
            +# becomes
            +
            +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
            +from cassandra.auth import PlainTextAuthProvider
            +from cassandra.policies import WhiteListRoundRobinPolicy
            +
            +
            +

            Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

            +
            +
            +

            dse-graph

            +

            dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

            +
            from dse_graph import ..
            +from dse_graph.query import ..
            +
            +# becomes
            +
            +from cassandra.datastax.graph.fluent import ..
            +from cassandra.datastax.graph.fluent.query import ..
            +
            +
            +

            See fluent.

            +
            +
            +

            Session.execute and Session.execute_async API

            +

            Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

            +

            See Session.execute().

            +
            +
            +

            Deprecations

            +

            These changes are optional, but recommended:

            +
              +
            • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

            • +
            • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

            • +
            +
            +
            +
            +

            Upgrading to 3.0

            +

            Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

            +
            +

            Default consistency is now LOCAL_ONE

            +

            Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

            +
            +
            +

            Execution API Updates

            +
            +

            Result return normalization

            +

            PYTHON-368

            +

            Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

            +

            Now, all results are returned as an iterable ResultSet.

            +

            The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

            +
            results = session.execute("SELECT * FROM system.local")
            +for row in results:
            +    process(row)
            +
            +
            +

            If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

            +
            results = session.execute("SELECT * FROM system.local")
            +row_list = list(results)
            +
            +
            +

            For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

            +
            results = session.execute("SELECT * FROM system.local")
            +first_result = results[0]  # materializes results, fetching all pages
            +
            +
            +

            This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

            +
            +
            +

            Trace information is not attached to executed Statements

            +

            PYTHON-318

            +

            Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

            +

            Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

            +

            ResponseFuture.get_query_trace()

            +

            ResponseFuture.get_all_query_traces()

            +

            ResultSet.get_query_trace()

            +

            ResultSet.get_all_query_traces()

            +
            +
            +

            Binding named parameters now ignores extra names

            +

            PYTHON-178

            +

            Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

            +

            Behavior in 3.0+ is to ignore extra names.

            +
            +
            +
            +

            blist removed as soft dependency

            +

            PYTHON-385

            +

            Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

            +

            Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

            +
            +
            +

            Metadata API Updates

            +

            PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

            +

            Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

            +

            The present API is documented: cassandra.metadata. Changes highlighted below:

            +
              +
            • All types are now exposed as CQL types instead of types derived from the internal server implementation

            • +
            • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

            • +
            • Some metadata attributes removed

              +
                +
              • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

              • +
              • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

              • +
              +
            • +
            +
            +
            +

            Several deprecated features are removed

            +

            PYTHON-292

            +
              +
            • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

            • +
            • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

            • +
            • Cluster.submit_schema_refresh removed (574266d)

            • +
            • cqltypes time/date functions removed, use util entry points instead (bb984ee)

            • +
            • decoder module removed (e16a073)

            • +
            • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

            • +
            • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

            • +
            • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

            • +
            • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

            • +
            • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

            • +
            • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

            • +
            +
            +
            +
            +

            Upgrading to 2.1 from 2.0

            +

            Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

            +

            Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

            +
            +

            Using the v3 Native Protocol

            +

            By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster(protocol_version=3)
            +
            +
            +

            Note that protocol version 3 is only supported by Cassandra 2.1+.

            +

            In future releases, the driver may default to using protocol version +3.

            +
            +
            +

            Working with User-Defined Types

            +

            Cassandra 2.1 introduced the ability to define new types:

            +
            USE KEYSPACE mykeyspace;
            +
            +CREATE TYPE address (street text, city text, zip int);
            +
            +
            +

            The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

            +
            cluster = Cluster()
            +
            +class Address(object):
            +
            +    def __init__(self, street, city, zipcode):
            +        self.street = street
            +        self.city = text
            +        self.zipcode = zipcode
            +
            +cluster.register_user_type('mykeyspace', 'address', Address)
            +
            +
            +

            When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

            +

            If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

            +

            See User Defined Types for more details.

            +
            +
            +

            Customizing Encoders for Non-prepared Statements

            +

            Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

            +
            cluster = Cluster()
            +session = cluster.connect()
            +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
            +
            +
            +

            See Type Conversions for the table of default CQL literal conversions.

            +
            +
            +

            Using Client-Side Protocol-Level Timestamps

            +

            With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

            +

            When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

            +
            +
            +
            +

            Upgrading to 2.0 from 1.x

            +

            Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

            +
            +

            Using the v2 Native Protocol

            +

            By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster(protocol_version=2)
            +
            +
            +

            When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

            +
            from cassandra.cluster import Cluster
            +
            +cluster = Cluster(protocol_version=1)
            +
            +
            +
            +
            +

            Automatic Query Paging

            +

            Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

            +

            See Paging Large Queries for full details.

            +
            +
            +

            Protocol-Level Batch Statements

            +

            With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

            +

            See BatchStatement for details and usage examples.

            +
            +
            +

            SASL-based Authentication

            +

            Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

            +
            +
            +

            Lightweight Transactions

            +

            Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

            +
            +
            +

            Calling Cluster.shutdown()

            +

            In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

            +
            +
            +

            Deprecations

            +

            The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

            + +
            +
            +

            Dependency Changes

            +

            The following dependencies have officially been made optional:

            +
              +
            • scales

            • +
            • blist

            • +
            +

            And one new dependency has been added (to enable Python 3 support):

            +
              +
            • six

            • +
            +
            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.11-scylla/user_defined_types.html b/3.25.11-scylla/user_defined_types.html new file mode 100644 index 0000000000..2b3c71345e --- /dev/null +++ b/3.25.11-scylla/user_defined_types.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            User Defined Types

            +

            Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

            +
            CREATE TYPE address (street text, zip int);
            +
            +
            +

            Version 2.1 of the Python driver adds support for user-defined types.

            +
            +

            Registering a UDT

            +

            You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

            +
            +

            Map a Class to a UDT

            +
            cluster = Cluster(protocol_version=3)
            +session = cluster.connect()
            +session.set_keyspace('mykeyspace')
            +session.execute("CREATE TYPE address (street text, zipcode int)")
            +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
            +
            +# create a class to map to the "address" UDT
            +class Address(object):
            +
            +    def __init__(self, street, zipcode):
            +        self.street = street
            +        self.zipcode = zipcode
            +
            +cluster.register_user_type('mykeyspace', 'address', Address)
            +
            +# insert a row using an instance of Address
            +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
            +                (0, Address("123 Main St.", 78723)))
            +
            +# results will include Address instances
            +results = session.execute("SELECT * FROM users")
            +row = results[0]
            +print(row.id, row.location.street, row.location.zipcode)
            +
            +
            +
            +
            +

            Map a dict to a UDT

            +
            cluster = Cluster(protocol_version=3)
            +session = cluster.connect()
            +session.set_keyspace('mykeyspace')
            +session.execute("CREATE TYPE address (street text, zipcode int)")
            +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
            +
            +cluster.register_user_type('mykeyspace', 'address', dict)
            +
            +# insert a row using a prepared statement and a tuple
            +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
            +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
            +
            +# results will include dict instances
            +results = session.execute("SELECT * FROM users")
            +row = results[0]
            +print(row.id, row.location['street'], row.location['zipcode'])
            +
            +
            +
            +
            +
            +

            Using UDTs Without Registering Them

            +

            Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

            +

            When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

            +
            cluster = Cluster(protocol_version=3)
            +session = cluster.connect()
            +session.set_keyspace('mykeyspace')
            +session.execute("CREATE TYPE address (street text, zipcode int)")
            +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
            +
            +class Foo(object):
            +
            +    def __init__(self, street, zipcode, otherstuff):
            +        self.street = street
            +        self.zipcode = zipcode
            +        self.otherstuff = otherstuff
            +
            +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
            +
            +# since we're using a prepared statement, we don't *have* to register
            +# a class to map to the UDT to insert data.  The object just needs to have
            +# "street" and "zipcode" attributes (which Foo does):
            +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
            +
            +# when we query data, UDT columns that don't have a class registered
            +# will be returned as namedtuples:
            +results = session.execute("SELECT * FROM users")
            +first_row = results[0]
            +address = first_row.location
            +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
            +street = address.street
            +zipcode = address.street
            +
            +
            +

            As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

            +

            * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

            +
            +
            + + +
            + + + + + + +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/.buildinfo b/3.25.4-scylla/.buildinfo new file mode 100644 index 0000000000..041785b0a2 --- /dev/null +++ b/3.25.4-scylla/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e4f84f7fd58de87f0b6497dd3f849748 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/3.25.4-scylla/.doctrees/CHANGELOG.doctree b/3.25.4-scylla/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..38286cbe3b Binary files /dev/null and b/3.25.4-scylla/.doctrees/CHANGELOG.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra.doctree b/3.25.4-scylla/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..9ec7bf46c6 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/auth.doctree b/3.25.4-scylla/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..a62fc60829 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/auth.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cluster.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..1f7f9e85bb Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cluster.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/concurrent.doctree b/3.25.4-scylla/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..7cd283f571 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/connection.doctree b/3.25.4-scylla/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..26d900cc91 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/connection.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..9af3a4f59a Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..29f68b3e24 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/management.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..e4a55a6124 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/models.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..fc2d6dce0d Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/query.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..bf615c07a0 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..27679b1443 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..6892bc2273 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..85c8631ee7 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..072495af20 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..3685ce9ae4 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/decoder.doctree b/3.25.4-scylla/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..b15468eb5c Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/decoder.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/encoder.doctree b/3.25.4-scylla/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..5d824cdc06 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/encoder.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/graph.doctree b/3.25.4-scylla/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..8f2e8db950 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/graph.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree b/3.25.4-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..825a322057 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree b/3.25.4-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..89eb4b7657 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree b/3.25.4-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..be8794e463 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/io/geventreactor.doctree b/3.25.4-scylla/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..222389c688 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/io/libevreactor.doctree b/3.25.4-scylla/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..375f1af84c Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree b/3.25.4-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..0fad0a5945 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/metadata.doctree b/3.25.4-scylla/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..b48145b1c9 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/metadata.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/metrics.doctree b/3.25.4-scylla/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..1f23f8be62 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/metrics.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/policies.doctree b/3.25.4-scylla/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..7134643238 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/policies.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/pool.doctree b/3.25.4-scylla/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..740916bc75 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/pool.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/protocol.doctree b/3.25.4-scylla/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..1f879f22ff Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/protocol.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/query.doctree b/3.25.4-scylla/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..9aa389ae6a Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/query.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/timestamps.doctree b/3.25.4-scylla/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..5cf1375adc Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/cassandra/util.doctree b/3.25.4-scylla/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..f8b33646ee Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/cassandra/util.doctree differ diff --git a/3.25.4-scylla/.doctrees/api/index.doctree b/3.25.4-scylla/.doctrees/api/index.doctree new file mode 100644 index 0000000000..7c0c3eb7f0 Binary files /dev/null and b/3.25.4-scylla/.doctrees/api/index.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/batches.doctree b/3.25.4-scylla/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..0d6a92c226 Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/batches.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/connections.doctree b/3.25.4-scylla/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..2b8d6247d3 Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/connections.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/faq.doctree b/3.25.4-scylla/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..1b023822ce Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/faq.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/models.doctree b/3.25.4-scylla/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..03f3e5183f Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/models.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/queryset.doctree b/3.25.4-scylla/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..5c9bf6fd9b Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/queryset.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/third_party.doctree b/3.25.4-scylla/.doctrees/cqlengine/third_party.doctree new file mode 100644 index 0000000000..ed9ea5e7cb Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/third_party.doctree differ diff --git a/3.25.4-scylla/.doctrees/cqlengine/upgrade_guide.doctree b/3.25.4-scylla/.doctrees/cqlengine/upgrade_guide.doctree new file mode 100644 index 0000000000..d1dfc71b09 Binary files /dev/null and b/3.25.4-scylla/.doctrees/cqlengine/upgrade_guide.doctree differ diff --git a/3.25.4-scylla/.doctrees/dates_and_times.doctree b/3.25.4-scylla/.doctrees/dates_and_times.doctree new file mode 100644 index 0000000000..d5db8c1fc7 Binary files /dev/null and b/3.25.4-scylla/.doctrees/dates_and_times.doctree differ diff --git a/3.25.4-scylla/.doctrees/environment.pickle b/3.25.4-scylla/.doctrees/environment.pickle new file mode 100644 index 0000000000..d296337431 Binary files /dev/null and b/3.25.4-scylla/.doctrees/environment.pickle differ diff --git a/3.25.4-scylla/.doctrees/execution_profiles.doctree b/3.25.4-scylla/.doctrees/execution_profiles.doctree new file mode 100644 index 0000000000..4efdb432e6 Binary files /dev/null and b/3.25.4-scylla/.doctrees/execution_profiles.doctree differ diff --git a/3.25.4-scylla/.doctrees/faq.doctree b/3.25.4-scylla/.doctrees/faq.doctree new file mode 100644 index 0000000000..40c70226ce Binary files /dev/null and b/3.25.4-scylla/.doctrees/faq.doctree differ diff --git a/3.25.4-scylla/.doctrees/getting_started.doctree b/3.25.4-scylla/.doctrees/getting_started.doctree new file mode 100644 index 0000000000..1e2d57f717 Binary files /dev/null and b/3.25.4-scylla/.doctrees/getting_started.doctree differ diff --git a/3.25.4-scylla/.doctrees/index.doctree b/3.25.4-scylla/.doctrees/index.doctree new file mode 100644 index 0000000000..cff4e796f6 Binary files /dev/null and b/3.25.4-scylla/.doctrees/index.doctree differ diff --git a/3.25.4-scylla/.doctrees/installation.doctree b/3.25.4-scylla/.doctrees/installation.doctree new file mode 100644 index 0000000000..d22d260010 Binary files /dev/null and b/3.25.4-scylla/.doctrees/installation.doctree differ diff --git a/3.25.4-scylla/.doctrees/lwt.doctree b/3.25.4-scylla/.doctrees/lwt.doctree new file mode 100644 index 0000000000..879bbe1d2d Binary files /dev/null and b/3.25.4-scylla/.doctrees/lwt.doctree differ diff --git a/3.25.4-scylla/.doctrees/object_mapper.doctree b/3.25.4-scylla/.doctrees/object_mapper.doctree new file mode 100644 index 0000000000..7cbfdba308 Binary files /dev/null and b/3.25.4-scylla/.doctrees/object_mapper.doctree differ diff --git a/3.25.4-scylla/.doctrees/performance.doctree b/3.25.4-scylla/.doctrees/performance.doctree new file mode 100644 index 0000000000..56fd594196 Binary files /dev/null and b/3.25.4-scylla/.doctrees/performance.doctree differ diff --git a/3.25.4-scylla/.doctrees/query_paging.doctree b/3.25.4-scylla/.doctrees/query_paging.doctree new file mode 100644 index 0000000000..ac9a5a8ceb Binary files /dev/null and b/3.25.4-scylla/.doctrees/query_paging.doctree differ diff --git a/3.25.4-scylla/.doctrees/scylla_cloud.doctree b/3.25.4-scylla/.doctrees/scylla_cloud.doctree new file mode 100644 index 0000000000..43f3fa9c11 Binary files /dev/null and b/3.25.4-scylla/.doctrees/scylla_cloud.doctree differ diff --git a/3.25.4-scylla/.doctrees/scylla_specific.doctree b/3.25.4-scylla/.doctrees/scylla_specific.doctree new file mode 100644 index 0000000000..cddaab3de6 Binary files /dev/null and b/3.25.4-scylla/.doctrees/scylla_specific.doctree differ diff --git a/3.25.4-scylla/.doctrees/security.doctree b/3.25.4-scylla/.doctrees/security.doctree new file mode 100644 index 0000000000..a6a0e29048 Binary files /dev/null and b/3.25.4-scylla/.doctrees/security.doctree differ diff --git a/3.25.4-scylla/.doctrees/upgrading.doctree b/3.25.4-scylla/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..c7331702ef Binary files /dev/null and b/3.25.4-scylla/.doctrees/upgrading.doctree differ diff --git a/3.25.4-scylla/.doctrees/user_defined_types.doctree b/3.25.4-scylla/.doctrees/user_defined_types.doctree new file mode 100644 index 0000000000..31d9e73b37 Binary files /dev/null and b/3.25.4-scylla/.doctrees/user_defined_types.doctree differ diff --git a/3.25.4-scylla/.nojekyll b/3.25.4-scylla/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.25.4-scylla/404.html b/3.25.4-scylla/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/3.25.4-scylla/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
            +

            404

            +

            The ScyllaDB monster ate your page!

            +

            + Home +

            +
            + + + \ No newline at end of file diff --git a/3.25.4-scylla/CHANGELOG.html b/3.25.4-scylla/CHANGELOG.html new file mode 100644 index 0000000000..a0a22c4fd6 --- /dev/null +++ b/3.25.4-scylla/CHANGELOG.html @@ -0,0 +1,2903 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            CHANGELOG

            +
            +

            3.25.0

            +

            March 18, 2021

            +
            +

            Features

            +
              +
            • Ensure the driver can connect when invalid peer hosts are in system.peers (PYTHON-1260)

            • +
            • Implement protocol v5 checksumming (PYTHON-1258)

            • +
            • Fix the default cqlengine connection mechanism to work with Astra (PYTHON-1265)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

            • +
            • Update list of reserved keywords (PYTHON-1269)

            • +
            +
            +
            +

            Others

            +
              +
            • Drop Python 3.4 support (PYTHON-1220)

            • +
            • Update security documentation and examples to use PROTOCOL_TLS (PYTHON-1264)

            • +
            +
            +
            +
            +

            3.24.0

            +

            June 18, 2020

            +
            +

            Features

            +
              +
            • Make geomet an optional dependency at runtime (PYTHON-1237)

            • +
            • Add use_default_tempdir cloud config options (PYTHON-1245)

            • +
            • Tcp flow control for libevreactor (PYTHON-1248)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Unable to connect to a cloud cluster using Ubuntu 20.04 (PYTHON-1238)

            • +
            • PlainTextAuthProvider fails with unicode chars and Python3 (PYTHON-1241)

            • +
            • [GRAPH] Graph execution profiles consistency level are not set to LOCAL_QUORUM with a cloud cluster (PYTHON-1240)

            • +
            • [GRAPH] Can’t write data in a Boolean field using the Fluent API (PYTHON-1239)

            • +
            • [GRAPH] Fix elementMap() result deserialization (PYTHON-1233)

            • +
            +
            +
            +

            Others

            +
              +
            • Bump geomet dependency version to 0.2 (PYTHON-1243)

            • +
            • Bump gremlinpython dependency version to 3.4.6 (PYTHON-1212)

            • +
            • Improve fluent graph documentation for core graphs (PYTHON-1244)

            • +
            +
            +
            +
            +

            3.23.0

            +

            April 6, 2020

            +
            +

            Features

            +
              +
            • Transient Replication Support (PYTHON-1207)

            • +
            • Support system.peers_v2 and port discovery for C* 4.0 (PYTHON-700)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Asyncore logging exception on shutdown (PYTHON-1228)

            • +
            +
            +
            +
            +

            3.22.0

            +

            February 26, 2020

            +
            +

            Features

            +
              +
            • Add all() function to the ResultSet API (PYTHON-1203)

            • +
            • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

            • +
            • Add GraphSON3 support (PYTHON-788)

            • +
            • Use GraphSON3 as default for Native graphs (PYTHON-1004)

            • +
            • Add Tuple and UDT types for native graph (PYTHON-1005)

            • +
            • Add Duration type for native graph (PYTHON-1000)

            • +
            • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

            • +
            • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

            • +
            • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

            • +
            • Resolve the row_factory automatically for native graphs (PYTHON-1056)

            • +
            • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

            • +
            • Add g:BulkSet graph deserializers (PYTHON-1060)

            • +
            • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

            • +
            • Update Native to Core Graph Engine

            • +
            • Add graphson3 and native graph support (PYTHON-1039)

            • +
            • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

            • +
            • Expose filter predicates for cql collections (PYTHON-1019)

            • +
            • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

            • +
            • Make graph metadata handling more robust (PYTHON-1204)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

            • +
            +
            +
            +
            +

            3.21.0

            +

            January 15, 2020

            +
            +

            Features

            +
              +
            • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

            • +
            • Add Python 3.8 support (PYTHON-1189)

            • +
            • Allow passing ssl context for Twisted (PYTHON-1161)

            • +
            • Ssl context and cloud support for Eventlet (PYTHON-1162)

            • +
            • Cloud Twisted support (PYTHON-1163)

            • +
            • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

            • +
            • Flexible version parsing (PYTHON-1174)

            • +
            • Support NULL in collection deserializer (PYTHON-1123)

            • +
            • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

            • +
            • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

            • +
            • asyncio message chunks can be processed discontinuously (PYTHON-1185)

            • +
            • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

            • +
            • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

            • +
            • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

            • +
            • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

            • +
            +
            +
            +

            Others

            +
              +
            • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

            • +
            • Remove *read_repair_chance table options (PYTHON-1140)

            • +
            • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

            • +
            • Add new DSE CQL keywords (PYTHON-1122)

            • +
            • Publish binary wheel distributions (PYTHON-1013)

            • +
            +
            +
            +

            Deprecations

            +
              +
            • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

            • +
            +

            Merged from dse-driver:

            +
            +
            +

            Features

            +
              +
            • Insights integration (PYTHON-1047)

            • +
            • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

            • +
            • Add NodeSync metadata (PYTHON-799)

            • +
            • Add new NodeSync failure values (PYTHON-934)

            • +
            • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

            • +
            • GraphOptions should show a warning for unknown parameters (PYTHON-819)

            • +
            • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

            • +
            • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

            • +
            • Add graph-results payload option for GraphSON format (PYTHON-773)

            • +
            • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

            • +
            • Implement serializers for the Graph String API (PYTHON-778)

            • +
            • Provide deserializers for GraphSON types (PYTHON-782)

            • +
            • Add Graph DurationType support (PYTHON-607)

            • +
            • Support DSE DateRange type (PYTHON-668)

            • +
            • RLAC CQL output for materialized views (PYTHON-682)

            • +
            • Add Geom Types wkt deserializer

            • +
            • DSE Graph Client timeouts in custom payload (PYTHON-589)

            • +
            • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

            • +
            • Add config profiles to DSE graph execution (PYTHON-570)

            • +
            • DSE Driver version checking (PYTHON-568)

            • +
            • Distinct default timeout for graph queries (PYTHON-477)

            • +
            • Graph result parsing for known types (PYTHON-479,487)

            • +
            • Distinct read/write CL for graph execution (PYTHON-509)

            • +
            • Target graph analytics query to spark master when available (PYTHON-510)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

            • +
            • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

            • +
            • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

            • +
            • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

            • +
            • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

            • +
            • Update date serialization to isoformat in graph (PYTHON-805)

            • +
            • DateRange Parse Error (PYTHON-729)

            • +
            • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

            • +
            • metadata.get_host returning None unexpectedly (PYTHON-709)

            • +
            • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

            • +
            • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

            • +
            • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

            • +
            • Correctly handle other types in geo type equality (PYTHON-508)

            • +
            +
            +
            +

            Other

            +
              +
            • Add tests around cqlengine and continuous paging (PYTHON-872)

            • +
            • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

            • +
            • Write documentation examples for DSE 2.0 features (PYTHON-732)

            • +
            • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

            • +
            +
            +
            +
            +

            3.20.2

            +

            November 19, 2019

            +
            +

            Bug Fixes

            +
              +
            • Fix import error for old python installation without SSLContext (PYTHON-1183)

            • +
            +
            +
            +
            +

            3.20.1

            +

            November 6, 2019

            +
            +

            Bug Fixes

            +
              +
            • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

            • +
            +
            +
            +
            +

            3.20.0

            +

            October 28, 2019

            +
            +

            Features

            +
              +
            • DataStax Astra Support (PYTHON-1074)

            • +
            • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

            • +
            • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

            • +
            • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

            • +
            +
            +
            +
            +

            3.19.0

            +

            August 26, 2019

            +
            +

            Features

            +
              +
            • Add Python 3.7 support (PYTHON-1016)

            • +
            • Future-proof Mapping imports (PYTHON-1023)

            • +
            • Include param values in cqlengine logging (PYTHON-1105)

            • +
            • NTS Token Replica Map Generation is slow (PYTHON-622)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

            • +
            • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

            • +
            • Fix incorrect metadata for compact counter tables (PYTHON-1100)

            • +
            • Call ConnectionException with correct kwargs (PYTHON-1117)

            • +
            • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

            • +
            • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

            • +
            • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

            • +
            +
            +
            +

            Other

            +
              +
            • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

            • +
            • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

            • +
            +
            +
            +
            +

            3.18.0

            +

            May 27, 2019

            +
            +

            Features

            +
              +
            • Abstract Host Connection information (PYTHON-1079)

            • +
            • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

            • +
            • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

            • +
            • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

            • +
            • Accept legacy empty strings as column names (PYTHON-1082)

            • +
            • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

            • +
            +
            +
            +
            +

            3.17.1

            +

            May 2, 2019

            +
            +

            Bug Fixes

            +
              +
            • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

            • +
            +
            +
            +
            +

            3.17.0

            +

            February 19, 2019

            +
            +

            Features

            +
              +
            • Send driver name and version in startup message (PYTHON-1068)

            • +
            • Add Cluster ssl_context option to enable SSL (PYTHON-995)

            • +
            • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

            • +
            • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

            • +
            • Add Session.get_execution_profile (PYTHON-932)

            • +
            • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

            • +
            • Serial consistency level is not used (PYTHON-1007)

            • +
            +
            +
            +

            Other

            +
              +
            • Fail faster on incorrect lz4 import (PYTHON-1042)

            • +
            • Bump Cython dependency version to 0.29 (PYTHON-1036)

            • +
            • Expand Driver SSL Documentation (PYTHON-740)

            • +
            +
            +
            +

            Deprecations

            +
              +
            • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

            • +
            • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

            • +
            +
            +
            +
            +

            3.16.0

            +

            November 12, 2018

            +
            +

            Bug Fixes

            +
              +
            • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

            • +
            • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

            • +
            • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

            • +
            • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

            • +
            • Log profile name on attempt to create existing profile (PYTHON-944)

            • +
            • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

            • +
            +
            +
            +

            Other

            +
              +
            • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

            • +
            • Fix wrong use of ResultSet indexing (PYTHON-1015)

            • +
            +
            +
            +
            +

            3.15.1

            +

            September 6, 2018

            +
            +

            Bug Fixes

            +
              +
            • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

            • +
            +
            +
            +
            +

            3.15.0

            +

            August 30, 2018

            +
            +

            Features

            +
              +
            • Parse Virtual Keyspace Metadata (PYTHON-992)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

            • +
            • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

            • +
            • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

            • +
            • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

            • +
            +
            +
            +

            Other

            +
              +
            • Use global variable for libev loops so it can be subclassed (PYTHON-973)

            • +
            • Update SchemaParser for V4 (PYTHON-1006)

            • +
            • Bump Cython dependency version to 0.28 (PYTHON-1012)

            • +
            +
            +
            +
            +

            3.14.0

            +

            April 17, 2018

            +
            +

            Features

            +
              +
            • Add one() function to the ResultSet API (PYTHON-947)

            • +
            • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

            • +
            • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

            • +
            • Twisted SSL Support (PYTHON-343)

            • +
            • Support IS NOT NULL operator in cqlengine (PYTHON-968)

            • +
            +
            +
            +

            Other

            +
              +
            • Fix Broken Links in Docs (PYTHON-916)

            • +
            • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

            • +
            • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

            • +
            • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

            • +
            • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

            • +
            • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

            • +
            • Add DSE smoke test to OSS driver tests (PYTHON-894)

            • +
            • Document long compilation times and workarounds (PYTHON-868)

            • +
            • Improve error for batch WriteTimeouts (PYTHON-941)

            • +
            • Deprecate ResultSet indexing (PYTHON-945)

            • +
            +
            +
            +
            +

            3.13.0

            +

            January 30, 2018

            +
            +

            Features

            +
              +
            • cqlengine: LIKE filter operator (PYTHON-512)

            • +
            • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

            • +
            • Support retry_policy in PreparedStatement (PYTHON-861)

            • +
            • __del__ method in Session is throwing an exception (PYTHON-813)

            • +
            • LZ4 import issue with recent versions (PYTHON-897)

            • +
            • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

            • +
            • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

            • +
            +
            +
            +

            Other

            +
              +
            • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

            • +
            • Fix DeprecationWarning of log.warn (PYTHON-846)

            • +
            • Fix example_mapper.py for python3 (PYTHON-860)

            • +
            • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

            • +
            • Add some known deprecated warnings for 4.x (PYTHON-877)

            • +
            • Remove copyright dates from copyright notices (PYTHON-863)

            • +
            • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

            • +
            • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

            • +
            • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

            • +
            • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

            • +
            +
            +
            +
            +

            3.12.0

            +

            November 6, 2017

            +
            +

            Features

            +
              +
            • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

            • +
            • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

            • +
            • WriteType.CDC and VIEW missing (PYTHON-794)

            • +
            • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

            • +
            • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

            • +
            • Include hash of result set metadata in prepared stmt id (PYTHON-808)

            • +
            • Add NO_COMPACT startup option (PYTHON-839)

            • +
            • Add new exception type for CDC (PYTHON-837)

            • +
            • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

            • +
            • Add asyncio reactor (PYTHON-507)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

            • +
            • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

            • +
            • Not create two sessions by default in CQLEngine (PYTHON-814)

            • +
            • Bug when subclassing AyncoreConnection (PYTHON-827)

            • +
            • Error at cleanup when closing the asyncore connections (PYTHON-829)

            • +
            • Fix sites where sessions can change during iteration (PYTHON-793)

            • +
            • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

            • +
            • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

            • +
            • Dont set the session keyspace when preparing statements (PYTHON-843)

            • +
            • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

            • +
            +
            +
            +

            Other

            +
              +
            • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

            • +
            • Bump Cython dependency version to 0.27 (PYTHON-833)

            • +
            +
            +
            +
            +

            3.11.0

            +

            July 24, 2017

            +
            +

            Features

            +
              +
            • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

            • +
            • Add HostFilterPolicy (PYTHON-761)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

            • +
            • Fix asyncore hang on exit (PYTHON-767)

            • +
            • Driver takes several minutes to remove a bad host from session (PYTHON-762)

            • +
            • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

            • +
            • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

            • +
            • request_ids may not be returned to the pool (PYTHON-739)

            • +
            • Fix murmur3 on big-endian systems (PYTHON-653)

            • +
            • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

            • +
            • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

            • +
            +
            +
            +

            Other

            +
              +
            • Bump Cython dependency version to 0.25.2 (PYTHON-754)

            • +
            • Fix DeprecationWarning when using lz4 (PYTHON-769)

            • +
            • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

            • +
            • Improve upgrade guide for materializing pages (PYTHON-464)

            • +
            • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

            • +
            • Point to DSA Slack, not IRC, in docs index

            • +
            +
            +
            +
            +

            3.10.0

            +

            May 24, 2017

            +
            +

            Features

            +
              +
            • Add Duration type to cqlengine (PYTHON-750)

            • +
            • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

            • +
            • get_query_trace() contract is ambiguous (PYTHON-196)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Queries using speculative execution policy timeout prematurely (PYTHON-755)

            • +
            • Fix map where results are not consumed (PYTHON-749)

            • +
            • Driver fails to encode Duration’s with large values (PYTHON-747)

            • +
            • UDT values are not updated correctly in CQLEngine (PYTHON-743)

            • +
            • UDT types are not validated in CQLEngine (PYTHON-742)

            • +
            • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

            • +
            • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

            • +
            • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

            • +
            • Memory grows and doesn’t get removed (PYTHON-720)

            • +
            • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

            • +
            • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

            • +
            • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

            • +
            +
            +
            +

            Other

            +
              +
            • Update README (PYTHON-746)

            • +
            • Test python versions 3.5 and 3.6 (PYTHON-737)

            • +
            • Docs Warning About Prepare select * (PYTHON-626)

            • +
            • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

            • +
            • Example SSL connection code does not verify server certificates (PYTHON-469)

            • +
            +
            +
            +
            +

            3.9.0

            +
            +

            Features

            +
              +
            • cqlengine: remove elements by key from a map (PYTHON-688)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • improve error handling when connecting to non-existent keyspace (PYTHON-665)

            • +
            • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

            • +
            • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

            • +
            • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

            • +
            • race where callback or errback for request may not be called (PYTHON-733)

            • +
            • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

            • +
            • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

            • +
            +
            +
            +

            Other

            +
              +
            • Connection not closed in example_mapper (PYTHON-723)

            • +
            • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

            • +
            +
            +
            +
            +

            3.8.1

            +

            March 16, 2017

            +
            +

            Bug Fixes

            +
              +
            • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

            • +
            • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

            • +
            • Fix DecimalType regression (PYTHON-724)

            • +
            +
            +
            +
            +

            3.8.0

            +
            +

            Features

            +
              +
            • Quote index names in metadata CQL generation (PYTHON-616)

            • +
            • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

            • +
            • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

            • +
            • Added cql types to result set (PYTHON-648)

            • +
            • Add __len__ to BatchStatement (PYTHON-650)

            • +
            • Duration Type for Cassandra (PYTHON-655)

            • +
            • Send flags with PREPARE message in v5 (PYTHON-684)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

            • +
            • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

            • +
            • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

            • +
            • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

            • +
            • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

            • +
            • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

            • +
            • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

            • +
            • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

            • +
            • Make client timestamps strictly monotonic (PYTHON-676)

            • +
            • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

            • +
            +
            +
            +

            Other

            +
              +
            • Create a cqlengine doc section explaining None semantics (PYTHON-623)

            • +
            • Resolve warnings in documentation generation (PYTHON-645)

            • +
            • Cython dependency (PYTHON-686)

            • +
            • Drop Support for Python 2.6 (PYTHON-690)

            • +
            +
            +
            +
            +

            3.7.1

            +

            October 26, 2016

            +
            +

            Bug Fixes

            +
              +
            • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

            • +
            +
            +
            +
            +

            3.7.0

            +

            September 13, 2016

            +
            +

            Features

            +
              +
            • Add v5 protocol failure map (PYTHON-619)

            • +
            • Don’t return from initial connect on first error (PYTHON-617)

            • +
            • Indicate failed column when deserialization fails (PYTHON-361)

            • +
            • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

            • +
            • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

            • +
            • EC2 Address Resolver (PYTHON-198)

            • +
            • Speculative query retries (PYTHON-218)

            • +
            • Expose paging state in API (PYTHON-200)

            • +
            • Don’t mark host down while one connection is active (PYTHON-498)

            • +
            • Query request size information (PYTHON-284)

            • +
            • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

            • +
            • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

            • +
            • Add beta version native protocol flag (PYTHON-614)

            • +
            • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Race when adding a pool while setting keyspace (PYTHON-628)

            • +
            • Update results_metadata when prepared statement is reprepared (PYTHON-621)

            • +
            • CQL Export for Thrift Tables (PYTHON-213)

            • +
            • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

            • +
            • cqlengine: columns are no longer hashable (PYTHON-618)

            • +
            • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

            • +
            +
            +
            +
            +

            3.6.0

            +

            August 1, 2016

            +
            +

            Features

            +
              +
            • Handle null values in NumpyProtocolHandler (PYTHON-553)

            • +
            • Collect greplin scales stats per cluster (PYTHON-561)

            • +
            • Update mock unit test dependency requirement (PYTHON-591)

            • +
            • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

            • +
            • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

            • +
            • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

            • +
            • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

            • +
            • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

            • +
            • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix geventreactor with SSL support (PYTHON-600)

            • +
            • Don’t downgrade protocol version if explicitly set (PYTHON-537)

            • +
            • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

            • +
            • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

            • +
            • Libev loop shutdown race (PYTHON-578)

            • +
            • Include aliases in DCT type string (PYTHON-579)

            • +
            • cqlengine: Comparison operators for Columns (PYTHON-595)

            • +
            • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

            • +
            • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

            • +
            • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

            • +
            • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

            • +
            • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

            • +
            • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

            • +
            +
            +
            +
            +

            3.5.0

            +

            June 27, 2016

            +
            +

            Features

            +
              +
            • Optional Execution Profiles for the core driver (PYTHON-569)

            • +
            • API to get the host metadata associated with the control connection node (PYTHON-583)

            • +
            • Expose CDC option in table metadata CQL (PYTHON-593)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Clean up Asyncore socket map when fork is detected (PYTHON-577)

            • +
            • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

            • +
            +
            +
            +
            +

            3.4.1

            +

            May 26, 2016

            +
            +

            Bug Fixes

            +
              +
            • Gevent connection closes on IO timeout (PYTHON-573)

            • +
            • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

            • +
            +
            +
            +
            +

            3.4.0

            +

            May 24, 2016

            +
            +

            Features

            +
              +
            • Include DSE version and workload in Host data (PYTHON-555)

            • +
            • Add a context manager to Cluster and Session (PYTHON-521)

            • +
            • Better Error Message for Unsupported Protocol Version (PYTHON-157)

            • +
            • Make the error message explicitly state when an error comes from the server (PYTHON-412)

            • +
            • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

            • +
            • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

            • +
            • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

            • +
            • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

            • +
            • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

            • +
            • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

            • +
            • Write docs around working with datetime and timezones (PYTHON-394)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • High CPU utilization when using asyncore event loop (PYTHON-239)

            • +
            • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

            • +
            • Make stress scripts Python 2.6 compatible (PYTHON-434)

            • +
            • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

            • +
            • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

            • +
            • Cluster and Session do not GC after leaving scope (PYTHON-135)

            • +
            • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

            • +
            • Reprepare on_up with many clients causes node overload (PYTHON-556)

            • +
            • None inserted into host map when control connection node is decommissioned (PYTHON-548)

            • +
            • weakref.ref does not accept keyword arguments (github #585)

            • +
            +
            +
            +
            +

            3.3.0

            +

            May 2, 2016

            +
            +

            Features

            +
              +
            • Add an AddressTranslator interface (PYTHON-69)

            • +
            • New Retry Policy Decision - try next host (PYTHON-285)

            • +
            • Don’t mark host down on timeout (PYTHON-286)

            • +
            • SSL hostname verification (PYTHON-296)

            • +
            • Add C* version to metadata or cluster objects (PYTHON-301)

            • +
            • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

            • +
            • Expose listen_address of node we get ring information from (PYTHON-332)

            • +
            • Use A-record with multiple IPs for contact points (PYTHON-415)

            • +
            • Custom consistency level for populating query traces (PYTHON-435)

            • +
            • Normalize Server Exception Types (PYTHON-443)

            • +
            • Propagate exception message when DDL schema agreement fails (PYTHON-444)

            • +
            • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

            • +
            • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

            • +
            • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

            • +
            • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

            • +
            • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

            • +
            • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

            • +
            +
            +
            +
            +

            3.2.2

            +

            April 19, 2016

            +
              +
            • Fix counter save-after-no-update (PYTHON-547)

            • +
            +
            +
            +

            3.2.1

            +

            April 13, 2016

            +
              +
            • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

            • +
            +
            +
            +

            3.2.0

            +

            April 12, 2016

            +
            +

            Features

            +
              +
            • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

            • +
            • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

            • +
            • cqlengine: support non-equal conditions for LWT (PYTHON-528)

            • +
            • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

            • +
            • cqlengine: token-aware routing for mapper statements (PYTHON-535)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

            • +
            • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

            • +
            • comparing models with datetime fields fail #79 (PYTHON-273)

            • +
            • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

            • +
            • db_field is not always respected with UpdateStatement (PYTHON-530)

            • +
            • Sync_table fails on column.Set with secondary index (PYTHON-533)

            • +
            +
            +
            +
            +

            3.1.1

            +

            March 14, 2016

            +
            +

            Bug Fixes

            +
              +
            • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

            • +
            +
            +
            +
            +

            3.1.0

            +

            March 10, 2016

            +
            +

            Features

            +
              +
            • Pass name of server auth class to AuthProvider (PYTHON-454)

            • +
            • Surface schema agreed flag for DDL statements (PYTHON-458)

            • +
            • Automatically convert float and int to Decimal on serialization (PYTHON-468)

            • +
            • Eventlet Reactor IO improvement (PYTHON-495)

            • +
            • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

            • +
            • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

            • +
            • Add Session.default_serial_consistency_level (github #510)

            • +
            • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

            • +
            • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

            • +
            • cqlengine: Add DISTINCT query operator (PYTHON-266)

            • +
            • cqlengine: Tuple cqlengine api (PYTHON-306)

            • +
            • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

            • +
            • cqlengine: Allow nested container types (PYTHON-478)

            • +
            • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

            • +
            • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

            • +
            • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

            • +
            • Overflow when decoding large collections (cython) (PYTHON-459)

            • +
            • Timer heap comparison issue with Python 3 (github #466)

            • +
            • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

            • +
            • Decode error encountered when cython deserializing large map results (PYTHON-459)

            • +
            • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

            • +
            • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

            • +
            • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

            • +
            • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

            • +
            • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

            • +
            • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

            • +
            • cqlengine: db_field breaks UserType (PYTHON-346)

            • +
            • cqlengine: UDT badly quoted (PYTHON-347)

            • +
            • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

            • +
            • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

            • +
            • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

            • +
            • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

            • +
            • cqlengine: Better error for management functions when no connection set (PYTHON-451)

            • +
            • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

            • +
            • cqlengine: Fix inserting None for model save (PYTHON-475)

            • +
            • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

            • +
            • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

            • +
            • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

            • +
            +
            +
            +

            Other

            +
              +
            • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

            • +
            • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

            • +
            +
            +
            +
            +

            3.0.0

            +

            November 24, 2015

            +
            +

            Features

            +
              +
            • Support datetime.date objects as a DateType (PYTHON-212)

            • +
            • Add Cluster.update_view_metadata (PYTHON-407)

            • +
            • QueryTrace option to populate partial trace sessions (PYTHON-438)

            • +
            • Attach column names to ResultSet (PYTHON-439)

            • +
            • Change default consistency level to LOCAL_ONE

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

            • +
            • Evict UDTs from UserType cache on change (PYTHON-226)

            • +
            • Make sure query strings are always encoded UTF-8 (PYTHON-334)

            • +
            • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

            • +
            • UDT CQL encoding does not work for unicode values (PYTHON-353)

            • +
            • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

            • +
            • Cython integer overflow on decimal type deserialization (PYTHON-433)

            • +
            • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

            • +
            +
            +
            +
            +

            3.0.0rc1

            +

            November 9, 2015

            +
            +

            Features

            +
              +
            • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

            • +
            • Remove deprecated features (PYTHON-292)

            • +
            • Don’t assign trace data to Statements (PYTHON-318)

            • +
            • Normalize results return (PYTHON-368)

            • +
            • Process Materialized View Metadata/Events (PYTHON-371)

            • +
            • Remove blist as soft dependency (PYTHON-385)

            • +
            • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

            • +
            • Normalize CQL query/export in metadata model (PYTHON-405)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Implementation of named arguments bind is non-pythonic (PYTHON-178)

            • +
            • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

            • +
            • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

            • +
            • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

            • +
            • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

            • +
            +
            +
            +
            +

            2.7.2

            +

            September 14, 2015

            +
            +

            Bug Fixes

            +
              +
            • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

            • +
            • Remove futures dep. for Python 3 (PYTHON-393)

            • +
            • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

            • +
            • Unit test runtime issues (PYTHON-397,398)

            • +
            +
            +
            +
            +

            2.7.1

            +

            August 25, 2015

            +
            +

            Bug Fixes

            +
              +
            • Explicitly include extension source files in Manifest

            • +
            +
            +
            +
            +

            2.7.0

            +

            August 25, 2015

            +

            Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

            +
            +

            Features

            +
              +
            • General Performance Improvements for Throughput (PYTHON-283)

            • +
            • Improve synchronous request performance with Timers (PYTHON-108)

            • +
            • Enable C Extensions for PyPy Runtime (PYTHON-357)

            • +
            • Refactor SerDes functionality for pluggable interface (PYTHON-313)

            • +
            • Cython SerDes Extension (PYTHON-377)

            • +
            • Accept iterators/generators for execute_concurrent() (PYTHON-123)

            • +
            • cythonize existing modules (PYTHON-342)

            • +
            • Pure Python murmur3 implementation (PYTHON-363)

            • +
            • Make driver tolerant of inconsistent metadata (PYTHON-370)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

            • +
            • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

            • +
            • Blocking connect does not use connect_timeout (PYTHON-381)

            • +
            • Properly protect partition key in CQL export (PYTHON-375)

            • +
            • Trigger error callbacks on timeout (PYTHON-294)

            • +
            +
            +
            +
            +

            2.6.0

            +

            July 20, 2015

            +
            +

            Bug Fixes

            +
              +
            • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

            • +
            +
            +
            +
            +

            2.6.0c2

            +

            June 24, 2015

            +
            +

            Features

            +
              +
            • Automatic Protocol Version Downgrade (PYTHON-240)

            • +
            • cqlengine Python 2.6 compatibility (PYTHON-288)

            • +
            • Double-dollar string quote UDF body (PYTHON-345)

            • +
            • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Avoid stall while connecting to mixed version cluster (PYTHON-303)

            • +
            • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

            • +
            • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

            • +
            • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

            • +
            • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

            • +
            +
            +
            +
            +

            2.6.0c1

            +

            June 4, 2015

            +

            This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

            +
            +

            Features

            +
              +
            • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

            • +
            • Configuration option for connection timeout (PYTHON-206)

            • +
            • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

            • +
            • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

            • +
            • Implement new request failure messages in protocol v4+ (PYTHON-238)

            • +
            • Metadata model now maps index meta by index name (PYTHON-241)

            • +
            • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

            • +
            • cqle: add Double column type and remove Float overload (PYTHON-246)

            • +
            • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

            • +
            • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

            • +
            • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

            • +
            • Save trace id even when trace complete times out (PYTHON-302)

            • +
            • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

            • +
            • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

            • +
            • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

            • +
            • Expose CQL keywords in API (PYTHON-324)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • IPv6 address support on Windows (PYTHON-20)

            • +
            • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

            • +
            • cqle: Quote keywords properly in table management functions (PYTHON-244)

            • +
            • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

            • +
            • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

            • +
            • Make protocol read_inet work for Windows (PYTHON-309)

            • +
            • cqle: Correct encoding for nested types (PYTHON-311)

            • +
            • Update list of CQL keywords used quoting identifiers (PYTHON-319)

            • +
            • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

            • +
            • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

            • +
            +
            +
            +
            +

            2.5.1

            +

            April 23, 2015

            +
            +

            Bug Fixes

            +
              +
            • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

            • +
            • Fix race condition in node/token rebuild (PYTHON-298)

            • +
            • Set and send serial consistency parameter (PYTHON-299)

            • +
            +
            +
            +
            +

            2.5.0

            +

            March 30, 2015

            +
            +

            Features

            +
              +
            • Integrated cqlengine object mapping package

            • +
            • Utility functions for converting timeuuids and datetime (PYTHON-99)

            • +
            • Schema metadata fetch window randomized, config options added (PYTHON-202)

            • +
            • Support for new Date and Time Cassandra types (PYTHON-190)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

            • +
            • Thread exception during GIL cleanup (PYTHON-229)

            • +
            • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

            • +
            • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

            • +
            • Support reading CompositeType data (PYTHON-234)

            • +
            • Preserve float precision in CQL encoding (PYTHON-243)

            • +
            +
            +
            +
            +

            2.1.4

            +

            January 26, 2015

            +
            +

            Features

            +
              +
            • SaslAuthenticator for Kerberos support (PYTHON-109)

            • +
            • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

            • +
            • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

            • +
            • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

            • +
            • Add eventlet connection support (PYTHON-194)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Schema meta fix for complex thrift tables (PYTHON-191)

            • +
            • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

            • +
            • Resolve stream ID leak on set_keyspace (PYTHON-195)

            • +
            • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

            • +
            • Resolve stream id collision when using SASL auth (PYTHON-210)

            • +
            • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

            • +
            +
            +
            +
            +

            2.1.3

            +

            December 16, 2014

            +
            +

            Features

            +
              +
            • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

            • +
            • Avoid connecting to peer with incomplete metadata (PYTHON-163)

            • +
            • Add SSL support to gevent reactor (PYTHON-174)

            • +
            • Use control connection timeout in wait for schema agreement (PYTHON-175)

            • +
            • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

            • +
            • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Support large negative timestamps on Windows (PYTHON-119)

            • +
            • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

            • +
            • Retain table metadata following keyspace meta refresh (PYTHON-173)

            • +
            • Use a timeout when preparing a statement for all nodes (PYTHON-179)

            • +
            • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

            • +
            • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

            • +
            • Correct routing key encoding for composite keys (PYTHON-184)

            • +
            • Include compression option in schema export string when disabled (PYTHON-187)

            • +
            +
            +
            +
            +

            2.1.2

            +

            October 16, 2014

            +
            +

            Features

            +
              +
            • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

            • +
            • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

            • +
            • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

            • +
            • Handle Unauthorized message on schema_triggers query (PYTHON-155)

            • +
            • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

            • +
            • Support CUSTOM index metadata and string export (PYTHON-165)

            • +
            +
            +
            +
            +

            2.1.1

            +

            September 11, 2014

            +
            +

            Features

            +
              +
            • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

            • +
            • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

            • +
            • Keep timeout for paged results (PYTHON-150)

            • +
            +
            +
            +

            Other

            +
              +
            • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

            • +
            +
            +
            +
            +

            2.1.0

            +

            August 7, 2014

            +
            +

            Bug Fixes

            +
              +
            • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

            • +
            • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

            • +
            +
            +
            +
            +

            2.1.0c1

            +

            July 25, 2014

            +
            +

            Bug Fixes

            +
              +
            • Properly specify UDTs for columns in CREATE TABLE statements

            • +
            • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

            • +
            • Don’t ignore fetch_size arguments to Statement constructors (github-151)

            • +
            • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

            • +
            • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

            • +
            • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

            • +
            • Raise TypeError when a string is used for contact_points (github #164)

            • +
            • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

            • +
            +
            +
            +

            Other

            +
              +
            • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

            • +
            +
            +
            +
            +

            2.1.0b1

            +

            July 11, 2014

            +

            This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

            +
            +

            Features

            +
              +
            • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

            • +
            • Support for user-defined types (Cassandra 2.1+)

            • +
            • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

            • +
            • Protocol-level client-side timestamps (see Session.use_client_timestamp)

            • +
            • Overridable type encoding for non-prepared statements (see Session.encoders)

            • +
            • Configurable serial consistency levels for batch statements

            • +
            • Use io.BytesIO for reduced CPU consumption (github #143)

            • +
            • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

            • +
            • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

            • +
            • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

            • +
            • Don’t share prepared statement lock across Cluster instances

            • +
            • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

            • +
            • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

            • +
            • Properly defunct connections after protocol errors

            • +
            • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

            • +
            • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

            • +
            • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

            • +
            • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

            • +
            • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

            • +
            • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

            • +
            • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

            • +
            +
            +
            +
            +

            2.0.2

            +

            June 10, 2014

            +
            +

            Bug Fixes

            +
              +
            • Add six to requirements.txt

            • +
            • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

            • +
            • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

            • +
            • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

            • +
            • Add python-six to debian dependencies, move python-blist to recommends

            • +
            • Fix memory leak when libev connections are created and +destroyed (github #93)

            • +
            • Ensure token map is rebuilt when hosts are removed from the cluster

            • +
            +
            +
            +
            +

            2.0.1

            +

            May 28, 2014

            +
            +

            Bug Fixes

            +
              +
            • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

            • +
            +
            +
            +
            +

            2.0.0

            +

            May 28, 2014

            +
            +

            Features

            +
              +
            • Make libev C extension Python3-compatible (PYTHON-70)

            • +
            • Support v2 protocol authentication (PYTHON-73, github #125)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix murmur3 C extension compilation under Python3.4 (github #124)

            • +
            +
            +
            +

            Merged From 1.x

            +
            +

            Features

            +
              +
            • Add Session.default_consistency_level (PYTHON-14)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

            • +
            • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

            • +
            • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

            • +
            • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

            • +
            • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

            • +
            • Avoid rebuilding token metadata when cluster topology has not +actually changed

            • +
            • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

            • +
            +
            +
            +

            Other

            +
              +
            • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

            • +
            +
            +
            +
            +
            +

            2.0.0b1

            +

            May 6, 2014

            +
            +

            Upgrading from 1.x

            +

            Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

            +

            If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

            +
            +

            cluster = Cluster(…, protocol_version=1)

            +
            +
            +
            +

            Features

            +
              +
            • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

            • +
            • Support for Python 3.3 and 3.4

            • +
            • Allow a default query timeout to be set per-Session

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

            • +
            +
            +
            +

            Deprecations

            +

            The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

            +
              +
            • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

            • +
            • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

            • +
            • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

            • +
            • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

            • +
            +

            Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

            +
            +
            +
            +

            1.1.2

            +

            May 8, 2014

            +
            +

            Features

            +
              +
            • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

            • +
            • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

            • +
            • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

            • +
            • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

            • +
            • Handle exhausted ReconnectionPolicy schedule correctly

            • +
            +
            +
            +

            Other

            +
              +
            • Don’t log at ERROR when a connection is closed during the startup +communications

            • +
            • Mke scales, blist optional dependencies

            • +
            +
            +
            +
            +

            1.1.1

            +

            April 16, 2014

            +
            +

            Bug Fixes

            +
              +
            • Fix unconditional import of nose in setup.py (github #111)

            • +
            +
            +
            +
            +

            1.1.0

            +

            April 16, 2014

            +
            +

            Features

            +
              +
            • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

            • +
            • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

            • +
            • Add debian packaging (github issue #101)

            • +
            • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

            • +
            • Lowercase boolean literals when generating schemas

            • +
            • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

            • +
            • Don’t reconnect the control connection every time Cluster.connect() is +called

            • +
            • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

            • +
            • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

            • +
            • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

            • +
            • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

            • +
            • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

            • +
            +
            +
            +

            Other

            +
              +
            • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

            • +
            • Better error message when libevwrapper is not found

            • +
            • Only try to import scales when metrics are enabled (github issue #92)

            • +
            • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

            • +
            • Issue warning log when schema versions do not match

            • +
            +
            +
            +
            +

            1.0.2

            +

            March 4, 2014

            +
            +

            Bug Fixes

            +
              +
            • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

            • +
            • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

            • +
            • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

            • +
            • Handle latest table options when parsing the schema and generating +CREATE statements.

            • +
            • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

            • +
            +
            +
            +

            Other

            +
              +
            • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

            • +
            • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

            • +
            • More consistent type checking for query parameters

            • +
            • Add option to a return special object for empty string values for non-string +columns

            • +
            +
            +
            +
            +

            1.0.1

            +

            Feb 19, 2014

            +
            +

            Bug Fixes

            +
              +
            • Include table indexes in KeyspaceMetadata.export_as_string()

            • +
            • Fix broken token awareness on ByteOrderedPartitioner

            • +
            • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

            • +
            • Handle “custom” types (such as the replaced DateType) correctly

            • +
            • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

            • +
            • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

            • +
            • Handle data that is already utf8-encoded for UTF8Type values

            • +
            • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

            • +
            • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

            • +
            +
            +
            +

            Other

            +
              +
            • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

            • +
            • Add details about errors and the last queried host to OperationTimedOut

            • +
            +
            +
            +
            +

            1.0.0 Final

            +

            Jan 29, 2014

            +
            +

            Bug Fixes

            +
              +
            • Prevent leak of Scheduler thread (even with proper shutdown)

            • +
            • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

            • +
            • Hold strong reference to prepared statement while executing it to avoid +garbage collection

            • +
            • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

            • +
            • Fix bad handling of nodes that have been removed from the cluster

            • +
            • Properly escape string types within cql collections

            • +
            • Handle setting the same keyspace twice in a row

            • +
            • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

            • +
            • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

            • +
            • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

            • +
            • Fix endless hanging of some requests when using the libev reactor

            • +
            • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

            • +
            • Generators map to CQL lists, not key sequences

            • +
            • Always defunct connections when an internal operation fails

            • +
            • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

            • +
            • Avoid potential double-erroring of callbacks when a connection +becomes defunct

            • +
            +
            +
            +

            Features

            +
              +
            • Add default query timeout to Session

            • +
            • Add timeout parameter to Session.execute()

            • +
            • Add WhiteListRoundRobinPolicy as a load balancing policy option

            • +
            • Support for consistency level LOCAL_ONE

            • +
            • Make the backoff for fetching traces exponentially increasing and +configurable

            • +
            +
            +
            +

            Other

            +
              +
            • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

            • +
            • Add encoder mapping for OrderedDict

            • +
            • Use timeouts on all control connection queries

            • +
            • Benchmark improvements, including command line options and eay +multithreading support

            • +
            • Reduced lock contention when using the asyncore reactor

            • +
            • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

            • +
            • Add requirements.txt and test-requirements.txt

            • +
            • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

            • +
            +
            +
            +
            +

            1.0.0b7

            +

            Nov 12, 2013

            +

            This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

            +
            +

            Features

            +
              +
            • Add timeout kwarg to ResponseFuture.result()

            • +
            • Create connection pools to all hosts in parallel when initializing +new Sesssions.

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Properly set exception on ResponseFuture when a query fails +against all hosts

            • +
            • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

            • +
            • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

            • +
            • Better error messages for failed Session.prepare() opertaions

            • +
            • Prepare new statements against all hosts in parallel (formerly +sequential)

            • +
            • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

            • +
            • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

            • +
            • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

            • +
            • Throttle trashing of underutilized connections to avoid trashing newly +created connections

            • +
            • Fix race condition which could result in trashed connections being closed +before the last operations had completed

            • +
            • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

            • +
            • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

            • +
            • Correctly handle large messages through libev

            • +
            • Add timeout to schema agreement check queries

            • +
            • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

            • +
            +
            +
            +

            Other

            +
              +
            • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

            • +
            • Better debug logging around connection management

            • +
            • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

            • +
            +
            +
            +
            +

            1.0.0b6

            +

            Oct 22, 2013

            +
            +

            Bug Fixes

            +
              +
            • Use lazy string formatting when logging

            • +
            • Avoid several deadlock scenarios, especially when nodes go down

            • +
            • Avoid trashing newly created connections due to insufficient traffic

            • +
            • Gracefully handle un-handled Exceptions when erroring callbacks

            • +
            +
            +
            +

            Other

            +
              +
            • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

            • +
            +
            +
            +
            +

            1.0.0b5

            +

            Oct 10, 2013

            +
            +

            Features

            +
              +
            • SSL support

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Avoid KeyError when building replica map for NetworkTopologyStrategy

            • +
            • Work around python bug which causes deadlock when a thread imports +the utf8 module

            • +
            • Handle no blist library, which is not compatible with pypy

            • +
            • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

            • +
            +
            +
            +

            Other

            +
              +
            • Switch packaging from Distribute to setuptools, improved C extension +support

            • +
            • Use PEP 386 compliant beta and post-release versions

            • +
            +
            +
            +
            +

            1.0.0-beta4

            +

            Sep 24, 2013

            +
            +

            Features

            +
              +
            • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

            • +
            • Add cql_version kwarg to Cluster.__init__

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

            • +
            • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

            • +
            +
            +
            +
            +

            1.0.0-beta3

            +

            Sep 20, 2013

            +
            +

            Features

            +
              +
            • Support for LZ4 compression (Cassandra 2.0+)

            • +
            • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

            • +
            +
            +
            +

            Bug Fixes

            +
              +
            • Fix libev include path for CentOS

            • +
            • Fix varint packing of the value 0

            • +
            • Correctly pack unicode values

            • +
            • Don’t attempt to return failed connections to the pool when a final result +is set

            • +
            • Fix bad iteration of connection credentials

            • +
            • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

            • +
            • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

            • +
            • Boolean constants shouldn’t be surrounded by single quotes

            • +
            • Avoid a potential loss of precision on float constants due to string +formatting

            • +
            • Actually utilize non-standard ports set on Cluster objects

            • +
            • Fix export of schema as a set of CQL queries

            • +
            +
            +
            +

            Other

            +
              +
            • Use cStringIO for connection buffer for better performance

            • +
            • Add __repr__ method for Statement classes

            • +
            • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

            • +
            • Make all tests compatible with Python 2.6

            • +
            • Add 1s timeout for opening new connections

            • +
            +
            +
            +
            +

            1.0.0-beta2

            +

            Aug 19, 2013

            +
            +

            Bug Fixes

            +
              +
            • Fix pip packaging

            • +
            +
            +
            +
            +

            1.0.0-beta

            +

            Aug 16, 2013

            +

            Initial release

            +
            +
            + + +
            + + + + + +
            + + +
            +
            +

            +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

            +
            +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/CNAME b/3.25.4-scylla/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/3.25.4-scylla/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/3.25.4-scylla/_sources/CHANGELOG.rst.txt b/3.25.4-scylla/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/3.25.4-scylla/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/3.25.4-scylla/_sources/api/cassandra.rst.txt b/3.25.4-scylla/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/auth.rst.txt b/3.25.4-scylla/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/cluster.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..2b3d7828a8 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/3.25.4-scylla/_sources/api/cassandra/concurrent.rst.txt b/3.25.4-scylla/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/3.25.4-scylla/_sources/api/cassandra/connection.rst.txt b/3.25.4-scylla/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/3.25.4-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/3.25.4-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/3.25.4-scylla/_sources/api/cassandra/cqlengine/management.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/3.25.4-scylla/_sources/api/cassandra/cqlengine/models.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/3.25.4-scylla/_sources/api/cassandra/cqlengine/query.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/3.25.4-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt b/3.25.4-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..a9b41cbdc2 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,133 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + :noindex: + +.. autoclass:: GraphOptions + :noindex: + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + :noindex: + +.. autoclass:: Result + :members: + :noindex: + +.. autoclass:: Vertex + :members: + :noindex: + +.. autoclass:: VertexProperty + :members: + :noindex: + +.. autoclass:: Edge + :members: + :noindex: + +.. autoclass:: Path + :members: + :noindex: + +.. autoclass:: T + :members: + :noindex: + +.. autoclass:: GraphSON1Serializer + :members: + :noindex: + +.. autoclass:: GraphSON1Deserializer + :noindex: + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + :noindex: diff --git a/3.25.4-scylla/_sources/api/cassandra/decoder.rst.txt b/3.25.4-scylla/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/3.25.4-scylla/_sources/api/cassandra/encoder.rst.txt b/3.25.4-scylla/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/3.25.4-scylla/_sources/api/cassandra/graph.rst.txt b/3.25.4-scylla/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt b/3.25.4-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt b/3.25.4-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt b/3.25.4-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/io/geventreactor.rst.txt b/3.25.4-scylla/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/io/libevreactor.rst.txt b/3.25.4-scylla/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/3.25.4-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt b/3.25.4-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/3.25.4-scylla/_sources/api/cassandra/metadata.rst.txt b/3.25.4-scylla/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..7c1280bcf7 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,93 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: ReplicationFactor + :members: + :exclude-members: create + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/3.25.4-scylla/_sources/api/cassandra/metrics.rst.txt b/3.25.4-scylla/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/policies.rst.txt b/3.25.4-scylla/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/pool.rst.txt b/3.25.4-scylla/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/3.25.4-scylla/_sources/api/cassandra/protocol.rst.txt b/3.25.4-scylla/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/3.25.4-scylla/_sources/api/cassandra/query.rst.txt b/3.25.4-scylla/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/3.25.4-scylla/_sources/api/cassandra/timestamps.rst.txt b/3.25.4-scylla/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/3.25.4-scylla/_sources/api/cassandra/util.rst.txt b/3.25.4-scylla/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/3.25.4-scylla/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/3.25.4-scylla/_sources/api/index.rst.txt b/3.25.4-scylla/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/3.25.4-scylla/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/3.25.4-scylla/_sources/cqlengine/batches.rst.txt b/3.25.4-scylla/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/3.25.4-scylla/_sources/cqlengine/connections.rst.txt b/3.25.4-scylla/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/3.25.4-scylla/_sources/cqlengine/faq.rst.txt b/3.25.4-scylla/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/3.25.4-scylla/_sources/cqlengine/models.rst.txt b/3.25.4-scylla/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/3.25.4-scylla/_sources/cqlengine/queryset.rst.txt b/3.25.4-scylla/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/3.25.4-scylla/_sources/cqlengine/third_party.rst.txt b/3.25.4-scylla/_sources/cqlengine/third_party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/third_party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/3.25.4-scylla/_sources/cqlengine/upgrade_guide.rst.txt b/3.25.4-scylla/_sources/cqlengine/upgrade_guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/3.25.4-scylla/_sources/cqlengine/upgrade_guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/3.25.4-scylla/_sources/dates_and_times.rst.txt b/3.25.4-scylla/_sources/dates_and_times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/3.25.4-scylla/_sources/dates_and_times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/3.25.4-scylla/_sources/execution_profiles.rst.txt b/3.25.4-scylla/_sources/execution_profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/3.25.4-scylla/_sources/execution_profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/3.25.4-scylla/_sources/faq.rst.txt b/3.25.4-scylla/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/3.25.4-scylla/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/3.25.4-scylla/_sources/getting_started.rst.txt b/3.25.4-scylla/_sources/getting_started.rst.txt new file mode 100644 index 0000000000..59a2acbd04 --- /dev/null +++ b/3.25.4-scylla/_sources/getting_started.rst.txt @@ -0,0 +1,479 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to a Cluster +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +First, make sure you have the Cassandra driver properly :doc:`installed `. + +Connecting to Cassandra ++++++++++++++++++++++++ +The simplest way to create a :class:`~.Cluster` is like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +Session Keyspace +---------------- +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Execution Profiles +------------------ +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +--------------------------------- +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +---------------- +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +-------------------- +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +---------------------------------------------------- +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +--------------------- + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/3.25.4-scylla/_sources/index.rst.txt b/3.25.4-scylla/_sources/index.rst.txt new file mode 100644 index 0000000000..fed26e9fc9 --- /dev/null +++ b/3.25.4-scylla/_sources/index.rst.txt @@ -0,0 +1,105 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting_started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla_specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution_profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object_mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query_paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user_defined_types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates_and_times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla_cloud` + Connect to Scylla Cloud + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting_started + scylla_specific + upgrading + execution_profiles + performance + query_paging + lwt + security + user_defined_types + object_mapper + dates_and_times + scylla_cloud + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. + + diff --git a/3.25.4-scylla/_sources/installation.rst.txt b/3.25.4-scylla/_sources/installation.rst.txt new file mode 100644 index 0000000000..4996a02c1b --- /dev/null +++ b/3.25.4-scylla/_sources/installation.rst.txt @@ -0,0 +1,234 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/3.25.4-scylla/_sources/lwt.rst.txt b/3.25.4-scylla/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/3.25.4-scylla/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/3.25.4-scylla/_sources/object_mapper.rst.txt b/3.25.4-scylla/_sources/object_mapper.rst.txt new file mode 100644 index 0000000000..50d3cbf320 --- /dev/null +++ b/3.25.4-scylla/_sources/object_mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade_guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third_party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade_guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third_party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/3.25.4-scylla/_sources/performance.rst.txt b/3.25.4-scylla/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/3.25.4-scylla/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/3.25.4-scylla/_sources/query_paging.rst.txt b/3.25.4-scylla/_sources/query_paging.rst.txt new file mode 100644 index 0000000000..23ee2c1129 --- /dev/null +++ b/3.25.4-scylla/_sources/query_paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_state'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/3.25.4-scylla/_sources/scylla_cloud.rst.txt b/3.25.4-scylla/_sources/scylla_cloud.rst.txt new file mode 100644 index 0000000000..62aaf76433 --- /dev/null +++ b/3.25.4-scylla/_sources/scylla_cloud.rst.txt @@ -0,0 +1,5 @@ +Scylla Cloud +------------ + +To connect to a `Scylla Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/3.25.4-scylla/_sources/scylla_specific.rst.txt b/3.25.4-scylla/_sources/scylla_specific.rst.txt new file mode 100644 index 0000000000..24e2182dc6 --- /dev/null +++ b/3.25.4-scylla/_sources/scylla_specific.rst.txt @@ -0,0 +1,106 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/design-notes/protocol-extensions.md#intranode-sharding + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +See the configuration of ``native_shard_aware_transport_port`` and ``native_shard_aware_transport_port_ssl`` on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/design-notes/protocols.md#cql-client-protocol + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``shard_aware_options`` + + Setting it to ``dict(disable=True)`` would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections + + Other option is to configure scylla by setting ``enable_shard_aware_drivers: false`` on scylla.yaml. + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(shard_aware_options=dict(disable=True)) + session = cluster.connect() + + assert not cluster.is_shard_aware(), "Shard aware should be disabled" + + # or just disable the shard aware port logic + cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True)) + session = cluster.connect() + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Table Attributes +-------------------- + +* ``in_memory`` flag + + New flag available on ``TableMetadata.options`` to indicate that it is an `In Memory `_ table + +.. note:: in memory tables is a feature existing only in Scylla Enterprise + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}; + """) + + session.execute(""" + CREATE TABLE IF NOT EXISTS keyspace1.standard1 ( + key blob PRIMARY KEY, + "C0" blob + ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'} + """) + + cluster.refresh_table_metadata("keyspace1", "standard1") + assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True diff --git a/3.25.4-scylla/_sources/security.rst.txt b/3.25.4-scylla/_sources/security.rst.txt new file mode 100644 index 0000000000..c30189562f --- /dev/null +++ b/3.25.4-scylla/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS + + ssl_context = SSLContext(PROTOCOL_TLS) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_2_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLS`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLS, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLS, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/3.25.4-scylla/_sources/upgrading.rst.txt b/3.25.4-scylla/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..9559fa3579 --- /dev/null +++ b/3.25.4-scylla/_sources/upgrading.rst.txt @@ -0,0 +1,388 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Upgrading from dse-driver +------------------------- + +Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes. + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/3.25.4-scylla/_sources/user_defined_types.rst.txt b/3.25.4-scylla/_sources/user_defined_types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/3.25.4-scylla/_sources/user_defined_types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
            )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
            )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
            )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/3.25.4-scylla/_static/basic.css b/3.25.4-scylla/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/3.25.4-scylla/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/3.25.4-scylla/_static/check-solid.svg b/3.25.4-scylla/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/3.25.4-scylla/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.25.4-scylla/_static/clipboard.min.js b/3.25.4-scylla/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/3.25.4-scylla/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/3.25.4-scylla/_static/copybutton.css b/3.25.4-scylla/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/3.25.4-scylla/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

            Short

            + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/3.25.4-scylla/_static/copybutton.js b/3.25.4-scylla/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/3.25.4-scylla/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/3.25.4-scylla/_static/copybutton_funcs.js b/3.25.4-scylla/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/3.25.4-scylla/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/3.25.4-scylla/_static/css/main.css b/3.25.4-scylla/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/3.25.4-scylla/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/3.25.4-scylla/_static/doctools.js b/3.25.4-scylla/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/3.25.4-scylla/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/3.25.4-scylla/_static/documentation_options.js b/3.25.4-scylla/_static/documentation_options.js new file mode 100644 index 0000000000..31814e0ca7 --- /dev/null +++ b/3.25.4-scylla/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.25.4', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/3.25.4-scylla/_static/file.png b/3.25.4-scylla/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/3.25.4-scylla/_static/file.png differ diff --git a/3.25.4-scylla/_static/img/banner-background.svg b/3.25.4-scylla/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/3.25.4-scylla/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/favicon-228x228.png b/3.25.4-scylla/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/3.25.4-scylla/_static/img/favicon-228x228.png differ diff --git a/3.25.4-scylla/_static/img/favicon-32x32.png b/3.25.4-scylla/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/3.25.4-scylla/_static/img/favicon-32x32.png differ diff --git a/3.25.4-scylla/_static/img/favicon.ico b/3.25.4-scylla/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/3.25.4-scylla/_static/img/favicon.ico differ diff --git a/3.25.4-scylla/_static/img/icons/icon-about-team.svg b/3.25.4-scylla/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/3.25.4-scylla/_static/img/icons/icon-about-us-m.svg b/3.25.4-scylla/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-about-us.svg b/3.25.4-scylla/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-alternator.svg b/3.25.4-scylla/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-apps.svg b/3.25.4-scylla/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-architecture.svg b/3.25.4-scylla/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/3.25.4-scylla/_static/img/icons/icon-benchmarks.svg b/3.25.4-scylla/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/3.25.4-scylla/_static/img/icons/icon-blog.svg b/3.25.4-scylla/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/3.25.4-scylla/_static/img/icons/icon-careers.svg b/3.25.4-scylla/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/3.25.4-scylla/_static/img/icons/icon-chevron-left.svg b/3.25.4-scylla/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-chevron-right.svg b/3.25.4-scylla/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-circe.svg b/3.25.4-scylla/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-clock.svg b/3.25.4-scylla/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-close.svg b/3.25.4-scylla/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-cloud-docs.svg b/3.25.4-scylla/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-cloud.svg b/3.25.4-scylla/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-comparison.svg b/3.25.4-scylla/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/3.25.4-scylla/_static/img/icons/icon-contact-us.svg b/3.25.4-scylla/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/3.25.4-scylla/_static/img/icons/icon-developers-blog.svg b/3.25.4-scylla/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/3.25.4-scylla/_static/img/icons/icon-docs.svg b/3.25.4-scylla/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/3.25.4-scylla/_static/img/icons/icon-enterprise-m.svg b/3.25.4-scylla/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-enterprise.svg b/3.25.4-scylla/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-events.svg b/3.25.4-scylla/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/3.25.4-scylla/_static/img/icons/icon-exclamation.svg b/3.25.4-scylla/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-expand.svg b/3.25.4-scylla/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-forum.svg b/3.25.4-scylla/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-getting-started.svg b/3.25.4-scylla/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-glossary.svg b/3.25.4-scylla/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-home.svg b/3.25.4-scylla/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-infoworld.svg b/3.25.4-scylla/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/3.25.4-scylla/_static/img/icons/icon-integrations.svg b/3.25.4-scylla/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-knowledge-base.svg b/3.25.4-scylla/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-less.svg b/3.25.4-scylla/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-live-test.svg b/3.25.4-scylla/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/3.25.4-scylla/_static/img/icons/icon-mail-list.svg b/3.25.4-scylla/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-manager.svg b/3.25.4-scylla/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/3.25.4-scylla/_static/img/icons/icon-memory-management.svg b/3.25.4-scylla/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/3.25.4-scylla/_static/img/icons/icon-modeling.svg b/3.25.4-scylla/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-monitoring.svg b/3.25.4-scylla/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/3.25.4-scylla/_static/img/icons/icon-networking.svg b/3.25.4-scylla/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/3.25.4-scylla/_static/img/icons/icon-news.svg b/3.25.4-scylla/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/3.25.4-scylla/_static/img/icons/icon-newsletter.svg b/3.25.4-scylla/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/3.25.4-scylla/_static/img/icons/icon-nsql-guides.svg b/3.25.4-scylla/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/3.25.4-scylla/_static/img/icons/icon-open-source.svg b/3.25.4-scylla/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/3.25.4-scylla/_static/img/icons/icon-operator.svg b/3.25.4-scylla/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-overview.svg b/3.25.4-scylla/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/3.25.4-scylla/_static/img/icons/icon-partners.svg b/3.25.4-scylla/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/3.25.4-scylla/_static/img/icons/icon-plus.svg b/3.25.4-scylla/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-pricing.svg b/3.25.4-scylla/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/3.25.4-scylla/_static/img/icons/icon-release-notes.svg b/3.25.4-scylla/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/3.25.4-scylla/_static/img/icons/icon-resource-center.svg b/3.25.4-scylla/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/3.25.4-scylla/_static/img/icons/icon-roadmap.svg b/3.25.4-scylla/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/3.25.4-scylla/_static/img/icons/icon-search.svg b/3.25.4-scylla/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-slack.svg b/3.25.4-scylla/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-stack-overflow.svg b/3.25.4-scylla/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-summit.svg b/3.25.4-scylla/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/icons/icon-support.svg b/3.25.4-scylla/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/3.25.4-scylla/_static/img/icons/icon-tech-talks.svg b/3.25.4-scylla/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/3.25.4-scylla/_static/img/icons/icon-testing.svg b/3.25.4-scylla/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/3.25.4-scylla/_static/img/icons/icon-thumbs-down.svg b/3.25.4-scylla/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-thumbs-up.svg b/3.25.4-scylla/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.25.4-scylla/_static/img/icons/icon-tip.svg b/3.25.4-scylla/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-training.svg b/3.25.4-scylla/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/3.25.4-scylla/_static/img/icons/icon-triangle-down.svg b/3.25.4-scylla/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-university.svg b/3.25.4-scylla/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/3.25.4-scylla/_static/img/icons/icon-users-blog.svg b/3.25.4-scylla/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/3.25.4-scylla/_static/img/icons/icon-warning.svg b/3.25.4-scylla/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/icons/icon-webinars.svg b/3.25.4-scylla/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/3.25.4-scylla/_static/img/icons/icon-whitepapers.svg b/3.25.4-scylla/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/3.25.4-scylla/_static/img/icons/icon-workshop.svg b/3.25.4-scylla/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/3.25.4-scylla/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/3.25.4-scylla/_static/img/logo-docs.svg b/3.25.4-scylla/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/3.25.4-scylla/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/logo-scylla-horizontal-RGB.svg b/3.25.4-scylla/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/3.25.4-scylla/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.25.4-scylla/_static/img/mascots/404.jpg b/3.25.4-scylla/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/404.jpg differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-3monsters.png b/3.25.4-scylla/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-3monsters.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-advisor-crystal.png b/3.25.4-scylla/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-alternator.svg b/3.25.4-scylla/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/3.25.4-scylla/_static/img/mascots/scylla-cloud.svg b/3.25.4-scylla/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/3.25.4-scylla/_static/img/mascots/scylla-computer-3-monsters.png b/3.25.4-scylla/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-computer-headset.png b/3.25.4-scylla/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-computer-headset.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-cup-number-one.png b/3.25.4-scylla/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-docs.svg b/3.25.4-scylla/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/3.25.4-scylla/_static/img/mascots/scylla-drivers.svg b/3.25.4-scylla/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/3.25.4-scylla/_static/img/mascots/scylla-enterprise.svg b/3.25.4-scylla/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/3.25.4-scylla/_static/img/mascots/scylla-forklift-boxes.png b/3.25.4-scylla/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-forklift-migration.png b/3.25.4-scylla/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-gear.png b/3.25.4-scylla/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-gear.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-hardhat.png b/3.25.4-scylla/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-hardhat.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-headband.png b/3.25.4-scylla/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-headband.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-headset.png b/3.25.4-scylla/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-headset.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-hearts.png b/3.25.4-scylla/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-hearts.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-looking-down.png b/3.25.4-scylla/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-looking-down.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-looking-up.png b/3.25.4-scylla/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-looking-up.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png b/3.25.4-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-magnifying-glass.png b/3.25.4-scylla/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-manager.svg b/3.25.4-scylla/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/3.25.4-scylla/_static/img/mascots/scylla-monitor.svg b/3.25.4-scylla/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/3.25.4-scylla/_static/img/mascots/scylla-movement-fast.png b/3.25.4-scylla/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-movement-fast.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-movement.png b/3.25.4-scylla/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-movement.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-onpremise.png b/3.25.4-scylla/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-onpremise.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-opensource.svg b/3.25.4-scylla/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/3.25.4-scylla/_static/img/mascots/scylla-operator.svg b/3.25.4-scylla/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/3.25.4-scylla/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/3.25.4-scylla/_static/img/mascots/scylla-plugin.png b/3.25.4-scylla/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-plugin.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-release-mascot.png b/3.25.4-scylla/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-release-mascot.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-repair.png b/3.25.4-scylla/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-repair.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-server.png b/3.25.4-scylla/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-server.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-sleeping.png b/3.25.4-scylla/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-sleeping.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-tall-measure.png b/3.25.4-scylla/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-tall-measure.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-university.png b/3.25.4-scylla/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-university.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-weights.png b/3.25.4-scylla/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-weights.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-window-cleaning.png b/3.25.4-scylla/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-with-computer-2.png b/3.25.4-scylla/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-with-computer.png b/3.25.4-scylla/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-with-computer.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-with-linux.png b/3.25.4-scylla/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-with-linux.png differ diff --git a/3.25.4-scylla/_static/img/mascots/scylla-writting.png b/3.25.4-scylla/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/3.25.4-scylla/_static/img/mascots/scylla-writting.png differ diff --git a/3.25.4-scylla/_static/img/menu.svg b/3.25.4-scylla/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/3.25.4-scylla/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.25.4-scylla/_static/js/main.bundle.js b/3.25.4-scylla/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/3.25.4-scylla/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
          • Back
          • ',backButtonPosition:"top",wrapper:"
            ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
              "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
              ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
              ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
              ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
              ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
              "],col:[2,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra - Exceptions and Enums

              +
              +
              +cassandra.__version_info__
              +

              The version of the driver in a tuple format

              +
              + +
              +
              +cassandra.__version__
              +

              The version of the driver in a string format

              +
              + +
              +
              +class cassandra.ConsistencyLevel
              +

              Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

              +
              +
              +ANY = 0
              +

              Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

              +
              + +
              +
              +ONE = 1
              +

              Only one replica needs to respond to consider the operation a success

              +
              + +
              +
              +TWO = 2
              +

              Two replicas must respond to consider the operation a success

              +
              + +
              +
              +THREE = 3
              +

              Three replicas must respond to consider the operation a success

              +
              + +
              +
              +QUORUM = 4
              +

              ceil(RF/2) + 1 replicas must respond to consider the operation a success

              +
              + +
              +
              +ALL = 5
              +

              All replicas must respond to consider the operation a success

              +
              + +
              +
              +LOCAL_QUORUM = 6
              +

              Requires a quorum of replicas in the local datacenter

              +
              + +
              +
              +EACH_QUORUM = 7
              +

              Requires a quorum of replicas in each datacenter

              +
              + +
              +
              +SERIAL = 8
              +

              For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

              +
              + +
              +
              +LOCAL_SERIAL = 9
              +

              Like SERIAL, but only requires consensus +among replicas in the local datacenter.

              +
              + +
              +
              +LOCAL_ONE = 10
              +

              Sends a request only to replicas in the local datacenter and waits for +one response.

              +
              + +
              + +
              +
              +class cassandra.ProtocolVersion
              +

              Defines native protocol versions supported by this driver.

              +
              +
              +V1 = 1
              +

              v1, supported in Cassandra 1.2–>2.2

              +
              + +
              +
              +V2 = 2
              +

              v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

              +
              + +
              +
              +V3 = 3
              +

              v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

              +
              + +
              +
              +V4 = 4
              +

              v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

              +
              + +
              +
              +V5 = 5
              +

              v5, in beta from 3.x+. Finalised in 4.0-beta5

              +
              + +
              +
              +V6 = 6
              +

              v6, in beta from 4.0-beta5

              +
              + +
              +
              +DSE_V1 = 65
              +

              DSE private protocol v1, supported in DSE 5.1+

              +
              + +
              +
              +DSE_V2 = 66
              +

              DSE private protocol v2, supported in DSE 6.0+

              +
              + +
              +
              +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
              +

              A tuple of all supported protocol versions

              +
              + +
              +
              +BETA_VERSIONS = (6,)
              +

              A tuple of all beta protocol versions

              +
              + +
              +
              +MIN_SUPPORTED = 1
              +

              Minimum protocol version supported by this driver.

              +
              + +
              +
              +MAX_SUPPORTED = 66
              +

              Maximum protocol version supported by this driver.

              +
              + +
              +
              +classmethod get_lower_supported(previous_version)
              +

              Return the lower supported protocol version. Beta versions are omitted.

              +
              + +
              + +
              +
              +class cassandra.UserFunctionDescriptor(name, argument_types)
              +

              Describes a User function by name and argument signature

              +
              +
              +name = None
              +

              name of the function

              +
              + +
              +
              +argument_types = None
              +

              Ordered list of CQL argument type names comprising the type signature

              +
              + +
              +
              +property signature
              +

              function signature string in the form ‘name([type0[,type1[…]]])’

              +

              can be used to uniquely identify overloaded function names within a keyspace

              +
              + +
              + +
              +
              +class cassandra.UserAggregateDescriptor(name, argument_types)
              +

              Describes a User aggregate function by name and argument signature

              +
              +
              +name = None
              +

              name of the aggregate

              +
              + +
              +
              +argument_types = None
              +

              Ordered list of CQL argument type names comprising the type signature

              +
              + +
              +
              +property signature
              +

              function signature string in the form ‘name([type0[,type1[…]]])’

              +

              can be used to uniquely identify overloaded function names within a keyspace

              +
              + +
              + +
              +
              +exception cassandra.DriverException
              +

              Base for all exceptions explicitly raised by the driver.

              +
              + +
              +
              +exception cassandra.RequestExecutionException
              +

              Base for request execution exceptions returned from the server.

              +
              + +
              +
              +exception cassandra.Unavailable
              +

              There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

              +
              +
              +consistency = None
              +

              The requested ConsistencyLevel

              +
              + +
              +
              +required_replicas = None
              +

              The number of replicas that needed to be live to complete the operation

              +
              + +
              +
              +alive_replicas = None
              +

              The number of replicas that were actually alive

              +
              + +
              + +
              +
              +exception cassandra.Timeout
              +

              Replicas failed to respond to the coordinator node before timing out.

              +
              +
              +consistency = None
              +

              The requested ConsistencyLevel

              +
              + +
              +
              +required_responses = None
              +

              The number of required replica responses

              +
              + +
              +
              +received_responses = None
              +

              The number of replicas that responded before the coordinator timed out +the operation

              +
              + +
              + +
              +
              +exception cassandra.ReadTimeout
              +

              A subclass of Timeout for read operations.

              +

              This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

              +
              +
              +data_retrieved = None
              +

              A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

              +
              + +
              + +
              +
              +exception cassandra.WriteTimeout
              +

              A subclass of Timeout for write operations.

              +

              This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

              +
              +
              +write_type = None
              +

              The type of write operation, enum on WriteType

              +
              + +
              + +
              +
              +exception cassandra.CoordinationFailure
              +

              Replicas sent a failure to the coordinator.

              +
              +
              +consistency = None
              +

              The requested ConsistencyLevel

              +
              + +
              +
              +required_responses = None
              +

              The number of required replica responses

              +
              + +
              +
              +received_responses = None
              +

              The number of replicas that responded before the coordinator timed out +the operation

              +
              + +
              +
              +failures = None
              +

              The number of replicas that sent a failure message

              +
              + +
              +
              +error_code_map = None
              +

              A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

              +
              + +
              + +
              +
              +exception cassandra.ReadFailure
              +

              A subclass of CoordinationFailure for read operations.

              +

              This indicates that the replicas sent a failure message to the coordinator.

              +
              +
              +data_retrieved = None
              +

              A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

              +
              + +
              + +
              +
              +exception cassandra.WriteFailure
              +

              A subclass of CoordinationFailure for write operations.

              +

              This indicates that the replicas sent a failure message to the coordinator.

              +
              +
              +write_type = None
              +

              The type of write operation, enum on WriteType

              +
              + +
              + +
              +
              +exception cassandra.FunctionFailure
              +

              User Defined Function failed during execution

              +
              +
              +keyspace = None
              +

              Keyspace of the function

              +
              + +
              +
              +function = None
              +

              Name of the function

              +
              + +
              +
              +arg_types = None
              +

              List of argument type names of the function

              +
              + +
              + +
              +
              +exception cassandra.RequestValidationException
              +

              Server request validation failed

              +
              + +
              +
              +exception cassandra.ConfigurationException
              +

              Server indicated request errro due to current configuration

              +
              + +
              +
              +exception cassandra.AlreadyExists
              +

              An attempt was made to create a keyspace or table that already exists.

              +
              +
              +keyspace = None
              +

              The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

              +
              + +
              +
              +table = None
              +

              The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

              +
              + +
              + +
              +
              +exception cassandra.InvalidRequest
              +

              A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

              +
              + +
              +
              +exception cassandra.Unauthorized
              +

              The current user is not authorized to perform the requested operation.

              +
              + +
              +
              +exception cassandra.AuthenticationFailed
              +

              Failed to authenticate.

              +
              + +
              +
              +exception cassandra.OperationTimedOut
              +

              The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

              +
              +
              +errors = None
              +

              A dict of errors keyed by the Host against which they occurred.

              +
              + +
              +
              +last_host = None
              +

              The last Host this operation was attempted against.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/auth.html b/3.25.4-scylla/api/cassandra/auth.html new file mode 100644 index 0000000000..a4efdbd711 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/auth.html @@ -0,0 +1,829 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.auth - Authentication

              +
              +
              +class cassandra.auth.AuthProvider
              +

              An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

              +
              +

              New in version 2.0.0.

              +
              +
              +
              +new_authenticator(host)
              +

              Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

              +
              + +
              + +
              +
              +class cassandra.auth.Authenticator
              +

              An abstract class that handles SASL authentication with Cassandra servers.

              +

              Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

              +

              1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

              +

              2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

              +

              3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

              +

              The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

              +
              +

              New in version 2.0.0.

              +
              +
              +
              +server_authenticator_class = None
              +

              Set during the connection AUTHENTICATE phase

              +
              + +
              +
              +initial_response()
              +

              Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

              +
              + +
              +
              +evaluate_challenge(challenge)
              +

              Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

              +
              + +
              +
              +on_authentication_success(token)
              +

              Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

              +
              + +
              + +
              +
              +class cassandra.auth.PlainTextAuthProvider(username, password)
              +

              An AuthProvider that works with Cassandra’s PasswordAuthenticator.

              +

              Example usage:

              +
              from cassandra.cluster import Cluster
              +from cassandra.auth import PlainTextAuthProvider
              +
              +auth_provider = PlainTextAuthProvider(
              +        username='cassandra', password='cassandra')
              +cluster = Cluster(auth_provider=auth_provider)
              +
              +
              +
              +

              New in version 2.0.0.

              +
              +
              +
              +new_authenticator(host)
              +

              Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

              +
              + +
              + +
              +
              +class cassandra.auth.PlainTextAuthenticator(username, password)
              +
              +
              +evaluate_challenge(challenge)
              +

              Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

              +
              + +
              + +
              +
              +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
              +

              An AuthProvider supporting general SASL auth mechanisms

              +

              Suitable for GSSAPI or other SASL mechanisms

              +

              Example usage:

              +
              from cassandra.cluster import Cluster
              +from cassandra.auth import SaslAuthProvider
              +
              +sasl_kwargs = {'service': 'something',
              +               'mechanism': 'GSSAPI',
              +               'qops': 'auth'.split(',')}
              +auth_provider = SaslAuthProvider(**sasl_kwargs)
              +cluster = Cluster(auth_provider=auth_provider)
              +
              +
              +
              +

              New in version 2.1.4.

              +
              +
              +
              +new_authenticator(host)
              +

              Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

              +
              + +
              + +
              +
              +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
              +

              A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

              +
              +

              New in version 2.1.4.

              +
              +
              +
              +initial_response()
              +

              Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

              +
              + +
              +
              +evaluate_challenge(challenge)
              +

              Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cluster.html b/3.25.4-scylla/api/cassandra/cluster.html new file mode 100644 index 0000000000..b6f8f42196 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cluster.html @@ -0,0 +1,1904 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cluster - Clusters and Sessions

              +
              +
              +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
              +

              The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

              +

              Example usage:

              +
              >>> from cassandra.cluster import Cluster
              +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
              +>>> session = cluster.connect()
              +>>> session.execute("CREATE KEYSPACE ...")
              +>>> ...
              +>>> cluster.shutdown()
              +
              +
              +

              Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

              +

              executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

              +

              Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

              +
              +
              +contact_points = ['127.0.0.1']
              +
              + +
              +
              +port = 9042
              +
              + +
              +
              +cql_version = None
              +
              + +
              +
              +protocol_version = 66
              +
              + +
              +
              +compression = True
              +
              + +
              +
              +auth_provider
              +

              When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

              +

              When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

              +

              When not using authentication, this should be left as None.

              +
              + +
              +
              +load_balancing_policy
              +

              An instance of policies.LoadBalancingPolicy or +one of its subclasses.

              +
              +

              Changed in version 2.6.0.

              +
              +

              Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

              +

              Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

              +
              + +
              +
              +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
              +
              + +
              +
              +default_retry_policy = <cassandra.policies.RetryPolicy object>
              +

              A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

              +
              + +
              +
              +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
              +
              + +
              +
              +address_translator = <cassandra.policies.IdentityTranslator object>
              +
              + +
              +
              +metrics_enabled = False
              +
              + +
              +
              +metrics = None
              +
              + +
              +
              +ssl_context = None
              +
              + +
              +
              +ssl_options = None
              +
              + +
              +
              +sockopts = None
              +
              + +
              +
              +max_schema_agreement_wait = 10
              +
              + +
              +
              +metadata = None
              +
              + +
              +
              +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
              +
              + +
              +
              +control_connection_timeout = 2.0
              +
              + +
              +
              +idle_heartbeat_interval = 30
              +
              + +
              +
              +idle_heartbeat_timeout = 30
              +
              + +
              +
              +schema_event_refresh_window = 2
              +
              + +
              +
              +topology_event_refresh_window = 10
              +
              + +
              +
              +status_event_refresh_window = 2
              +
              + +
              +
              +prepare_on_all_hosts = True
              +
              + +
              +
              +reprepare_on_up = True
              +
              + +
              +
              +connect_timeout = 5
              +
              + +
              +
              +schema_metadata_enabled = True
              +

              Flag indicating whether internal schema metadata is updated.

              +

              When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

              +
              + +
              +
              +token_metadata_enabled = True
              +

              Flag indicating whether internal token metadata is updated.

              +

              When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

              +
              + +
              +
              +timestamp_generator = None
              +
              + +
              +
              +endpoint_factory = None
              +
              + +
              +
              +cloud = None
              +
              + +
              +
              +connect(keyspace=None, wait_for_all_pools=False)
              +

              Creates and returns a new Session object.

              +

              If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

              +

              wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

              +
              + +
              +
              +shutdown()
              +

              Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

              +

              Once shutdown, a Cluster should not be used for any purpose.

              +
              + +
              +
              +register_user_type(keyspace, user_type, klass)
              +

              Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

              +

              keyspace is the name of the keyspace that the UDT is defined in.

              +

              user_type is the string name of the UDT to register the mapping +for.

              +

              klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

              +

              This method should only be called after the type has been created +within Cassandra.

              +

              Example:

              +
              cluster = Cluster(protocol_version=3)
              +session = cluster.connect()
              +session.set_keyspace('mykeyspace')
              +session.execute("CREATE TYPE address (street text, zipcode int)")
              +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
              +
              +# create a class to map to the "address" UDT
              +class Address(object):
              +
              +    def __init__(self, street, zipcode):
              +        self.street = street
              +        self.zipcode = zipcode
              +
              +cluster.register_user_type('mykeyspace', 'address', Address)
              +
              +# insert a row using an instance of Address
              +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
              +                (0, Address("123 Main St.", 78723)))
              +
              +# results will include Address instances
              +results = session.execute("SELECT * FROM users")
              +row = results[0]
              +print row.id, row.location.street, row.location.zipcode
              +
              +
              +
              + +
              +
              +register_listener(listener)
              +

              Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

              +
              + +
              +
              +unregister_listener(listener)
              +

              Removes a registered listener.

              +
              + +
              +
              +add_execution_profile(name, profile, pool_wait_timeout=5)
              +

              Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

              +

              Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

              +

              Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

              +
              + +
              +
              +set_max_requests_per_connection(host_distance, max_requests)
              +

              Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

              +

              Pertains to connection pool management in protocol versions {1,2}.

              +
              + +
              +
              +get_max_requests_per_connection(host_distance)
              +
              + +
              +
              +set_min_requests_per_connection(host_distance, min_requests)
              +

              Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

              +

              Pertains to connection pool management in protocol versions {1,2}.

              +
              + +
              +
              +get_min_requests_per_connection(host_distance)
              +
              + +
              +
              +get_core_connections_per_host(host_distance)
              +

              Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

              +

              This property is ignored if protocol_version is +3 or higher.

              +
              + +
              +
              +set_core_connections_per_host(host_distance, core_connections)
              +

              Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

              +

              Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

              +

              If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

              +
              + +
              +
              +get_max_connections_per_host(host_distance)
              +

              Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

              +

              This property is ignored if protocol_version is +3 or higher.

              +
              + +
              +
              +set_max_connections_per_host(host_distance, max_connections)
              +

              Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

              +

              If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

              +
              + +
              +
              +get_control_connection_host()
              +

              Returns the control connection host metadata.

              +
              + +
              +
              +refresh_schema_metadata(max_schema_agreement_wait=None)
              +

              Synchronously refresh all schema metadata.

              +

              By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

              +

              Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

              +

              Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

              +

              An Exception is raised if schema refresh fails for any reason.

              +
              + +
              +
              +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
              +

              Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

              +

              See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

              +
              + +
              +
              +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
              +

              Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

              +

              See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

              +
              + +
              +
              +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
              +

              Synchronously refresh user defined type metadata.

              +

              See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

              +
              + +
              +
              +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
              +

              Synchronously refresh user defined function metadata.

              +

              function is a cassandra.UserFunctionDescriptor.

              +

              See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

              +
              + +
              +
              +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
              +

              Synchronously refresh user defined aggregate metadata.

              +

              aggregate is a cassandra.UserAggregateDescriptor.

              +

              See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

              +
              + +
              +
              +refresh_nodes(force_token_rebuild=False)
              +

              Synchronously refresh the node list and token metadata

              +

              force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

              +

              An Exception is raised if node refresh fails for any reason.

              +
              + +
              +
              +set_meta_refresh_enabled(enabled)
              +

              Deprecated: set schema_metadata_enabled token_metadata_enabled instead

              +

              Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

              +

              Disabling this is useful to minimize refreshes during multiple changes.

              +

              Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

              +
              + +
              + +
              +
              +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
              +
              +
              +consistency_level = LOCAL_ONE
              +
              + +
              +
              +static row_factory(colnames, rows)
              +

              Returns each row as a namedtuple. +This is the default row factory.

              +

              Example:

              +
              >>> from cassandra.query import named_tuple_factory
              +>>> session = cluster.connect('mykeyspace')
              +>>> session.row_factory = named_tuple_factory
              +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
              +>>> user = rows[0]
              +
              +>>> # you can access field by their name:
              +>>> print "name: %s, age: %d" % (user.name, user.age)
              +name: Bob, age: 42
              +
              +>>> # or you can access fields by their position (like a tuple)
              +>>> name, age = user
              +>>> print "name: %s, age: %d" % (name, age)
              +name: Bob, age: 42
              +>>> name = user[0]
              +>>> age = user[1]
              +>>> print "name: %s, age: %d" % (name, age)
              +name: Bob, age: 42
              +
              +
              +
              +

              Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

              +
              +
              + +
              + +
              +
              +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
              +

              Default execution profile for graph execution.

              +

              See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

              +

              In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

              +
              + +
              +
              +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
              +

              Execution profile with timeout and load balancing appropriate for graph analytics queries.

              +

              See also GraphExecutionPolicy.

              +

              In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

              +

              Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

              +
              + +
              +
              +cassandra.cluster.EXEC_PROFILE_DEFAULT
              +

              The base class of the class hierarchy.

              +

              When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

              +
              + +
              +
              +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
              +

              The base class of the class hierarchy.

              +

              When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

              +
              + +
              +
              +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
              +

              The base class of the class hierarchy.

              +

              When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

              +
              + +
              +
              +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
              +

              The base class of the class hierarchy.

              +

              When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

              +
              + +
              +
              +class cassandra.cluster.Session
              +

              A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

              +

              Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

              +

              Example usage:

              +
              >>> session = cluster.connect()
              +>>> session.set_keyspace("mykeyspace")
              +>>> session.execute("SELECT * FROM mycf")
              +
              +
              +
              +
              +default_timeout = 10.0
              +

              A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

              +

              Setting this to None will cause no timeouts to be set by default.

              +

              Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

              +
              +

              New in version 2.0.0.

              +
              +
              + +
              +
              +default_consistency_level = LOCAL_ONE
              +

              Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

              +
              +

              New in version 1.2.0.

              +
              +
              +

              Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

              +
              +
              + +
              +
              +default_serial_consistency_level = None
              +

              The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

              +

              Only valid for protocol_version >= 2.

              +
              + +
              +
              +row_factory = <function named_tuple_factory>
              +

              The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

              + +
              + +
              +
              +default_fetch_size = 5000
              +
              + +
              +
              +use_client_timestamp = True
              +
              + +
              +
              +timestamp_generator = None
              +
              + +
              +
              +encoder = None
              +
              + +
              +
              +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
              +
              + +
              +
              +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
              +

              Execute the given query and synchronously wait for the response.

              +

              If an error is encountered while executing the query, an Exception +will be raised.

              +

              query may be a query string or an instance of cassandra.query.Statement.

              +

              parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

              +

              timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

              +

              If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

              +

              custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

              +

              execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

              +

              paging_state is an optional paging state, reused from a previous ResultSet.

              +

              host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

              +

              execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

              +
              + +
              +
              +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
              +

              Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

              +

              See Session.execute() for parameter definitions.

              +

              Example usage:

              +
              >>> session = cluster.connect()
              +>>> future = session.execute_async("SELECT * FROM mycf")
              +
              +>>> def log_results(results):
              +...     for row in results:
              +...         log.info("Results: %s", row)
              +
              +>>> def log_error(exc):
              +>>>     log.error("Operation failed: %s", exc)
              +
              +>>> future.add_callbacks(log_results, log_error)
              +
              +
              +

              Async execution with blocking wait for results:

              +
              >>> future = session.execute_async("SELECT * FROM mycf")
              +>>> # do other stuff...
              +
              +>>> try:
              +...     results = future.result()
              +... except Exception:
              +...     log.exception("Operation failed:")
              +
              +
              +
              + +
              +
              +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
              +

              Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

              +

              parameters is dict of named parameters to bind. The values must be +JSON-serializable.

              +

              execution_profile: Selects an execution profile for the request.

              +

              execute_as the user that will be used on the server to execute the request.

              +
              + +
              +
              +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
              +

              Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

              +
              + +
              +
              +prepare(statement)
              +

              Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

              +
              >>> session = cluster.connect("mykeyspace")
              +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
              +>>> prepared = session.prepare(query)
              +>>> session.execute(prepared, (user.id, user.name, user.age))
              +
              +
              +

              Or you may bind values to the prepared statement ahead of time:

              +
              >>> prepared = session.prepare(query)
              +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
              +>>> session.execute(bound_stmt)
              +
              +
              +

              Of course, prepared statements may (and should) be reused:

              +
              >>> prepared = session.prepare(query)
              +>>> for user in users:
              +...     bound = prepared.bind((user.id, user.name, user.age))
              +...     session.execute(bound)
              +
              +
              +

              Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

              +
              >>> analyticskeyspace_prepared = session.prepare(
              +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
              +...     keyspace="analyticskeyspace")  # note the different keyspace
              +
              +
              +

              Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

              +

              custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

              +
              + +
              +
              +shutdown()
              +

              Close all connections. Session instances should not be used +for any purpose after being shutdown.

              +
              + +
              +
              +set_keyspace(keyspace)
              +

              Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

              +
              + +
              +
              +get_execution_profile(name)
              +

              Returns the execution profile associated with the provided name.

              +
              +
              Parameters:
              +

              name – The name (or key) of the execution profile.

              +
              +
              +
              + +
              +
              +execution_profile_clone_update(ep, **kwargs)
              +

              Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

              +

              This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

              +
              + +
              +
              +add_request_init_listener(fn, *args, **kwargs)
              +

              Adds a callback with arguments to be called when any request is created.

              +

              It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

              +

              response_future is the ResponseFuture for the request.

              +

              Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

              +

              See this example in the +source tree for an example.

              +
              + +
              +
              +remove_request_init_listener(fn, *args, **kwargs)
              +

              Removes a callback and arguments from the list.

              +

              See Session.add_request_init_listener().

              +
              + +
              + +
              +
              +class cassandra.cluster.ResponseFuture
              +

              An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

              +
              +
              There are two ways for results to be delivered:
              +
              +
              +
              +
              +query = None
              +
              + +
              +
              +result()
              +

              Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

              +

              Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

              +

              Example usage:

              +
              >>> future = session.execute_async("SELECT * FROM mycf")
              +>>> # do other stuff...
              +
              +>>> try:
              +...     rows = future.result()
              +...     for row in rows:
              +...         ... # process results
              +... except Exception:
              +...     log.exception("Operation failed:")
              +
              +
              +
              + +
              +
              +get_query_trace()
              +

              Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

              +

              Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

              +

              If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

              +

              query_cl is the consistency level used to poll the trace tables.

              +
              + +
              +
              +get_all_query_traces()
              +

              Fetches and returns the query traces for all query pages, if tracing was enabled.

              +

              See note in get_query_trace() regarding possible exceptions.

              +
              + +
              +
              +custom_payload
              +

              The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

              +

              Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

              +
              +
              Returns:
              +

              Custom Payloads.

              +
              +
              +
              + +
              +
              +is_schema_agreed = True
              +
              + +
              +
              +has_more_pages
              +

              Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

              +
              +

              New in version 2.0.0.

              +
              +
              + +
              +
              +warnings
              +

              Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

              +

              Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

              +

              Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

              +
              + +
              +
              +start_fetching_next_page()
              +

              If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

              +

              This should only be called after the first page has been returned.

              +
              +

              New in version 2.0.0.

              +
              +
              + +
              +
              +add_callback(fn, *args, **kwargs)
              +

              Attaches a callback function to be called when the final results arrive.

              +

              By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

              +

              If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

              +

              If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

              +

              Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

              +

              Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

              +

              Usage example:

              +
              >>> session = cluster.connect("mykeyspace")
              +
              +>>> def handle_results(rows, start_time, should_log=False):
              +...     if should_log:
              +...         log.info("Total time: %f", time.time() - start_time)
              +...     ...
              +
              +>>> future = session.execute_async("SELECT * FROM users")
              +>>> future.add_callback(handle_results, time.time(), should_log=True)
              +
              +
              +
              + +
              +
              +add_errback(fn, *args, **kwargs)
              +

              Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

              +
              + +
              +
              +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_args=None)
              +

              A convenient combination of add_callback() and +add_errback().

              +

              Example usage:

              +
              >>> session = cluster.connect()
              +>>> query = "SELECT * FROM mycf"
              +>>> future = session.execute_async(query)
              +
              +>>> def log_results(results, level='debug'):
              +...     for row in results:
              +...         log.log(level, "Result: %s", row)
              +
              +>>> def log_error(exc, query):
              +...     log.error("Query '%s' failed: %s", query, exc)
              +
              +>>> future.add_callbacks(
              +...     callback=log_results, callback_kwargs={'level': 'info'},
              +...     errback=log_error, errback_args=(query,))
              +
              +
              +
              + +
              + +
              +
              +class cassandra.cluster.ResultSet
              +

              An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

              +

              You can treat this as a normal iterator over rows:

              +
              >>> from cassandra.query import SimpleStatement
              +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
              +>>> for user_row in session.execute(statement):
              +...     process_user(user_row)
              +
              +
              +

              Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

              +
              +
              +all()
              +

              Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

              +

              This function is not recommended for queries that return a large number of elements.

              +
              + +
              +
              +property current_rows
              +

              The list of current page rows. May be empty if the result was empty, +or this is the last page.

              +
              + +
              +
              +fetch_next_page()
              +

              Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

              +
              + +
              +
              +get_all_query_traces(max_wait_sec_per=None)
              +

              Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

              +
              + +
              +
              +get_query_trace(max_wait_sec=None)
              +

              Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

              +
              + +
              +
              +property has_more_pages
              +

              True if the last response indicated more pages; False otherwise

              +
              + +
              +
              +one()
              +

              Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

              +
              + +
              +
              +property paging_state
              +

              Server paging state of the query. Can be None if the query was not paged.

              +

              The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

              +
              + +
              +
              +property was_applied
              +

              For LWT results, returns whether the transaction was applied.

              +

              Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

              +

              Only valid when one of the of the internal row factories is in use.

              +
              + +
              + +
              +
              +exception cassandra.cluster.QueryExhausted
              +

              Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

              +
              +

              New in version 2.0.0.

              +
              +
              + +
              +
              +exception cassandra.cluster.NoHostAvailable
              +

              Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

              +
              + +
              +
              +exception cassandra.cluster.UserTypeDoesNotExist
              +

              An attempt was made to use a user-defined type that does not exist.

              +
              +

              New in version 2.1.0.

              +
              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/concurrent.html b/3.25.4-scylla/api/cassandra/concurrent.html new file mode 100644 index 0000000000..90f0a4402e --- /dev/null +++ b/3.25.4-scylla/api/cassandra/concurrent.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.concurrent - Utilities for Concurrent Statement Execution

              +
              +
              +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
              +

              Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

              +

              The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

              +

              If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

              +

              results_generator controls how the results are returned.

              +
                +
              • If False, the results are returned only after all requests have completed.

              • +
              • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

              • +
              +

              execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

              +

              A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

              +

              Example usage:

              +
              select_statement = session.prepare("SELECT * FROM users WHERE id=?")
              +
              +statements_and_params = []
              +for user_id in user_ids:
              +    params = (user_id, )
              +    statements_and_params.append((select_statement, params))
              +
              +results = execute_concurrent(
              +    session, statements_and_params, raise_on_first_error=False)
              +
              +for (success, result) in results:
              +    if not success:
              +        handle_error(result)  # result will be an Exception
              +    else:
              +        process_user(result[0])  # result will be a list of rows
              +
              +
              +

              Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

              +
              + +
              +
              +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
              +

              Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

              +

              Example usage:

              +
              statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
              +parameters = [(x,) for x in range(1000)]
              +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
              +
              +
              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/connection.html b/3.25.4-scylla/api/cassandra/connection.html new file mode 100644 index 0000000000..efb091438d --- /dev/null +++ b/3.25.4-scylla/api/cassandra/connection.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.connection - Low Level Connection Info

              +
              +
              +exception cassandra.connection.ConnectionException
              +

              An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

              +
              + +
              +
              +exception cassandra.connection.ConnectionShutdown
              +

              Raised when a connection has been marked as defunct or has been closed.

              +
              + +
              +
              +exception cassandra.connection.ConnectionBusy
              +

              An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

              +
              + +
              +
              +exception cassandra.connection.ProtocolError
              +

              Communication did not match the protocol that this driver expects.

              +
              + +
              +
              +class cassandra.connection.EndPoint
              +

              Represents the information to connect to a cassandra node.

              +
              +
              +property address
              +

              The IP address of the node. This is the RPC address the driver uses when connecting to the node

              +
              + +
              +
              +property port
              +

              The port of the node.

              +
              + +
              +
              +resolve()
              +

              Resolve the endpoint to an address/port. This is called +only on socket connection.

              +
              + +
              +
              +property socket_family
              +

              The socket family of the endpoint.

              +
              + +
              +
              +property ssl_options
              +

              SSL options specific to this endpoint.

              +
              + +
              + +
              +
              +class cassandra.connection.EndPointFactory
              +
              +
              +configure(cluster)
              +

              This is called by the cluster during its initialization.

              +
              + +
              +
              +create(row)
              +

              Create an EndPoint from a system.peers row.

              +
              + +
              + +
              +
              +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
              +

              SNI Proxy EndPoint implementation.

              +
              + +
              +
              +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
              +
              + +
              +
              +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
              +

              Unix Socket EndPoint implementation.

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cqlengine/columns.html b/3.25.4-scylla/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..7485092b35 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cqlengine/columns.html @@ -0,0 +1,984 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cqlengine.columns - Column types for object mapping models

              +
              +

              Columns

              +

              Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

              +

              Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

              +

              Each column on your model definitions needs to be an instance of a Column class.

              +
              +
              +class cassandra.cqlengine.columns.Column(**kwargs)
              +
              +
              +primary_key = False
              +

              bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

              +
              + +
              +
              +partition_key = False
              +

              indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

              +
              + +
              +
              +index = False
              +

              bool flag, indicates an index should be created for this column

              +
              + +
              +
              +custom_index = False
              +

              bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

              +
              + +
              +
              +db_field = None
              +

              the fieldname this field will map to in the database

              +
              + +
              +
              +default = None
              +

              the default value, can be a value or a callable (no args)

              +
              + +
              +
              +required = False
              +

              boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

              +
              + +
              +
              +clustering_order = None
              +

              only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

              +
              + +
              +
              +discriminator_column = False
              +

              boolean, if set to True, this column will be used for discriminating records +of inherited models.

              +

              Should only be set on a column of an abstract model being used for inheritance.

              +

              There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

              +
              + +
              +
              +static = False
              +

              boolean, if set to True, this is a static column, with a single value per partition

              +
              + +
              + +
              +
              +

              Column Types

              +

              Columns of all types are initialized by passing Column attributes to the constructor by keyword.

              +
              +
              +class cassandra.cqlengine.columns.Ascii(**kwargs)
              +

              Stores a US-ASCII character string

              +
              +
              Parameters:
              +
                +
              • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

              • +
              • max_length (int) – Sets the maximum length of this string, for validation purposes.

              • +
              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.columns.BigInt(**kwargs)
              +

              Stores a 64-bit signed integer value

              +
              + +
              +
              +class cassandra.cqlengine.columns.Blob(**kwargs)
              +

              Stores a raw binary value

              +
              + +
              +
              +cassandra.cqlengine.columns.Bytes
              +

              alias of Blob

              +
              + +
              +
              +class cassandra.cqlengine.columns.Boolean(**kwargs)
              +

              Stores a boolean True or False value

              +
              + +
              +
              +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
              +

              Stores a counter that can be incremented and decremented

              +
              + +
              +
              +class cassandra.cqlengine.columns.Date(**kwargs)
              +

              Stores a simple date, with no time-of-day

              +
              +

              Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

              +
              +

              requires C* 2.2+ and protocol v4+

              +
              + +
              +
              +class cassandra.cqlengine.columns.DateTime(**kwargs)
              +

              Stores a datetime value

              +
              +
              +truncate_microseconds = False
              +

              Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

              +
              DateTime.truncate_microseconds = True
              +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
              +
              +
              +

              Defaults to False to preserve legacy behavior. May change in the future.

              +
              + +
              + +
              +
              +class cassandra.cqlengine.columns.Decimal(**kwargs)
              +

              Stores a variable precision decimal value

              +
              + +
              +
              +class cassandra.cqlengine.columns.Double(**kwargs)
              +

              Stores a double-precision floating-point value

              +
              + +
              +
              +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
              +

              Stores a single-precision floating-point value

              +
              + +
              +
              +class cassandra.cqlengine.columns.Integer(**kwargs)
              +

              Stores a 32-bit signed integer value

              +
              + +
              +
              +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
              +

              Stores a list of ordered values

              +

              http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

              +
              +
              Parameters:
              +

              value_type – a column class indicating the types of the value

              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
              +

              Stores a key -> value map (dictionary)

              +

              https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

              +
              +
              Parameters:
              +
                +
              • key_type – a column class indicating the types of the key

              • +
              • value_type – a column class indicating the types of the value

              • +
              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
              +

              Stores a set of unordered, unique values

              +

              http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

              +
              +
              Parameters:
              +
                +
              • value_type – a column class indicating the types of the value

              • +
              • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

              • +
              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.columns.SmallInt(**kwargs)
              +

              Stores a 16-bit signed integer value

              +
              +

              New in version 2.6.0.

              +
              +

              requires C* 2.2+ and protocol v4+

              +
              + +
              +
              +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
              +

              Stores a UTF-8 encoded string

              +
              +
              Parameters:
              +
                +
              • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

              • +
              • max_length (int) – Sets the maximum length of this string, for validation purposes.

              • +
              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.columns.Time(**kwargs)
              +

              Stores a timezone-naive time-of-day, with nanosecond precision

              +
              +

              New in version 2.6.0.

              +
              +

              requires C* 2.2+ and protocol v4+

              +
              + +
              +
              +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
              +

              UUID containing timestamp

              +
              + +
              +
              +class cassandra.cqlengine.columns.TinyInt(**kwargs)
              +

              Stores an 8-bit signed integer value

              +
              +

              New in version 2.6.0.

              +
              +

              requires C* 2.2+ and protocol v4+

              +
              + +
              +
              +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
              +

              User Defined Type column

              +

              http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

              +

              These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

              +

              Please see User Defined Types for examples and discussion.

              +
              +
              Parameters:
              +

              user_type (type) – specifies the UserType model of the column

              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.columns.UUID(**kwargs)
              +

              Stores a type 1 or 4 UUID

              +
              + +
              +
              +class cassandra.cqlengine.columns.VarInt(**kwargs)
              +

              Stores an arbitrary-precision integer

              +
              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cqlengine/connection.html b/3.25.4-scylla/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..763f25145b --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cqlengine/connection.html @@ -0,0 +1,718 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cqlengine.connection - Connection management for cqlengine

              +
              +
              +cassandra.cqlengine.connection.default()
              +

              Configures the default connection to localhost, using the driver defaults +(except for row_factory)

              +
              + +
              +
              +cassandra.cqlengine.connection.set_session(s)
              +

              Configures the default connection with a preexisting cassandra.cluster.Session

              +

              Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

              +
              + +
              +
              +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
              +

              Setup a the driver connection used by the mapper

              +
              +
              Parameters:
              +
                +
              • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

              • +
              • default_keyspace (str) – The default keyspace to use

              • +
              • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

              • +
              • lazy_connect (bool) – True if should not connect until first use

              • +
              • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

              • +
              • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

              • +
              +
              +
              +
              + +
              +
              +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
              +

              Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

              +
              +
              Parameters:
              +
                +
              • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

              • +
              • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

              • +
              • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

              • +
              • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

              • +
              • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

              • +
              • default (bool) – If True, set the new connection as the cqlengine +default

              • +
              • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

              • +
              +
              +
              +
              + +
              +
              +cassandra.cqlengine.connection.unregister_connection(name)
              +
              + +
              +
              +cassandra.cqlengine.connection.set_default_connection(name)
              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cqlengine/management.html b/3.25.4-scylla/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..c576b1eeff --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cqlengine/management.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cqlengine.management - Schema management for cqlengine

              +

              A collection of functions for managing keyspace and table schema.

              +
              +
              +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
              +

              Creates a keyspace with SimpleStrategy for replica placement

              +

              If the keyspace already exists, it will not be modified.

              +

              This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

              +

              There are plans to guard schema-modifying functions with an environment-driven conditional.

              +
              +
              Parameters:
              +
                +
              • name (str) – name of keyspace to create

              • +
              • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

              • +
              • durable_writes (bool) – Write log is bypassed if set to False

              • +
              • connections (list) – List of connection names

              • +
              +
              +
              +
              + +
              +
              +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
              +

              Creates a keyspace with NetworkTopologyStrategy for replica placement

              +

              If the keyspace already exists, it will not be modified.

              +

              This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

              +

              There are plans to guard schema-modifying functions with an environment-driven conditional.

              +
              +
              Parameters:
              +
                +
              • name (str) – name of keyspace to create

              • +
              • dc_replication_map (dict) – map of dc_names: replication_factor

              • +
              • durable_writes (bool) – Write log is bypassed if set to False

              • +
              • connections (list) – List of connection names

              • +
              +
              +
              +
              + +
              +
              +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
              +

              Drops a keyspace, if it exists.

              +

              There are plans to guard schema-modifying functions with an environment-driven conditional.

              +

              This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

              +
              +
              Parameters:
              +
                +
              • name (str) – name of keyspace to drop

              • +
              • connections (list) – List of connection names

              • +
              +
              +
              +
              + +
              +
              +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
              +

              Inspects the model and creates / updates the corresponding table and columns.

              +

              If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

              +

              If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

              +

              Any User Defined Types used in the table are implicitly synchronized.

              +

              This function can only add fields that are not part of the primary key.

              +

              Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

              +

              This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

              +

              There are plans to guard schema-modifying functions with an environment-driven conditional.

              +
              + +
              +
              +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
              +

              Inspects the type_model and creates / updates the corresponding type.

              +

              Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

              +

              This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

              +

              There are plans to guard schema-modifying functions with an environment-driven conditional.

              +
              + +
              +
              +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
              +

              Drops the table indicated by the model, if it exists.

              +

              If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

              +

              If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

              +

              This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

              +

              There are plans to guard schema-modifying functions with an environment-driven conditional.

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cqlengine/models.html b/3.25.4-scylla/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..c6277c4c92 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cqlengine/models.html @@ -0,0 +1,964 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cqlengine.models - Table models for object mapping

              +
              +

              Model

              +
              +
              +class cassandra.cqlengine.models.Model(\*\*kwargs)
              +

              The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

              +
              class Person(Model):
              +    id = columns.UUID(primary_key=True)
              +    first_name  = columns.Text()
              +    last_name = columns.Text()
              +
              +person = Person(first_name='Blake', last_name='Eggleston')
              +person.first_name  #returns 'Blake'
              +person.last_name  #returns 'Eggleston'
              +
              +
              +

              Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

              +
              +
              +__abstract__ = False
              +

              Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

              +
              + +
              +
              +__table_name__ = None
              +

              Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

              +
              + +
              +
              +__table_name_case_sensitive__ = False
              +

              Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

              +
              + +
              +
              +__keyspace__ = None
              +

              Sets the name of the keyspace used by this model.

              +
              + +
              +
              +__connection__ = None
              +

              Sets the name of the default connection used by this model.

              +
              + +
              +
              +__default_ttl__ = None
              +

              Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

              +
              + +
              +
              +__discriminator_value__ = None
              +

              Optional Specifies a value for the discriminator column when using model inheritance.

              +

              See Model Inheritance for usage examples.

              +
              + +

              Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

              +

              When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

              +

              Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

              +

              See the list of supported table properties for more information.

              +
              +
              +__options__
              +

              For example:

              +
              class User(Model):
              +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
              +                                  'sstable_size_in_mb': '64',
              +                                  'tombstone_threshold': '.2'},
              +                   'comment': 'User data stored here'}
              +
              +    user_id = columns.UUID(primary_key=True)
              +    name = columns.Text()
              +
              +
              +

              or :

              +
              class TimeData(Model):
              +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
              +                                  'bucket_low': '.3',
              +                                  'bucket_high': '2',
              +                                  'min_threshold': '2',
              +                                  'max_threshold': '64',
              +                                  'tombstone_compaction_interval': '86400'},
              +                   'gc_grace_seconds': '0'}
              +
              +
              +
              + +
              +
              +__compute_routing_key__ = True
              +

              Optional Setting False disables computing the routing key for TokenAwareRouting

              +
              + +

              The base methods allow creating, storing, and querying modeled objects.

              +
              +
              +classmethod create(**kwargs)
              +

              Create an instance of this model in the database.

              +

              Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

              +

              Returns the instance.

              +
              + +
              +
              +if_not_exists()
              +

              Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

              +

              If the insertion isn’t applied, a LWTException is raised.

              +
              try:
              +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
              +except LWTException as e:
              +    # handle failure case
              +    print e.existing  # dict containing LWT result fields
              +
              +
              +

              This method is supported on Cassandra 2.0 or later.

              +
              + +
              +
              +if_exists()
              +

              Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

              +

              If the update or delete isn’t applied, a LWTException is raised.

              +
              try:
              +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
              +except LWTException as e:
              +    # handle failure case
              +    pass
              +
              +
              +

              This method is supported on Cassandra 2.0 or later.

              +
              + +
              +
              +save()
              +

              Saves an object to the database.

              +
              #create a person instance
              +person = Person(first_name='Kimberly', last_name='Eggleston')
              +#saves it to Cassandra
              +person.save()
              +
              +
              +
              + +
              +
              +update(**values)
              +

              Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

              +

              It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

              +
              + +
              +
              +iff(**values)
              +

              Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

              +

              If the insertion isn’t applied, a LWTException is raised.

              +
              t = TestTransactionModel(text='some text', count=5)
              +try:
              +     t.iff(count=5).update('other text')
              +except LWTException as e:
              +    # handle failure case
              +    print e.existing # existing object
              +
              +
              +
              + +
              +
              +classmethod get(*args, **kwargs)
              +

              Returns a single object based on the passed filter constraints.

              +

              This is a pass-through to the model objects().:method:~cqlengine.queries.get.

              +
              + +
              +
              +classmethod filter(*args, **kwargs)
              +

              Returns a queryset based on filter parameters.

              +

              This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

              +
              + +
              +
              +classmethod all()
              +

              Returns a queryset representing all stored objects

              +

              This is a pass-through to the model objects().all()

              +
              + +
              +
              +delete()
              +

              Deletes the object from the database

              +
              + +
              +
              +batch(batch_object)
              +

              Sets the batch object to run instance updates and inserts queries with.

              +

              See Batch Queries for usage examples

              +
              + +
              +
              +timeout(timeout)
              +

              Sets a timeout for use in save(), update(), and delete() +operations

              +
              + +
              +
              +timestamp(timedelta_or_datetime)
              +

              Sets the timestamp for the query

              +
              + +
              +
              +ttl(ttl_in_sec)
              +

              Sets the ttl values to run instance updates and inserts queries with.

              +
              + +
              +
              +using(connection=None)
              +

              Change the context on the fly of the model instance (keyspace, connection)

              +
              + +
              +
              +classmethod column_family_name(include_keyspace=True)
              +

              Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

              +
              + +

              Models also support dict-like access:

              +
              +
              +len(m)
              +

              Returns the number of columns defined in the model

              +
              + +
              +
              +m[col_name]()
              +

              Returns the value of column col_name

              +
              + +
              +
              +m[col_name] = value
              +

              Set m[col_name] to value

              +
              + +
              +
              +keys()
              +

              Returns a list of column IDs.

              +
              + +
              +
              +values()
              +

              Returns list of column values.

              +
              + +
              +
              +items()
              +

              Returns a list of column ID/value tuples.

              +
              + +
              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cqlengine/query.html b/3.25.4-scylla/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..e5dd96b260 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cqlengine/query.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cqlengine.query - Query and filter model objects

              +
              +

              QuerySet

              +

              QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

              +
              +
              +class cassandra.cqlengine.query.ModelQuerySet(model)
              +
              +
              +all()
              +

              Returns a queryset matching all rows

              +
              for user in User.objects().all():
              +    print(user)
              +
              +
              +
              + +
              +
              +batch(batch_obj)
              +

              Set a batch object to run the query on.

              +

              Note: running a select query with a batch object will raise an exception

              +
              + +
              +
              +consistency(consistency)
              +

              Sets the consistency level for the operation. See ConsistencyLevel.

              +
              for user in User.objects(id=3).consistency(CL.ONE):
              +    print(user)
              +
              +
              +
              + +
              +
              +count()
              +

              Returns the number of rows matched by this query.

              +

              Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

              +
              + +
              +
              +len(queryset)
              +

              Returns the number of rows matched by this query. This function uses count() internally.

              +

              Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

              +
              + +
              +
              +distinct(distinct_fields=None)
              +

              Returns the DISTINCT rows matched by this query.

              +

              distinct_fields default to the partition key fields if not specified.

              +

              Note: distinct_fields must be a partition key or a static column

              +
              class Automobile(Model):
              +    manufacturer = columns.Text(partition_key=True)
              +    year = columns.Integer(primary_key=True)
              +    model = columns.Text(primary_key=True)
              +    price = columns.Decimal()
              +
              +sync_table(Automobile)
              +
              +# create rows
              +
              +Automobile.objects.distinct()
              +
              +# or
              +
              +Automobile.objects.distinct(['manufacturer'])
              +
              +
              +
              + +
              +
              +filter(*args, **kwargs)
              +

              Adds WHERE arguments to the queryset, returning a new queryset

              +

              See Retrieving objects with filters

              +

              Returns a QuerySet filtered on the keyword arguments

              +
              + +
              +
              +get(*args, **kwargs)
              +

              Returns a single instance matching this query, optionally with additional filter kwargs.

              +

              See Retrieving objects with filters

              +

              Returns a single object matching the QuerySet.

              +
              user = User.get(id=1)
              +
              +
              +

              If no objects are matched, a DoesNotExist exception is raised.

              +

              If more than one object is found, a MultipleObjectsReturned exception is raised.

              +
              + +
              +
              +limit(v)
              +

              Limits the number of results returned by Cassandra. Use 0 or None to disable.

              +

              Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

              +
              # Fetch 100 users
              +for user in User.objects().limit(100):
              +    print(user)
              +
              +# Fetch all users
              +for user in User.objects().limit(None):
              +    print(user)
              +
              +
              +
              + +
              +
              +fetch_size(v)
              +

              Sets the number of rows that are fetched at a time.

              +

              Note that driver’s default fetch size is 5000.

              +
              for user in User.objects().fetch_size(500):
              +    print(user)
              +
              +
              +
              + +
              +
              +if_not_exists()
              +

              Check the existence of an object before insertion.

              +

              If the insertion isn’t applied, a LWTException is raised.

              +
              + +
              +
              +if_exists()
              +

              Check the existence of an object before an update or delete.

              +

              If the update or delete isn’t applied, a LWTException is raised.

              +
              + +
              +
              +order_by(*colnames)
              +

              Sets the column(s) to be used for ordering

              +

              Default order is ascending, prepend a ‘-’ to any column name for descending

              +

              Note: column names must be a clustering key

              +
              from uuid import uuid1,uuid4
              +
              +class Comment(Model):
              +    photo_id = UUID(primary_key=True)
              +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
              +    comment = Text()
              +
              +sync_table(Comment)
              +
              +u = uuid4()
              +for x in range(5):
              +    Comment.create(photo_id=u, comment="test %d" % x)
              +
              +print("Normal")
              +for comment in Comment.objects(photo_id=u):
              +    print comment.comment_id
              +
              +print("Reversed")
              +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
              +    print comment.comment_id
              +
              +
              +
              + +
              +
              +allow_filtering()
              +

              Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

              +
              + +
              +
              +only(fields)
              +

              Load only these fields for the returned query

              +
              + +
              +
              +defer(fields)
              +

              Don’t load these fields for the returned query

              +
              + +
              +
              +timestamp(timestamp)
              +

              Allows for custom timestamps to be saved with the record.

              +
              + +
              +
              +ttl(ttl)
              +

              Sets the ttl (in seconds) for modified data.

              +

              Note that running a select query with a ttl value will raise an exception

              +
              + +
              +
              +using(keyspace=None, connection=None)
              +

              Change the context on-the-fly of the Model class (keyspace, connection)

              +
              + +
              +
              +update(**values)
              +

              Performs an update on the row selected by the queryset. Include values to update in the +update like so:

              +
              Model.objects(key=n).update(value='x')
              +
              +
              +

              Passing in updates for columns which are not part of the model will raise a ValidationError.

              +

              Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

              +

              For example:

              +
              class User(Model):
              +    id = Integer(primary_key=True)
              +    name = Text()
              +
              +setup(["localhost"], "test")
              +sync_table(User)
              +
              +u = User.create(id=1, name="jon")
              +
              +User.objects(id=1).update(name="Steve")
              +
              +# sets name to null
              +User.objects(id=1).update(name=None)
              +
              +
              +

              Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

              +

              Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

              +

              Given the model below, here are the operations that can be performed on the different container columns:

              +
              class Row(Model):
              +    row_id      = columns.Integer(primary_key=True)
              +    set_column  = columns.Set(Integer)
              +    list_column = columns.List(Integer)
              +    map_column  = columns.Map(Integer, Integer)
              +
              +
              +

              Set

              +
                +
              • add: adds the elements of the given set to the column

              • +
              • remove: removes the elements of the given set to the column

              • +
              +
              # add elements to a set
              +Row.objects(row_id=5).update(set_column__add={6})
              +
              +# remove elements to a set
              +Row.objects(row_id=5).update(set_column__remove={4})
              +
              +
              +

              List

              +
                +
              • append: appends the elements of the given list to the end of the column

              • +
              • prepend: prepends the elements of the given list to the beginning of the column

              • +
              +
              # append items to a list
              +Row.objects(row_id=5).update(list_column__append=[6, 7])
              +
              +# prepend items to a list
              +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
              +
              +
              +

              Map

              +
                +
              • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

              • +
              +
              # add items to a map
              +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
              +
              +# remove items from a map
              +Row.objects(row_id=5).update(map_column__remove={1, 2})
              +
              +
              +
              + +
              + +
              +
              +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
              +

              Handles the batching of queries

              +

              http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

              +

              See Batch Queries for more details.

              +
              +
              Parameters:
              +
                +
              • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

              • +
              • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

              • +
              • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

              • +
              • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

              • +
              • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

              • +
              • connection (str) – Connection name to use for the batch execution

              • +
              +
              +
              +
              +
              +add_query(query)
              +
              + +
              +
              +execute()
              +
              + +
              +
              +add_callback(fn, *args, **kwargs)
              +

              Add a function and arguments to be passed to it to be executed after the batch executes.

              +

              A batch can support multiple callbacks.

              +

              Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

              +
              +
              Parameters:
              +
                +
              • fn (callable) – Callable object

              • +
              • *args – Positional arguments to be passed to the callback at the time of execution

              • +
              • **kwargs – Named arguments to be passed to the callback at the time of execution

              • +
              +
              +
              +
              + +
              + +
              +
              +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
              +

              A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

              +
              +
              Parameters:
              +
                +
              • *args – One or more models. A model should be a class type, not an instance.

              • +
              • **kwargs – (optional) Context parameters: can be keyspace or connection

              • +
              +
              +
              +

              For example:

              +
              with ContextQuery(Automobile, keyspace='test2') as A:
              +    A.objects.create(manufacturer='honda', year=2008, model='civic')
              +    print len(A.objects.all())  # 1 result
              +
              +with ContextQuery(Automobile, keyspace='test4') as A:
              +    print len(A.objects.all())  # 0 result
              +
              +# Multiple models
              +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
              +    print len(A.objects.all())
              +    print len(A2.objects.all())
              +
              +
              +
              + +
              +
              +class cassandra.cqlengine.query.DoesNotExist
              +
              + +
              +
              +class cassandra.cqlengine.query.MultipleObjectsReturned
              +
              + +
              +
              +class cassandra.cqlengine.query.LWTException(existing)
              +

              Lightweight conditional exception.

              +

              This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

              +
              +
              Parameters:
              +

              existing – The current state of the data which prevented the write.

              +
              +
              +
              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/cqlengine/usertype.html b/3.25.4-scylla/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..6739f5a489 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.cqlengine.usertype - Model classes for User Defined Types

              +
              +

              UserType

              +
              +
              +class cassandra.cqlengine.usertype.UserType(**values)
              +

              This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

              +
              # connect with default keyspace ...
              +
              +from cassandra.cqlengine.columns import Text, Integer
              +from cassandra.cqlengine.usertype import UserType
              +
              +class address(UserType):
              +    street = Text()
              +    zipcode = Integer()
              +
              +from cassandra.cqlengine import management
              +management.sync_type(address)
              +
              +
              +

              Please see User Defined Types for a complete example and discussion.

              +
              +
              +__type_name__ = None
              +

              Optional. Sets the name of the CQL type for this type.

              +

              If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

              +
              + +
              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/datastax/graph/fluent/index.html b/3.25.4-scylla/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..119cf43333 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,764 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.datastax.graph.fluent

              +
              +
              +class cassandra.datastax.graph.fluent.DseGraph
              +

              Dse Graph utility class for GraphTraversal construction and execution.

              +
              +
              +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
              +

              Graph query language, Default is ‘bytecode-json’ (GraphSON).

              +
              + +
              +
              +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
              +

              Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

              +
              +
              Parameters:
              +
                +
              • graph_name – The graph name

              • +
              • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

              • +
              +
              +
              +
              + +
              +
              +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
              +

              From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

              +
              +
              Parameters:
              +
                +
              • traversal – The GraphTraversal object

              • +
              • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

              • +
              • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

              • +
              +
              +
              +
              + +
              +
              +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
              +

              Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

              +
              +
              Parameters:
              +
                +
              • session – (Optional) A DSE session

              • +
              • graph_name – (Optional) DSE Graph name

              • +
              • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

              • +
              • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

              • +
              +
              +
              +
              from cassandra.cluster import Cluster
              +from cassandra.datastax.graph.fluent import DseGraph
              +
              +c = Cluster()
              +session = c.connect()
              +
              +g = DseGraph.traversal_source(session, 'my_graph')
              +print g.V().valueMap().toList()
              +
              +
              +
              + +
              +
              +static batch(session=None, execution_profile=None)
              +

              Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
              +

              A Tinkerpop RemoteConnection to execute traversal queries on DSE.

              +
              +
              Parameters:
              +
                +
              • session – A DSE session

              • +
              • graph_name – (Optional) DSE Graph name.

              • +
              • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

              • +
              +
              +
              +
              + +
              +
              +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
              +

              Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

              +
              +
              Currently supported:
                +
              • bulk results

              • +
              +
              +
              +
              + +
              +
              +cassandra.datastax.graph.fluent.graph_traversal_row_factory
              +

              alias of _GremlinGraphSON2RowFactory

              +
              + +
              +
              +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
              +

              alias of _DseGraphSON2RowFactory

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/datastax/graph/fluent/predicates.html b/3.25.4-scylla/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..10e0f6ddd6 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,770 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.datastax.graph.fluent.predicates

              +
              +
              +class cassandra.datastax.graph.fluent.predicates.Search
              +
              +
              +static token(value)
              +

              Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

              +
              + +
              +
              +static token_prefix(value)
              +

              Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

              +
              + +
              +
              +static token_regex(value)
              +

              Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

              +
              + +
              +
              +static prefix(value)
              +

              Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

              +
              + +
              +
              +static regex(value)
              +

              Search for this regular expression inside the text property targeted. +:param value: the value to look for.

              +
              + +
              +
              +static fuzzy(value, distance)
              +

              Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

              +
              + +
              +
              +static token_fuzzy(value, distance)
              +

              Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

              +
              + +
              +
              +static phrase(value, proximity)
              +

              Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.fluent.predicates.CqlCollection
              +
              +
              +static contains(value)
              +

              Search for a value inside a cql list/set column. +:param value: the value to look for.

              +
              + +
              +
              +static contains_value(value)
              +

              Search for a map value. +:param value: the value to look for.

              +
              + +
              +
              +static contains_key(value)
              +

              Search for a map key. +:param value: the value to look for.

              +
              + +
              +
              +static entry_eq(value)
              +

              Search for a map entry. +:param value: the value to look for.

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.fluent.predicates.Geo
              +
              +
              +static inside(value, units=1)
              +

              Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/datastax/graph/fluent/query.html b/3.25.4-scylla/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..1f39a72312 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.datastax.graph.fluent.query

              +
              +
              +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
              +

              A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

              +

              If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

              +
              +
              Parameters:
              +
                +
              • session – (Optional) A DSE session

              • +
              • execution_profile – (Optional) The execution profile to use for the batch execution

              • +
              +
              +
              +
              +
              +add(traversal)
              +

              Add a traversal to the batch.

              +
              +
              Parameters:
              +

              traversal – A gremlin GraphTraversal

              +
              +
              +
              + +
              +
              +add_all(traversals)
              +

              Adds a sequence of traversals to the batch.

              +
              +
              Parameters:
              +

              traversals – A sequence of gremlin GraphTraversal

              +
              +
              +
              + +
              +
              +execute()
              +

              Execute the traversal batch if bounded to a DSE Session.

              +
              + +
              +
              +as_graph_statement(graph_protocol=b'graphson-2.0')
              +

              Return the traversal batch as GraphStatement.

              +
              +
              Parameters:
              +

              graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

              +
              +
              +
              + +
              +
              +clear()
              +

              Clear a traversal batch for reuse.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/datastax/graph/index.html b/3.25.4-scylla/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..4bc18a6870 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1065 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.datastax.graph - Graph Statements, Options, and Row Factories

              +
              +
              +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
              +

              returns the JSON string value of graph results

              +
              + +
              +
              +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
              +

              Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

              +
              + +
              +
              +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
              +

              Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

              +
              + +
              +
              +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
              +

              Row factory to deserialize GraphSON2 results.

              +
              + +
              +
              +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
              +

              Row factory to deserialize GraphSON3 results.

              +
              + +
              +
              +cassandra.datastax.graph.to_int(value)
              +

              Wraps a value to be explicitly serialized as a graphson Int.

              +
              + +
              +
              +cassandra.datastax.graph.to_bigint(value)
              +

              Wraps a value to be explicitly serialized as a graphson Bigint.

              +
              + +
              +
              +cassandra.datastax.graph.to_smallint(value)
              +

              Wraps a value to be explicitly serialized as a graphson Smallint.

              +
              + +
              +
              +cassandra.datastax.graph.to_float(value)
              +

              Wraps a value to be explicitly serialized as a graphson Float.

              +
              + +
              +
              +cassandra.datastax.graph.to_double(value)
              +

              Wraps a value to be explicitly serialized as a graphson Double.

              +
              + +
              +
              +class cassandra.datastax.graph.GraphProtocol
              +
              +
              +GRAPHSON_1_0 = b'graphson-1.0'
              +

              GraphSON1

              +
              + +
              +
              +GRAPHSON_2_0 = b'graphson-2.0'
              +

              GraphSON2

              +
              + +
              +
              +GRAPHSON_3_0 = b'graphson-3.0'
              +

              GraphSON3

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.GraphOptions(**kwargs)
              +

              Options for DSE Graph Query handler.

              +
              +
              +graph_name
              +

              name of the targeted graph.

              +
              + +
              +
              +graph_source
              +

              choose the graph traversal source, configured on the server side.

              +
              + +
              +
              +graph_language
              +

              the language used in the queries (default “gremlin-groovy”)

              +
              + +
              +
              +graph_read_consistency_level
              +

              read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

              +
              + +
              +
              +graph_write_consistency_level
              +

              write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

              +
              + +
              +
              +is_default_source
              +
              + +
              +
              +is_analytics_source
              +

              True if graph_source is set to the server-defined analytics traversal source (‘a’)

              +
              + +
              +
              +is_graph_source
              +

              True if graph_source is set to the server-defined graph traversal source (‘g’)

              +
              + +
              +
              +set_source_default()
              +

              Sets graph_source to the server-defined default traversal source (‘default’)

              +
              + +
              +
              +set_source_analytics()
              +

              Sets graph_source to the server-defined analytic traversal source (‘a’)

              +
              + +
              +
              +set_source_graph()
              +

              Sets graph_source to the server-defined graph traversal source (‘g’)

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
              +

              Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

              +

              query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

              +

              See Statement attributes for a description of the other parameters.

              +
              + +
              +
              +class cassandra.datastax.graph.Result(value)
              +

              Represents deserialized graph results. +Property and item getters are provided for convenience.

              +
              +
              +value = None
              +

              Deserialized value from the result

              +
              + +
              +
              +as_vertex()
              +

              Return a Vertex parsed from this result

              +

              Raises TypeError if parsing fails (i.e. the result structure is not valid).

              +
              + +
              +
              +as_edge()
              +

              Return a Edge parsed from this result

              +

              Raises TypeError if parsing fails (i.e. the result structure is not valid).

              +
              + +
              +
              +as_path()
              +

              Return a Path parsed from this result

              +

              Raises TypeError if parsing fails (i.e. the result structure is not valid).

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.Vertex(id, label, type, properties)
              +

              Represents a Vertex element from a graph query.

              +

              Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

              +
              + +
              +
              +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
              +

              Vertex properties have a top-level value and an optional dict of properties.

              +
              +
              +label = None
              +

              label of the property

              +
              + +
              +
              +value = None
              +

              Value of the property

              +
              + +
              +
              +properties = None
              +

              dict of properties attached to the property

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
              +

              Represents an Edge element from a graph query.

              +

              Attributes match initializer parameters.

              +
              + +
              +
              +class cassandra.datastax.graph.Path(labels, objects)
              +

              Represents a graph path.

              +

              Labels list is taken verbatim from the results.

              +

              Objects are either Result or Vertex/Edge for recognized types

              +
              +
              +labels = None
              +

              List of labels in the path

              +
              + +
              +
              +objects = None
              +

              List of objects in the path

              +
              + +
              + +
              +
              +class cassandra.datastax.graph.T(name, val)
              +

              Represents a collection of tokens for more concise Traversal definitions.

              +
              +
              +id = T.id
              +
              + +
              +
              +key = T.key
              +
              + +
              +
              +label = T.label
              +
              + +
              +
              +value = T.value
              +
              + +
              + +
              +
              +class cassandra.datastax.graph.GraphSON1Serializer
              +

              Serialize python objects to graphson types.

              +
              + +
              +
              +class cassandra.datastax.graph.GraphSON1Deserializer
              +

              Deserialize graphson1 types to python objects.

              +
              +
              +classmethod deserialize_date(value)
              +
              + +
              +
              +classmethod deserialize_timestamp(value)
              +
              + +
              +
              +classmethod deserialize_time(value)
              +
              + +
              +
              +classmethod deserialize_duration(value)
              +
              + +
              +
              +classmethod deserialize_int(value)
              +
              + +
              +
              +classmethod deserialize_bigint(value)
              +
              + +
              +
              +classmethod deserialize_double(value)
              +
              + +
              +
              +classmethod deserialize_float(value)
              +
              + +
              +
              +classmethod deserialize_uuid(value)
              +
              + +
              +
              +classmethod deserialize_blob(value)
              +
              + +
              +
              +classmethod deserialize_decimal(value)
              +
              + +
              +
              +classmethod deserialize_point(value)
              +
              + +
              +
              +classmethod deserialize_linestring(value)
              +
              + +
              +
              +classmethod deserialize_polygon(value)
              +
              + +
              + +
              +
              +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
              +

              GraphSON2 Reader that parse json and deserialize to python objects.

              +
              +
              Parameters:
              +

              extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

              +
              +
              +
              +
              +read(json_data)
              +

              Read and deserialize json_data.

              +
              + +
              +
              +deserialize(obj)
              +

              Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/decoder.html b/3.25.4-scylla/api/cassandra/decoder.html new file mode 100644 index 0000000000..bc173d2cf4 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/decoder.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.decoder - Data Return Formats

              +
              +
              +cassandra.decoder.tuple_factory()
              +

              Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

              +
              + +
              +
              +cassandra.decoder.named_tuple_factory()
              +

              Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

              +
              + +
              +
              +cassandra.decoder.dict_factory()
              +

              Deprecated in 2.0.0. Use cassandra.query.dict_factory()

              +
              + +
              +
              +cassandra.decoder.ordered_dict_factory()
              +

              Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/encoder.html b/3.25.4-scylla/api/cassandra/encoder.html new file mode 100644 index 0000000000..45c4a1cfaf --- /dev/null +++ b/3.25.4-scylla/api/cassandra/encoder.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.encoder - Encoders for non-prepared Statements

              +
              +
              +class cassandra.encoder.Encoder
              +

              A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

              +
              +
              +mapping = None
              +

              A map of python types to encoder functions.

              +
              + +
              +
              +cql_encode_none()
              +

              Converts None to the string ‘NULL’.

              +
              + +
              +
              +cql_encode_object()
              +

              Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

              +
              + +
              +
              +cql_encode_all_types()
              +

              Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

              +
              + +
              +
              +cql_encode_sequence()
              +

              Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

              +
              + +
              +
              +cql_encode_str()
              +

              Escapes quotes in str objects.

              +
              + +
              +
              +cql_encode_unicode()
              +

              Converts unicode objects to UTF-8 encoded strings with quote escaping.

              +
              + +
              +
              +cql_encode_bytes()
              +

              Converts strings, buffers, and bytearrays into CQL blob literals.

              +
              + +
              +
              +cql_encode_datetime()
              +

              Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

              +
              + +
              +
              +cql_encode_date()
              +

              Converts a datetime.date object to a string with format +YYYY-MM-DD.

              +
              + +
              +
              +cql_encode_map_collection()
              +

              Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

              +
              + +
              +
              +cql_encode_list_collection()
              +

              Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

              +
              + +
              +
              +cql_encode_set_collection()
              +

              Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

              +
              + +
              +
              +cql_encode_tuple()
              +

              Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/graph.html b/3.25.4-scylla/api/cassandra/graph.html new file mode 100644 index 0000000000..636a903e15 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/graph.html @@ -0,0 +1,1098 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.graph - Graph Statements, Options, and Row Factories

              +
              +

              Note

              +

              This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

              +
              +
              +
              +cassandra.graph.single_object_row_factory(column_names, rows)
              +

              returns the JSON string value of graph results

              +
              + +
              +
              +cassandra.graph.graph_result_row_factory(column_names, rows)
              +

              Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

              +
              + +
              +
              +cassandra.graph.graph_object_row_factory(column_names, rows)
              +

              Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

              +
              + +
              +
              +cassandra.graph.graph_graphson2_row_factory(cluster)
              +

              Row factory to deserialize GraphSON2 results.

              +
              + +
              +
              +cassandra.graph.graph_graphson3_row_factory(cluster)
              +

              Row factory to deserialize GraphSON3 results.

              +
              + +
              +
              +cassandra.graph.to_int(value)
              +

              Wraps a value to be explicitly serialized as a graphson Int.

              +
              + +
              +
              +cassandra.graph.to_bigint(value)
              +

              Wraps a value to be explicitly serialized as a graphson Bigint.

              +
              + +
              +
              +cassandra.graph.to_smallint(value)
              +

              Wraps a value to be explicitly serialized as a graphson Smallint.

              +
              + +
              +
              +cassandra.graph.to_float(value)
              +

              Wraps a value to be explicitly serialized as a graphson Float.

              +
              + +
              +
              +cassandra.graph.to_double(value)
              +

              Wraps a value to be explicitly serialized as a graphson Double.

              +
              + +
              +
              +class cassandra.graph.GraphProtocol
              +
              +
              +GRAPHSON_1_0 = b'graphson-1.0'
              +

              GraphSON1

              +
              + +
              +
              +GRAPHSON_2_0 = b'graphson-2.0'
              +

              GraphSON2

              +
              + +
              +
              +GRAPHSON_3_0 = b'graphson-3.0'
              +

              GraphSON3

              +
              + +
              + +
              +
              +class cassandra.graph.GraphOptions(**kwargs)
              +

              Options for DSE Graph Query handler.

              +
              +
              +graph_name
              +

              name of the targeted graph.

              +
              + +
              +
              +graph_source
              +

              choose the graph traversal source, configured on the server side.

              +
              + +
              +
              +graph_language
              +

              the language used in the queries (default “gremlin-groovy”)

              +
              + +
              +
              +graph_read_consistency_level
              +

              read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

              +
              + +
              +
              +graph_write_consistency_level
              +

              write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

              +
              + +
              +
              +is_default_source
              +
              + +
              +
              +is_analytics_source
              +

              True if graph_source is set to the server-defined analytics traversal source (‘a’)

              +
              + +
              +
              +is_graph_source
              +

              True if graph_source is set to the server-defined graph traversal source (‘g’)

              +
              + +
              +
              +set_source_default()
              +

              Sets graph_source to the server-defined default traversal source (‘default’)

              +
              + +
              +
              +set_source_analytics()
              +

              Sets graph_source to the server-defined analytic traversal source (‘a’)

              +
              + +
              +
              +set_source_graph()
              +

              Sets graph_source to the server-defined graph traversal source (‘g’)

              +
              + +
              + +
              +
              +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
              +

              Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

              +

              query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

              +

              See Statement attributes for a description of the other parameters.

              +
              + +
              +
              +class cassandra.graph.Result(value)
              +

              Represents deserialized graph results. +Property and item getters are provided for convenience.

              +
              +
              +value = None
              +

              Deserialized value from the result

              +
              + +
              +
              +as_vertex()
              +

              Return a Vertex parsed from this result

              +

              Raises TypeError if parsing fails (i.e. the result structure is not valid).

              +
              + +
              +
              +as_edge()
              +

              Return a Edge parsed from this result

              +

              Raises TypeError if parsing fails (i.e. the result structure is not valid).

              +
              + +
              +
              +as_path()
              +

              Return a Path parsed from this result

              +

              Raises TypeError if parsing fails (i.e. the result structure is not valid).

              +
              + +
              + +
              +
              +class cassandra.graph.Vertex(id, label, type, properties)
              +

              Represents a Vertex element from a graph query.

              +

              Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

              +
              + +
              +
              +class cassandra.graph.VertexProperty(label, value, properties=None)
              +

              Vertex properties have a top-level value and an optional dict of properties.

              +
              +
              +label = None
              +

              label of the property

              +
              + +
              +
              +value = None
              +

              Value of the property

              +
              + +
              +
              +properties = None
              +

              dict of properties attached to the property

              +
              + +
              + +
              +
              +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
              +

              Represents an Edge element from a graph query.

              +

              Attributes match initializer parameters.

              +
              + +
              +
              +class cassandra.graph.Path(labels, objects)
              +

              Represents a graph path.

              +

              Labels list is taken verbatim from the results.

              +

              Objects are either Result or Vertex/Edge for recognized types

              +
              +
              +labels = None
              +

              List of labels in the path

              +
              + +
              +
              +objects = None
              +

              List of objects in the path

              +
              + +
              + +
              +
              +class cassandra.graph.GraphSON1Serializer
              +

              Serialize python objects to graphson types.

              +
              + +
              +
              +class cassandra.graph.GraphSON1Deserializer
              +

              Deserialize graphson1 types to python objects.

              +
              +
              +classmethod deserialize_date(value)
              +
              + +
              +
              +classmethod deserialize_timestamp(value)
              +
              + +
              +
              +classmethod deserialize_time(value)
              +
              + +
              +
              +classmethod deserialize_duration(value)
              +
              + +
              +
              +classmethod deserialize_int(value)
              +
              + +
              +
              +classmethod deserialize_bigint(value)
              +
              + +
              +
              +classmethod deserialize_double(value)
              +
              + +
              +
              +classmethod deserialize_float(value)
              +
              + +
              +
              +classmethod deserialize_uuid(value)
              +
              + +
              +
              +classmethod deserialize_blob(value)
              +
              + +
              +
              +classmethod deserialize_decimal(value)
              +
              + +
              +
              +classmethod deserialize_point(value)
              +
              + +
              +
              +classmethod deserialize_linestring(value)
              +
              + +
              +
              +classmethod deserialize_polygon(value)
              +
              + +
              + +
              +
              +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
              +

              GraphSON2 Reader that parse json and deserialize to python objects.

              +
              +
              Parameters:
              +

              extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

              +
              +
              +
              +
              +read(json_data)
              +

              Read and deserialize json_data.

              +
              + +
              +
              +deserialize(obj)
              +

              Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

              +
              + +
              + +
              +
              +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
              +

              GraphSON3 Reader that parse json and deserialize to python objects.

              +
              +
              Parameters:
              +
                +
              • context – A dict of the context, mostly used as context for udt deserialization.

              • +
              • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

              • +
              +
              +
              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/io/asyncioreactor.html b/3.25.4-scylla/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..bcce90848f --- /dev/null +++ b/3.25.4-scylla/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.io.asyncioreactor - asyncio Event Loop

              +
              +
              +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
              +

              An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

              +

              Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

              +
              +
              +classmethod initialize_reactor()
              +

              Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/io/asyncorereactor.html b/3.25.4-scylla/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..379bdd13d4 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.io.asyncorereactor - asyncore Event Loop

              +
              +
              +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
              +

              An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

              +
              +
              +classmethod initialize_reactor()
              +

              Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

              +
              + +
              +
              +classmethod handle_fork()
              +

              Called after a forking. This should cleanup any remaining reactor state +from the parent process.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/io/eventletreactor.html b/3.25.4-scylla/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..537f15b3f1 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/io/eventletreactor.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.io.eventletreactor - eventlet-compatible Connection

              +
              +
              +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
              +

              An implementation of Connection that utilizes eventlet.

              +

              This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

              +
              +
              +classmethod initialize_reactor()
              +

              Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

              +
              + +
              +
              +classmethod service_timeouts()
              +

              cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/io/geventreactor.html b/3.25.4-scylla/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..96c658f775 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/io/geventreactor.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.io.geventreactor - gevent-compatible Event Loop

              +
              +
              +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
              +

              An implementation of Connection that utilizes gevent.

              +

              This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

              +
              +
              +classmethod initialize_reactor()
              +

              Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/io/libevreactor.html b/3.25.4-scylla/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..b28b614d50 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/io/libevreactor.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.io.libevreactor - libev Event Loop

              +
              +
              +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
              +

              An implementation of Connection that uses libev for its event loop.

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/io/twistedreactor.html b/3.25.4-scylla/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..2bd8c5de71 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/io/twistedreactor.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.io.twistedreactor - Twisted Event Loop

              +
              +
              +class cassandra.io.twistedreactor.TwistedConnection
              +

              An implementation of Connection that uses +Twisted’s reactor as its event loop.

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/metadata.html b/3.25.4-scylla/api/cassandra/metadata.html new file mode 100644 index 0000000000..738f5a6aed --- /dev/null +++ b/3.25.4-scylla/api/cassandra/metadata.html @@ -0,0 +1,1104 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.metadata - Schema and Ring Topology

              +
              +
              +cassandra.metadata.cql_keywords
              +

              set() -> new empty set object +set(iterable) -> new set object

              +

              Build an unordered collection of unique elements.

              +
              + +
              +
              +cassandra.metadata.cql_keywords_unreserved
              +

              set() -> new empty set object +set(iterable) -> new set object

              +

              Build an unordered collection of unique elements.

              +
              + +
              +
              +cassandra.metadata.cql_keywords_reserved
              +

              set() -> new empty set object +set(iterable) -> new set object

              +

              Build an unordered collection of unique elements.

              +
              + +
              +
              +class cassandra.metadata.Metadata
              +

              Holds a representation of the cluster schema and topology.

              +
              +
              +add_or_return_host(host)
              +

              Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

              +
              + +
              +
              +all_hosts()
              +

              Returns a list of all known Host instances in the cluster.

              +
              + +
              +
              +export_schema_as_string()
              +

              Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

              +
              + +
              +
              +get_host(endpoint_or_address, port=None)
              +

              Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

              +
              + +
              +
              +get_host_by_host_id(host_id)
              +

              Same as get_host() but use host_id for lookup.

              +
              + +
              +
              +get_replicas(keyspace, key)
              +

              Returns a list of Host instances that are replicas for a given +partition key.

              +
              + +
              + +
              +

              Schemas

              +
              +
              +class cassandra.metadata.KeyspaceMetadata
              +

              A representation of the schema for a single keyspace.

              +
              +
              +as_cql_query()
              +

              Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

              +
              + +
              +
              +export_as_string()
              +

              Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

              +
              + +
              + +
              +
              +class cassandra.metadata.UserType
              +

              A user defined type, as created by CREATE TYPE statements.

              +

              User-defined types were introduced in Cassandra 2.1.

              +
              +

              New in version 2.1.0.

              +
              +
              +
              +as_cql_query(formatted=False)
              +

              Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

              +
              + +
              + +
              +
              +class cassandra.metadata.Function
              +

              A user defined function, as created by CREATE FUNCTION statements.

              +

              User-defined functions were introduced in Cassandra 2.2

              +
              +

              New in version 2.6.0.

              +
              +
              +
              +as_cql_query(formatted=False)
              +

              Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

              +
              + +
              + +
              +
              +class cassandra.metadata.Aggregate
              +

              A user defined aggregate function, as created by CREATE AGGREGATE statements.

              +

              Aggregate functions were introduced in Cassandra 2.2

              +
              +

              New in version 2.6.0.

              +
              +
              +
              +as_cql_query(formatted=False)
              +

              Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

              +
              + +
              + +
              +
              +class cassandra.metadata.TableMetadata
              +

              A representation of the schema for a single table.

              +
              +
              +as_cql_query(formatted=False)
              +

              Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

              +
              + +
              +
              +export_as_string()
              +

              Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

              +
              + +
              +
              +property is_cql_compatible
              +

              A boolean indicating if this table can be represented as CQL in export

              +
              + +
              +
              +property primary_key
              +

              A list of ColumnMetadata representing the components of +the primary key for this table.

              +
              + +
              + +
              +
              +class cassandra.metadata.TableMetadataV3
              +

              For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

              +
              +
              +property is_cql_compatible
              +

              A boolean indicating if this table can be represented as CQL in export

              +
              + +
              + +
              +
              +class cassandra.metadata.TableMetadataDSE68
              +
              +
              +as_cql_query(formatted=False)
              +

              Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

              +
              + +
              + +
              +
              +class cassandra.metadata.ColumnMetadata
              +

              A representation of a single column in a table.

              +
              + +
              +
              +class cassandra.metadata.IndexMetadata
              +

              A representation of a secondary index on a column.

              +
              +
              +as_cql_query()
              +

              Returns a CQL query that can be used to recreate this index.

              +
              + +
              +
              +export_as_string()
              +

              Returns a CQL query string that can be used to recreate this index.

              +
              + +
              + +
              +
              +class cassandra.metadata.MaterializedViewMetadata
              +

              A representation of a materialized view on a table

              +
              +
              +as_cql_query(formatted=False)
              +

              Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

              +
              + +
              + +
              +
              +class cassandra.metadata.VertexMetadata
              +

              A representation of a vertex on a table

              +
              + +
              +
              +class cassandra.metadata.EdgeMetadata
              +

              A representation of an edge on a table

              +
              + +
              +
              +

              Tokens and Ring Topology

              +
              +
              +class cassandra.metadata.TokenMap
              +

              Information about the layout of the ring.

              +
              +
              +get_replicas(keyspace, token)
              +

              Get a set of Host instances representing all of the +replica nodes for a given Token.

              +
              + +
              + +
              +
              +class cassandra.metadata.Token
              +

              Abstract class representing a token.

              +
              + +
              +
              +class cassandra.metadata.Murmur3Token(token)
              +

              A token for Murmur3Partitioner.

              +

              token is an int or string representing the token.

              +
              + +
              +
              +class cassandra.metadata.MD5Token(token)
              +

              A token for RandomPartitioner.

              +
              + +
              +
              +class cassandra.metadata.BytesToken(token)
              +

              A token for ByteOrderedPartitioner.

              +
              +
              +classmethod from_string(token_string)
              +

              token_string should be the string representation from the server.

              +
              + +
              + +
              +
              +cassandra.metadata.ReplicationStrategy
              +

              alias of _ReplicationStrategy

              +
              + +
              +
              +class cassandra.metadata.ReplicationFactor(all_replicas, transient_replicas=None)
              +

              Represent the replication factor of a keyspace.

              +
              + +
              +
              +class cassandra.metadata.SimpleStrategy(options_map)
              +
              +
              +export_for_schema()
              +

              Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

              +
              + +
              +
              +property replication_factor
              +

              The replication factor for this keyspace.

              +

              For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

              +
              + +
              + +
              +
              +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
              +
              +
              +export_for_schema()
              +

              Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

              +
              + +
              + +
              +
              +class cassandra.metadata.LocalStrategy(options_map)
              +
              +
              +export_for_schema()
              +

              Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

              +
              + +
              + +
              +
              +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
              +

              Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

              +

              If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

              +

              Example usage:

              +
              >>> result = group_keys_by_replica(
              +...     session, "system", "peers",
              +...     (("127.0.0.1", ), ("127.0.0.2", )))
              +
              +
              +
              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/metrics.html b/3.25.4-scylla/api/cassandra/metrics.html new file mode 100644 index 0000000000..2db47d5290 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/metrics.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.metrics - Performance Metrics

              +
              +
              +class cassandra.metrics.Metrics
              +

              A collection of timers and counters for various performance metrics.

              +

              Timer metrics are represented as floating point seconds.

              +
              +
              +request_timer = None
              +

              A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

              +
                +
              • count - number of requests that have been timed

              • +
              • min - min latency

              • +
              • max - max latency

              • +
              • mean - mean latency

              • +
              • stddev - standard deviation for latencies

              • +
              • median - median latency

              • +
              • 75percentile - 75th percentile latencies

              • +
              • 95percentile - 95th percentile latencies

              • +
              • 98percentile - 98th percentile latencies

              • +
              • 99percentile - 99th percentile latencies

              • +
              • 999percentile - 99.9th percentile latencies

              • +
              +
              + +
              +
              +connection_errors = None
              +

              A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

              +
              + +
              +
              +write_timeouts = None
              +

              A greplin.scales.IntStat count of write requests that resulted +in a timeout.

              +
              + +
              +
              +read_timeouts = None
              +

              A greplin.scales.IntStat count of read requests that resulted +in a timeout.

              +
              + +
              +
              +unavailables = None
              +

              A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

              +
              + +
              +
              +other_errors = None
              +

              A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

              +
              + +
              +
              +retries = None
              +

              A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

              +
              + +
              +
              +ignores = None
              +

              A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

              +
              + +
              +
              +known_hosts = None
              +

              A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

              +
              + +
              +
              +connected_to = None
              +

              A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

              +
              + +
              +
              +open_connections = None
              +

              A greplin.scales.IntStat count of the number connections +the driver currently has open.

              +
              + +
              +
              +get_stats()
              +

              Returns the metrics for the registered cluster instance.

              +
              + +
              +
              +set_stats_name(stats_name)
              +

              Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/policies.html b/3.25.4-scylla/api/cassandra/policies.html new file mode 100644 index 0000000000..4f2a3e12ce --- /dev/null +++ b/3.25.4-scylla/api/cassandra/policies.html @@ -0,0 +1,1880 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.policies - Load balancing and Failure Handling Policies

              +
              +

              Load Balancing

              +
              +
              +class cassandra.policies.HostDistance
              +

              A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

              +
              +
              +IGNORED = -1
              +

              A node with this distance should never be queried or have +connections opened to it.

              +
              + +
              +
              +LOCAL = 0
              +

              Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

              +

              This distance is typically used for nodes within the same +datacenter as the client.

              +
              + +
              +
              +REMOTE = 1
              +

              Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

              +

              This distance is typically used for nodes outside of the +datacenter that the client is running in.

              +
              + +
              + +
              +
              +class cassandra.policies.LoadBalancingPolicy
              +

              Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

              +

              In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

              +

              You may also use subclasses of LoadBalancingPolicy for +custom behavior.

              +
              +
              +distance(host)
              +

              Returns a measure of how remote a Host is in +terms of the HostDistance enums.

              +
              + +
              +
              +populate(cluster, hosts)
              +

              This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

              +
              + +
              +
              +make_query_plan(working_keyspace=None, query=None)
              +

              Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

              +

              Note that the query argument may be None when preparing +statements.

              +

              working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

              +
              + +
              +
              +check_supported()
              +

              This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

              +
              + +
              + +
              +
              +class cassandra.policies.RoundRobinPolicy
              +

              A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

              +
              +
              +populate(cluster, hosts)
              +

              This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

              +
              + +
              +
              +distance(host)
              +

              Returns a measure of how remote a Host is in +terms of the HostDistance enums.

              +
              + +
              +
              +make_query_plan(working_keyspace=None, query=None)
              +

              Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

              +

              Note that the query argument may be None when preparing +statements.

              +

              working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

              +
              + +
              +
              +on_up(host)
              +

              Called when a node is marked up.

              +
              + +
              +
              +on_down(host)
              +

              Called when a node is marked down.

              +
              + +
              +
              +on_add(host)
              +

              Called when a node is added to the cluster. The newly added node +should be considered up.

              +
              + +
              +
              +on_remove(host)
              +

              Called when a node is removed from the cluster.

              +
              + +
              + +
              +
              +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
              +

              Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

              +

              The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

              +

              used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

              +
              +
              +populate(cluster, hosts)
              +

              This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

              +
              + +
              +
              +distance(host)
              +

              Returns a measure of how remote a Host is in +terms of the HostDistance enums.

              +
              + +
              +
              +make_query_plan(working_keyspace=None, query=None)
              +

              Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

              +

              Note that the query argument may be None when preparing +statements.

              +

              working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

              +
              + +
              +
              +on_up(host)
              +

              Called when a node is marked up.

              +
              + +
              +
              +on_down(host)
              +

              Called when a node is marked down.

              +
              + +
              +
              +on_add(host)
              +

              Called when a node is added to the cluster. The newly added node +should be considered up.

              +
              + +
              +
              +on_remove(host)
              +

              Called when a node is removed from the cluster.

              +
              + +
              + +
              +
              +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
              +

              A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

              +

              This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

              +

              The hosts parameter should be a sequence of hosts to permit +connections to.

              +
              +
              +populate(cluster, hosts)
              +

              This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

              +
              + +
              +
              +distance(host)
              +

              Returns a measure of how remote a Host is in +terms of the HostDistance enums.

              +
              + +
              +
              +on_up(host)
              +

              Called when a node is marked up.

              +
              + +
              +
              +on_add(host)
              +

              Called when a node is added to the cluster. The newly added node +should be considered up.

              +
              + +
              + +
              +
              +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
              +

              A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

              +

              This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

              +

              If no routing_key is set on the query, the child +policy’s query plan will be used as is.

              +
              +
              +shuffle_replicas = False
              +

              Yield local replicas in a random order.

              +
              + +
              +
              +populate(cluster, hosts)
              +

              This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

              +
              + +
              +
              +check_supported()
              +

              This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

              +
              + +
              +
              +distance(*args, **kwargs)
              +

              Returns a measure of how remote a Host is in +terms of the HostDistance enums.

              +
              + +
              +
              +make_query_plan(working_keyspace=None, query=None)
              +

              Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

              +

              Note that the query argument may be None when preparing +statements.

              +

              working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

              +
              + +
              +
              +on_up(*args, **kwargs)
              +

              Called when a node is marked up.

              +
              + +
              +
              +on_down(*args, **kwargs)
              +

              Called when a node is marked down.

              +
              + +
              +
              +on_add(*args, **kwargs)
              +

              Called when a node is added to the cluster. The newly added node +should be considered up.

              +
              + +
              +
              +on_remove(*args, **kwargs)
              +

              Called when a node is removed from the cluster.

              +
              + +
              + +
              +
              +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
              +

              A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

              +

              This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

              +
              def address_is_ignored(host):
              +    return host.address in [ignored_address0, ignored_address1]
              +
              +blacklist_filter_policy = HostFilterPolicy(
              +    child_policy=RoundRobinPolicy(),
              +    predicate=address_is_ignored
              +)
              +
              +cluster = Cluster(
              +    primary_host,
              +    load_balancing_policy=blacklist_filter_policy,
              +)
              +
              +
              +

              See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

              +

              Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

              +
              +
              Parameters:
              +
                +
              • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

              • +
              • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

              • +
              +
              +
              +
              +
              +predicate(host)
              +

              A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

              +

              This is a read-only value set in __init__, implemented as a +property.

              +
              + +
              +
              +distance(host)
              +

              Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

              +
              + +
              +
              +make_query_plan(working_keyspace=None, query=None)
              +

              Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

              +

              Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

              +
              + +
              + +
              +
              +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
              +

              A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

              +

              If no host is set on the query, the child policy’s query plan will be used as is.

              +
              +
              +populate(cluster, hosts)
              +

              This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

              +
              + +
              +
              +make_query_plan(working_keyspace=None, query=None)
              +

              Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

              +

              Note that the query argument may be None when preparing +statements.

              +

              working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

              +
              + +
              + +
              +
              +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
              +

              Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

              +
              + +
              +
              +

              Translating Server Node Addresses

              +
              +
              +class cassandra.policies.AddressTranslator
              +

              Interface for translating cluster-defined endpoints.

              +

              The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

              +

              Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

              +
              +
              +translate(addr)
              +

              Accepts the node ip address, and returns a translated address to be used connecting to this node.

              +
              + +
              + +
              +
              +class cassandra.policies.IdentityTranslator
              +

              Returns the endpoint with no translation

              +
              +
              +translate(addr)
              +

              Accepts the node ip address, and returns a translated address to be used connecting to this node.

              +
              + +
              + +
              +
              +class cassandra.policies.EC2MultiRegionTranslator
              +

              Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

              +
              +
              +translate(addr)
              +

              Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

              +
              + +
              + +
              +
              +

              Marking Hosts Up or Down

              +
              +
              +class cassandra.policies.ConvictionPolicy(host)
              +

              A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

              +

              If custom behavior is needed, this class may be subclassed.

              +

              host is an instance of Host.

              +
              +
              +add_failure(connection_exc)
              +

              Implementations should return True if the host should be +convicted, False otherwise.

              +
              + +
              +
              +reset()
              +

              Implementations should clear out any convictions or state regarding +the host.

              +
              + +
              + +
              +
              +class cassandra.policies.SimpleConvictionPolicy(host)
              +

              The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

              +

              host is an instance of Host.

              +
              +
              +add_failure(connection_exc)
              +

              Implementations should return True if the host should be +convicted, False otherwise.

              +
              + +
              +
              +reset()
              +

              Implementations should clear out any convictions or state regarding +the host.

              +
              + +
              + +
              +
              +

              Reconnecting to Dead Hosts

              +
              +
              +class cassandra.policies.ReconnectionPolicy
              +

              This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

              +

              If custom behavior is needed, this class may be subclassed.

              +
              +
              +new_schedule()
              +

              This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

              +
              + +
              + +
              +
              +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
              +

              A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

              +

              delay should be a floating point number of seconds to wait inbetween +each attempt.

              +

              max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

              +
              +
              +new_schedule()
              +

              This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

              +
              + +
              + +
              +
              +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
              +

              A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

              +

              A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

              +

              base_delay and max_delay should be in floating point units of +seconds.

              +

              max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

              +
              +
              +new_schedule()
              +

              This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

              +
              + +
              + +
              +
              +

              Retrying Failed Operations

              +
              +
              +class cassandra.policies.WriteType
              +

              For usage with RetryPolicy, this describe a type +of write operation.

              +
              +
              +SIMPLE = 0
              +

              A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

              +
              + +
              +
              +BATCH = 1
              +

              A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

              +
              + +
              +
              +UNLOGGED_BATCH = 2
              +

              A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

              +
              + +
              +
              +COUNTER = 3
              +

              A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

              +
              + +
              +
              +BATCH_LOG = 4
              +

              The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

              +
              + +
              +
              +CAS = 5
              +

              A lighweight-transaction write, such as “DELETE … IF EXISTS”.

              +
              + +
              +
              +VIEW = 6
              +

              This WriteType is only seen in results for requests that were unable to +complete MV operations.

              +
              + +
              +
              +CDC = 7
              +

              This WriteType is only seen in results for requests that were unable to +complete CDC operations.

              +
              + +
              + +
              +
              +class cassandra.policies.RetryPolicy
              +

              A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

              +

              To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

              +

              To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

              +

              If custom behavior is needed for retrying certain operations, +this class may be subclassed.

              +
              +
              +RETRY = 0
              +

              This should be returned from the below methods if the operation +should be retried on the same connection.

              +
              + +
              +
              +RETHROW = 1
              +

              This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

              +
              + +
              +
              +IGNORE = 2
              +

              This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

              +
              + +
              +
              +RETRY_NEXT_HOST = 3
              +

              This should be returned from the below methods if the operation +should be retried on another connection.

              +
              + +
              +
              +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
              +

              This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

              +
              + +
              +
              +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
              +

              This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              write_type is one of the WriteType enums describing the +type of write operation.

              +

              The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

              +
              + +
              +
              +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
              +

              This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

              +

              query is the Statement that failed.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

              +
              + +
              +
              +on_request_error(query, consistency, error, retry_num)
              +

              This is called when an unexpected error happens. This can be in the +following situations:

              +
                +
              • On a connection error

              • +
              • On server errors: overloaded, isBootstrapping, serverError, etc.

              • +
              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              error the instance of the exception.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              The default, it triggers a retry on the next host in the query plan +with the same consistency level.

              +
              + +
              + +
              +
              +class cassandra.policies.FallthroughRetryPolicy
              +

              A retry policy that never retries and always propagates failures to +the application.

              +
              +
              +on_read_timeout(*args, **kwargs)
              +

              This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

              +
              + +
              +
              +on_write_timeout(*args, **kwargs)
              +

              This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              write_type is one of the WriteType enums describing the +type of write operation.

              +

              The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

              +
              + +
              +
              +on_unavailable(*args, **kwargs)
              +

              This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

              +

              query is the Statement that failed.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

              +
              + +
              +
              +on_request_error(*args, **kwargs)
              +

              This is called when an unexpected error happens. This can be in the +following situations:

              +
                +
              • On a connection error

              • +
              • On server errors: overloaded, isBootstrapping, serverError, etc.

              • +
              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              error the instance of the exception.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              The default, it triggers a retry on the next host in the query plan +with the same consistency level.

              +
              + +
              + +
              +
              +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
              +

              Deprecated: This retry policy will be removed in the next major release.

              +

              A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

              +

              BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

              +

              This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

              +
                +
              • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

              • +
              • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

              • +
              • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

              • +
              +

              The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

              +
                +
              • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

              • +
              • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

              • +
              +

              In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

              +
              +
              +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
              +

              This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

              +
              + +
              +
              +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
              +

              This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

              +

              query is the Statement that timed out.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              write_type is one of the WriteType enums describing the +type of write operation.

              +

              The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

              +
              + +
              +
              +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
              +

              This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

              +

              query is the Statement that failed.

              +

              consistency is the ConsistencyLevel that the operation was +attempted at.

              +

              required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

              +

              retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

              +

              By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

              +
              + +
              + +
              +
              +

              Retrying Idempotent Operations

              +
              +
              +class cassandra.policies.SpeculativeExecutionPolicy
              +

              Interface for specifying speculative execution plans

              +
              +
              +new_plan(keyspace, statement)
              +

              Returns

              +
              +
              Parameters:
              +
                +
              • keyspace

              • +
              • statement

              • +
              +
              +
              Returns:
              +

              +
              +
              +
              + +
              + +
              +
              +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
              +

              A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

              +
              +
              +new_plan(keyspace, statement)
              +

              Returns

              +
              +
              Parameters:
              +
                +
              • keyspace

              • +
              • statement

              • +
              +
              +
              Returns:
              +

              +
              +
              +
              + +
              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/pool.html b/3.25.4-scylla/api/cassandra/pool.html new file mode 100644 index 0000000000..bfe398ffa1 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/pool.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.pool - Hosts and Connection Pools

              +

              Connection pooling and host management.

              +
              +
              +class cassandra.pool.Host
              +

              Represents a single Cassandra node.

              +
              +
              +property address
              +

              The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

              +
              + +
              +
              +property datacenter
              +

              The datacenter the node is in.

              +
              + +
              +
              +property rack
              +

              The rack the node is in.

              +
              + +
              + +
              +
              +exception cassandra.pool.NoConnectionsAvailable
              +

              All existing connections to a given host are busy, or there are +no open connections.

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/protocol.html b/3.25.4-scylla/api/cassandra/protocol.html new file mode 100644 index 0000000000..225c174631 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/protocol.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.protocol - Protocol Features

              +
              +

              Custom Payloads

              +

              Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

              +

              By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

              +

              See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

              +
              +
              +class cassandra.protocol._ProtocolHandler
              +

              _ProtocolHander handles encoding and decoding messages.

              +

              This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

              +

              Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

              +
              +
              +message_types_by_opcode = {default mapping}
              +
              + +
              +
              +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
              +

              Encodes a message using the specified frame parameters, and compressor

              +
              +
              Parameters:
              +
                +
              • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

              • +
              • stream_id – protocol stream id for the frame header

              • +
              • protocol_version – version for the frame header, and used encoding contents

              • +
              • compressor – optional compression function to be used on the body

              • +
              +
              +
              +
              + +
              +
              +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
              +

              Decodes a native protocol message body

              +
              +
              Parameters:
              +
                +
              • protocol_version – version to use decoding contents

              • +
              • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

              • +
              • stream_id – native protocol stream id from the frame header

              • +
              • flags – native protocol flags bitmap from the header

              • +
              • opcode – native protocol opcode from the header

              • +
              • body – frame body

              • +
              • decompressor – optional decompression function to inflate the body

              • +
              +
              +
              Returns:
              +

              a message decoded from the body and frame attributes

              +
              +
              +
              + +
              + +
              +
              +

              Faster Deserialization

              +

              When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

              +
              from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
              +from cassandra.query import tuple_factory
              +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
              +s.row_factory = tuple_factory  #required for Numpy results
              +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
              +
              +
              +

              These protocol handlers comprise different parsers, and return results as described below:

              +
                +
              • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

              • +
              • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

              • +
              • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

              • +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/query.html b/3.25.4-scylla/api/cassandra/query.html new file mode 100644 index 0000000000..c51a468465 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/query.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

              +
              +
              +cassandra.query.tuple_factory(colnames, rows)
              +

              Returns each row as a tuple

              +

              Example:

              +
              >>> from cassandra.query import tuple_factory
              +>>> session = cluster.connect('mykeyspace')
              +>>> session.row_factory = tuple_factory
              +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
              +>>> print rows[0]
              +('Bob', 42)
              +
              +
              +
              +

              Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

              +
              +
              + +
              +
              +cassandra.query.named_tuple_factory(colnames, rows)
              +

              Returns each row as a namedtuple. +This is the default row factory.

              +

              Example:

              +
              >>> from cassandra.query import named_tuple_factory
              +>>> session = cluster.connect('mykeyspace')
              +>>> session.row_factory = named_tuple_factory
              +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
              +>>> user = rows[0]
              +
              +>>> # you can access field by their name:
              +>>> print "name: %s, age: %d" % (user.name, user.age)
              +name: Bob, age: 42
              +
              +>>> # or you can access fields by their position (like a tuple)
              +>>> name, age = user
              +>>> print "name: %s, age: %d" % (name, age)
              +name: Bob, age: 42
              +>>> name = user[0]
              +>>> age = user[1]
              +>>> print "name: %s, age: %d" % (name, age)
              +name: Bob, age: 42
              +
              +
              +
              +

              Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

              +
              +
              + +
              +
              +cassandra.query.dict_factory(colnames, rows)
              +

              Returns each row as a dict.

              +

              Example:

              +
              >>> from cassandra.query import dict_factory
              +>>> session = cluster.connect('mykeyspace')
              +>>> session.row_factory = dict_factory
              +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
              +>>> print rows[0]
              +{u'age': 42, u'name': u'Bob'}
              +
              +
              +
              +

              Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

              +
              +
              + +
              +
              +cassandra.query.ordered_dict_factory(colnames, rows)
              +

              Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

              +
              +

              Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

              +
              +
              + +
              +
              +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
              +

              A simple, un-prepared query.

              +

              query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

              +

              See Statement attributes for a description of the other parameters.

              +
              + +
              +
              +class cassandra.query.PreparedStatement
              +

              A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

              +

              A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

              +

              A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

              +
              +
              +bind(values)
              +

              Creates and returns a BoundStatement instance using values.

              +

              See BoundStatement.bind() for rules on input values.

              +
              + +
              + +
              +
              +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
              +

              A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

              +

              prepared_statement should be an instance of PreparedStatement.

              +

              See Statement attributes for a description of the other parameters.

              +
              +
              +bind(values)
              +

              Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

              +
                +
              • a sequence, even if you are only binding one value, or

              • +
              • a dict that relates 1-to-1 between dict keys and columns

              • +
              +
              +

              Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

              +
                +
              • short sequences will be extended to match bind parameters with UNSET_VALUE

              • +
              • names may be omitted from a dict with UNSET_VALUE implied.

              • +
              +
              +
              +

              Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

              +
              +
              + +
              +
              +property routing_key
              +

              The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

              +

              If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

              +
              + +
              + +
              +
              +class cassandra.query.Statement
              +

              An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

              +
              +
              +property routing_key
              +

              The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

              +

              If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

              +
              + +
              +
              +property serial_consistency_level
              +

              The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

              +

              The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

              +

              The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

              +

              Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

              +

              See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

              +
              +

              New in version 2.0.0.

              +
              +
              + +
              + +
              +
              +cassandra.query.UNSET_VALUE
              +

              The base class of the class hierarchy.

              +

              When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

              +
              + +
              +
              +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
              +

              A protocol-level batch of operations which are applied atomically +by default.

              +
              +

              New in version 2.0.0.

              +
              +

              batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

              +

              retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

              +

              consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

              +

              custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

              +

              Example usage:

              +
              insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
              +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
              +
              +for (name, age) in users_to_insert:
              +    batch.add(insert_user, (name, age))
              +
              +session.execute(batch)
              +
              +
              +

              You can also mix different types of operations within a batch:

              +
              batch = BatchStatement()
              +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
              +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
              +session.execute(batch)
              +
              +
              +
              +

              New in version 2.0.0.

              +
              +
              +

              Changed in version 2.1.0: Added serial_consistency_level as a parameter

              +
              +
              +

              Changed in version 2.6.0: Added custom_payload as a parameter

              +
              +
              +
              +add(statement, parameters=None)
              +

              Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

              +

              Like with other statements, parameters must be a sequence, even +if there is only one item.

              +
              + +
              +
              +add_all(statements, parameters)
              +

              Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

              +
              + +
              +
              +clear()
              +

              This is a convenience method to clear a batch statement for reuse.

              +

              Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

              +
              + +
              +
              +serial_consistency_level = None
              +
              + +
              + +
              +
              +class cassandra.query.BatchType
              +

              A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

              +
              +

              New in version 2.0.0.

              +
              +
              +
              +LOGGED = BatchType.LOGGED
              +
              + +
              +
              +UNLOGGED = BatchType.UNLOGGED
              +
              + +
              +
              +COUNTER = BatchType.COUNTER
              +
              + +
              + +
              +
              +class cassandra.query.ValueSequence(iterable=(), /)
              +

              A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

              +

              This is typically needed when supplying a list of keys to select. +For example:

              +
              >>> my_user_ids = ('alice', 'bob', 'charles')
              +>>> query = "SELECT * FROM users WHERE user_id IN %s"
              +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
              +
              +
              +
              + +
              +
              +class cassandra.query.QueryTrace
              +

              A trace of the duration and events that occurred when executing +an operation.

              +
              +
              +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
              +

              Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

              +

              wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

              +

              query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

              +
              + +
              + +
              +
              +class cassandra.query.TraceEvent
              +

              Representation of a single event within a query trace.

              +
              + +
              +
              +exception cassandra.query.TraceUnavailable
              +

              Raised when complete trace details cannot be fetched from Cassandra.

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/timestamps.html b/3.25.4-scylla/api/cassandra/timestamps.html new file mode 100644 index 0000000000..4223c0304b --- /dev/null +++ b/3.25.4-scylla/api/cassandra/timestamps.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.timestamps - Timestamp Generation

              +
              +
              +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
              +

              An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

              +
              +

              New in version 3.8.0.

              +
              +
              +
              +warn_on_drift = True
              +

              If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

              +
              + +
              +
              +warning_threshold = 1
              +

              This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

              +
              + +
              +
              +warning_interval = 1
              +

              This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

              +
              + +
              +
              +_next_timestamp(now, last)
              +

              Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

              +
              +
              Parameters:
              +
                +
              • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

              • +
              • last (int) – an integer representing the last timestamp returned by +this object

              • +
              +
              +
              +
              + +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/cassandra/util.html b/3.25.4-scylla/api/cassandra/util.html new file mode 100644 index 0000000000..7397d4df65 --- /dev/null +++ b/3.25.4-scylla/api/cassandra/util.html @@ -0,0 +1,1082 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              cassandra.util - Utilities

              +
              +
              +class cassandra.util.Date(value)
              +

              Idealized date: year, month, day

              +

              Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

              +

              Initializer value can be:

              +
                +
              • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

              • +
              • datetime.date: built-in date

              • +
              • string_type: a string time of the form “yyyy-mm-dd”

              • +
              +
              +
              +date()
              +

              Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

              +

              ValueError is raised for Dates outside this range.

              +
              + +
              +
              +property seconds
              +

              Absolute seconds from epoch (can be negative)

              +
              + +
              + +
              +
              +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
              +

              DSE DateRange Type

              +
              +
              +lower_bound
              +

              DateRangeBound representing the lower bound of a bounded range.

              +
              + +
              +
              +upper_bound
              +

              DateRangeBound representing the upper bound of a bounded range.

              +
              + +
              +
              +value
              +

              DateRangeBound representing the value of a single-value range.

              +
              + +

              As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

              +
              +
              Parameters:
              +
              +
              +
              +
              + +
              +
              +class cassandra.util.DateRangeBound(value, precision)
              +

              Represents a single date value and its precision for DateRange.

              +
              +
              +milliseconds
              +

              Integer representing milliseconds since the UNIX epoch. May be negative.

              +
              + +
              +
              +precision
              +

              String representing the precision of a bound. Must be a valid +DateRangePrecision member.

              +
              + +

              DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

              +
              +
              Parameters:
              +
                +
              • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

              • +
              • precision – a string representing precision

              • +
              +
              +
              +
              +
              +datetime()
              +

              Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

              +
              + +
              +
              +classmethod from_value(value)
              +

              Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

              +
              +
              Parameters:
              +

              value – a dictlike or iterable object

              +
              +
              +
              + +
              + +
              +
              +class cassandra.util.DateRangePrecision
              +

              An “enum” representing the valid values for DateRange.precision.

              +
              + +
              +
              +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
              +

              Represents a Distance geometry for DSE

              +
              +
              +static from_wkt(s)
              +

              Parse a Distance geometry from a wkt string and return a new Distance object.

              +
              + +
              + +
              +
              +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
              +

              Cassandra Duration Type

              +
              + +
              +
              +class cassandra.util.LineString(coords=())
              +

              Represents a linestring geometry for DSE

              +

              ‘coords`: a sequence of (x, y) coordinates of points in the linestring

              +
              +
              +static from_wkt(s)
              +

              Parse a LineString geometry from a wkt string and return a new LineString object.

              +
              + +
              + +
              +
              +class cassandra.util.OrderedMap(*args, **kwargs)
              +

              An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

              +
              >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
              +...                  ({'three': 3, 'four': 4}, 'value2')])
              +>>> list(od.keys())
              +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
              +>>> list(od.values())
              +['value', 'value2']
              +
              +
              +

              These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

              +
              CREATE TABLE example (
              +    ...
              +    value map<frozen<map<int, int>>, double>
              +    ...
              +)
              +
              +
              +

              This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

              +
              + +
              +
              +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
              +
              + +
              +
              +class cassandra.util.Point(x=nan, y=nan)
              +

              Represents a point geometry for DSE

              +
              +
              +static from_wkt(s)
              +

              Parse a Point geometry from a wkt string and return a new Point object.

              +
              + +
              + +
              +
              +class cassandra.util.Polygon(exterior=(), interiors=None)
              +

              Represents a polygon geometry for DSE

              +

              ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

              +
              +
              +static from_wkt(s)
              +

              Parse a Polygon geometry from a wkt string and return a new Polygon object.

              +
              + +
              + +
              +
              +class cassandra.util.SortedSet(iterable=())
              +

              A sorted set based on sorted list

              +

              A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

              +

              #Not implemented: update functions, inplace operators

              +
              + +
              +
              +class cassandra.util.Time(value)
              +

              Idealized time, independent of day.

              +

              Up to nanosecond resolution

              +

              Initializer value can be:

              +
                +
              • integer_type: absolute nanoseconds in the day

              • +
              • datetime.time: built-in time

              • +
              • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

              • +
              +
              +
              +property hour
              +

              The hour component of this time (0-23)

              +
              + +
              +
              +property minute
              +

              The minute component of this time (0-59)

              +
              + +
              +
              +property nanosecond
              +

              The fractional seconds component of the time, in nanoseconds

              +
              + +
              +
              +property second
              +

              The second component of this time (0-59)

              +
              + +
              +
              +time()
              +

              Return a built-in datetime.time (nanosecond precision truncated to micros).

              +
              + +
              + +
              +
              +class cassandra.util.Version(version)
              +

              Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

              +

              TODO: when python2 support is removed, use packaging.version.

              +
              + +
              +
              +cassandra.util.datetime_from_timestamp(timestamp)
              +

              Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

              +
              +
              Parameters:
              +

              timestamp – a unix timestamp, in seconds

              +
              +
              +
              + +
              +
              +cassandra.util.datetime_from_uuid1(uuid_arg)
              +

              Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

              +
              +
              Parameters:
              +

              uuid_arg – a version 1 UUID

              +
              +
              +
              + +
              +
              +cassandra.util.max_uuid_from_time(timestamp)
              +

              Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

              +

              See uuid_from_time() for argument and return types.

              +
              + +
              +
              +cassandra.util.min_uuid_from_time(timestamp)
              +

              Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

              +

              See uuid_from_time() for argument and return types.

              +
              + +
              +
              +cassandra.util.ms_timestamp_from_datetime(dt)
              +

              Converts a datetime to a timestamp expressed in milliseconds.

              +
              +
              Parameters:
              +

              dt – a datetime.datetime

              +
              +
              +
              + +
              +
              +cassandra.util.sortedset
              +

              alias of SortedSet

              +
              + +
              +
              +cassandra.util.unix_time_from_uuid1(uuid_arg)
              +

              Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

              +
              +
              Parameters:
              +

              uuid_arg – a version 1 UUID

              +
              +
              +
              + +
              +
              +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
              +

              Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

              +

              Raises an OverflowError if the timestamp is out of range for +datetime.

              +
              +
              Parameters:
              +

              timestamp – timestamp, in milliseconds

              +
              +
              +
              + +
              +
              +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
              +

              Converts a datetime or timestamp to a type 1 uuid.UUID.

              +
              +
              Parameters:
              +
                +
              • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

              • +
              • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

              • +
              • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

              • +
              +
              +
              Return type:
              +

              uuid.UUID

              +
              +
              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/api/index.html b/3.25.4-scylla/api/index.html new file mode 100644 index 0000000000..85aa394605 --- /dev/null +++ b/3.25.4-scylla/api/index.html @@ -0,0 +1,872 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              API Documentation

              +
              +

              Core Driver

              +
              + +
              +
              +
              +

              Object Mapper

              + +
              +
              +

              DataStax Graph

              + +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/batches.html b/3.25.4-scylla/cqlengine/batches.html new file mode 100644 index 0000000000..ed7e641357 --- /dev/null +++ b/3.25.4-scylla/cqlengine/batches.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Batch Queries

              +

              cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

              +
              +

              Batch Query General Use Pattern

              +

              You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

              +
              from cassandra.cqlengine.query import BatchQuery
              +
              +#using a context manager
              +with BatchQuery() as b:
              +    now = datetime.now()
              +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
              +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
              +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
              +
              +# -- or --
              +
              +#manually
              +b = BatchQuery()
              +now = datetime.now()
              +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
              +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
              +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
              +b.execute()
              +
              +# updating in a batch
              +
              +b = BatchQuery()
              +em1.description = "new description"
              +em1.batch(b).save()
              +em2.description = "another new description"
              +em2.batch(b).save()
              +b.execute()
              +
              +# deleting in a batch
              +b = BatchQuery()
              +ExampleModel.objects(id=some_id).batch(b).delete()
              +ExampleModel.objects(id=some_id2).batch(b).delete()
              +b.execute()
              +
              +
              +

              Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

              +
              with BatchQuery(execute_on_exception=True) as b:
              +    LogEntry.batch(b).create(k=1, v=1)
              +    mystery_function() # exception thrown in here
              +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
              +
              +
              +

              If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

              +
              +
              +

              Batch Query Execution Callbacks

              +

              In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

              +

              Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

              +

              The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

              +
              def my_callback(*args, **kwargs):
              +    pass
              +
              +batch = BatchQuery()
              +
              +batch.add_callback(my_callback)
              +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
              +
              +# if you need reference to the batch within the callback,
              +# just trap it in the arguments to be passed to the callback:
              +batch.add_callback(my_callback, cqlengine_batch=batch)
              +
              +# once the batch executes...
              +batch.execute()
              +
              +# the effect of the above scheduled callbacks will be similar to
              +my_callback()
              +my_callback('positional arg', named_arg='named arg value')
              +my_callback(cqlengine_batch=batch)
              +
              +
              +

              Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

              +
              +

              Logged vs Unlogged Batches

              +

              By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

              +
              from cassandra.cqlengine.query import BatchType
              +with BatchQuery(batch_type=BatchType.Unlogged) as b:
              +    LogEntry.batch(b).create(k=1, v=1)
              +    LogEntry.batch(b).create(k=1, v=2)
              +
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/connections.html b/3.25.4-scylla/cqlengine/connections.html new file mode 100644 index 0000000000..a86aba34a5 --- /dev/null +++ b/3.25.4-scylla/cqlengine/connections.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Connections

              +

              Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

              +
              +

              Register a new connection

              +

              To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

              +
              from cassandra.cqlengine import connection
              +
              +connection.setup(['127.0.0.1')
              +connection.register_connection('cluster2', ['127.0.0.2'])
              +
              +
              +

              register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

              +
              from cassandra.cqlengine import connection
              +from cassandra.cluster import Cluster
              +
              +session = Cluster(['127.0.0.1']).connect()
              +connection.register_connection('cluster3', session=session)
              +
              +
              +
              +
              +

              Change the default connection

              +

              You can change the default cqlengine connection on registration:

              +
              from cassandra.cqlengine import connection
              +
              +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
              +
              +
              +

              or on the fly using set_default_connection()

              +
              connection.set_default_connection('cluster2')
              +
              +
              +
              +
              +

              Unregister a connection

              +

              You can unregister a connection using unregister_connection():

              +
              connection.unregister_connection('cluster2')
              +
              +
              +
              +
              +

              Management

              +

              When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

              +
              from cassandra.cqlengine import management
              +
              +keyspaces = ['ks1', 'ks2']
              +conns = ['cluster1', 'cluster2']
              +
              +# registers your connections
              +# ...
              +
              +# create all keyspaces on all connections
              +for ks in keyspaces:
              +    management.create_simple_keyspace(ks, connections=conns)
              +
              +# define your Automobile model
              +# ...
              +
              +# sync your models
              +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
              +
              +
              +
              +
              +

              Connection Selection

              +

              cqlengine will select the default connection, unless your specify a connection using one of the following methods.

              +
              +

              Default Model Connection

              +

              You can specify a default connection per model:

              +
              class Automobile(Model):
              +    __keyspace__ = 'test'
              +    __connection__ = 'cluster2'
              +    manufacturer = columns.Text(primary_key=True)
              +    year = columns.Integer(primary_key=True)
              +    model = columns.Text(primary_key=True)
              +
              +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
              +
              +
              +
              +
              +

              QuerySet and model instance

              +

              You can use the using() method to select a connection (or keyspace):

              +
              Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
              +q = Automobile.objects.filter(manufacturer='Tesla')
              +autos = q.using(keyspace='ks2', connection='cluster2').all()
              +
              +for auto in autos:
              +    auto.using(connection='cluster1').save()
              +
              +
              +
              +
              +

              Context Manager

              +

              You can use the ContextQuery as well to select a connection:

              +
              with ContextQuery(Automobile, connection='cluster1') as A:
              +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
              +
              +
              +
              +
              +

              BatchQuery

              +

              With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

              +
              with BatchQuery(connection='cluster1') as b:
              +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
              +
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/faq.html b/3.25.4-scylla/cqlengine/faq.html new file mode 100644 index 0000000000..a3b8fa6493 --- /dev/null +++ b/3.25.4-scylla/cqlengine/faq.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Frequently Asked Questions

              +
              +

              Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

              +

              The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

              +
              +
              +

              How to preserve ordering in batch query?

              +

              Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

              +
                +
              • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

              • +
              • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

              • +
              • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

              • +
              +

              Below is an example to show this scenario.

              +
              class MyMode(Model):
              +    id    = columns.Integer(primary_key=True)
              +    count = columns.Integer()
              +    text  = columns.Text()
              +
              +with BatchQuery() as b:
              +   MyModel.batch(b).create(id=1, count=2, text='123')
              +   MyModel.batch(b).create(id=1, count=3, text='111')
              +
              +assert MyModel.objects(id=1).first().count == 3
              +assert MyModel.objects(id=1).first().text  == '123'
              +
              +
              +

              The largest value of count is 3, and the largest value of text would be ‘123’.

              +

              The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

              +
              with BatchQuery() as b:
              +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
              +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
              +
              +assert MyModel.objects(id=1).first().count == 3
              +assert MyModel.objects(id=1).first().text  == '111'
              +
              +
              +
              +
              +

              How can I delete individual values from a row?

              +

              When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

              +
              class MyModel(Model):
              +    id    = columns.Integer(primary_key=True)
              +    text  = columns.Text()
              +
              +m = MyModel.create(id=1, text='We can delete this with None')
              +assert MyModel.objects(id=1).first().text is not None
              +
              +m.update(text=None)
              +assert MyModel.objects(id=1).first().text is None
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/models.html b/3.25.4-scylla/cqlengine/models.html new file mode 100644 index 0000000000..afe5c6b205 --- /dev/null +++ b/3.25.4-scylla/cqlengine/models.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Models

              +

              A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

              +

              Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

              +

              Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

              +
              +

              Example Definitions

              +

              This example defines a Person table, with the columns first_name and last_name

              +
              from cassandra.cqlengine import columns
              +from cassandra.cqlengine.models import Model
              +
              + class Person(Model):
              +     id = columns.UUID(primary_key=True)
              +     first_name  = columns.Text()
              +     last_name = columns.Text()
              +
              +
              +

              The Person model would create this CQL table:

              +
              CREATE TABLE cqlengine.person (
              +    id uuid,
              +    first_name text,
              +    last_name text,
              +    PRIMARY KEY (id)
              +);
              +
              +
              +

              Here’s an example of a comment table created with clustering keys, in descending order:

              +
              from cassandra.cqlengine import columns
              +from cassandra.cqlengine.models import Model
              +
              +class Comment(Model):
              +    photo_id = columns.UUID(primary_key=True)
              +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
              +    comment = columns.Text()
              +
              +
              +

              The Comment model’s create table would look like the following:

              +
              CREATE TABLE comment (
              +  photo_id uuid,
              +  comment_id timeuuid,
              +  comment text,
              +  PRIMARY KEY (photo_id, comment_id)
              +) WITH CLUSTERING ORDER BY (comment_id DESC);
              +
              +
              +

              To sync the models to the database, you may do the following*:

              +
              from cassandra.cqlengine.management import sync_table
              +sync_table(Person)
              +sync_table(Comment)
              +
              +
              +

              *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

              +

              For examples on manipulating data and creating queries, see Making Queries

              +
              +
              +

              Manipulating model instances as dictionaries

              +

              Model instances can be accessed like dictionaries.

              +
              class Person(Model):
              +    first_name  = columns.Text()
              +    last_name = columns.Text()
              +
              +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
              +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
              +kevin['first_name']  # returns 'Kevin'
              +kevin.keys()  # returns ['first_name', 'last_name']
              +kevin.values()  # returns ['Kevin', 'Deldycke']
              +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
              +
              +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
              +
              +
              +
              +
              +

              Extending Model Validation

              +

              Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

              +

              However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

              +
              class Member(Model):
              +    person_id = UUID(primary_key=True)
              +    name = Text(required=True)
              +
              +    def validate(self):
              +        super(Member, self).validate()
              +        if self.name == 'jon':
              +            raise ValidationError('no jon\'s allowed')
              +
              +
              +

              Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

              +
              +
              +

              Model Inheritance

              +

              It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

              +

              For instance, suppose you want a table that stores rows of pets owned by an owner:

              +
              class Pet(Model):
              +    __table_name__ = 'pet'
              +    owner_id = UUID(primary_key=True)
              +    pet_id = UUID(primary_key=True)
              +    pet_type = Text(discriminator_column=True)
              +    name = Text()
              +
              +    def eat(self, food):
              +        pass
              +
              +    def sleep(self, time):
              +        pass
              +
              +class Cat(Pet):
              +    __discriminator_value__ = 'cat'
              +    cuteness = Float()
              +
              +    def tear_up_couch(self):
              +        pass
              +
              +class Dog(Pet):
              +    __discriminator_value__ = 'dog'
              +    fierceness = Float()
              +
              +    def bark_all_night(self):
              +        pass
              +
              +
              +

              After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

              +

              To setup a model structure with inheritance, follow these steps

              +
                +
              1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

              2. +
              3. Create subclass models, and define a unique __discriminator_value__ value on each

              4. +
              5. Run sync_table on each of the sub tables

              6. +
              +

              About the discriminator value

              +

              The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

              +
              +
              +

              User Defined Types

              +

              cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

              +
              from cassandra.cqlengine.columns import *
              +from cassandra.cqlengine.models import Model
              +from cassandra.cqlengine.usertype import UserType
              +
              +class address(UserType):
              +    street = Text()
              +    zipcode = Integer()
              +
              +class users(Model):
              +    __keyspace__ = 'account'
              +    name = Text(primary_key=True)
              +    addr = UserDefinedType(address)
              +
              +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
              +user = users.objects(name="Joe")[0]
              +print user.name, user.addr
              +# Joe address(street=u'Easy St.', zipcode=99999)
              +
              +
              +

              UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

              +

              sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

              +

              Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

              +

              *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/queryset.html b/3.25.4-scylla/cqlengine/queryset.html new file mode 100644 index 0000000000..bed4edbc31 --- /dev/null +++ b/3.25.4-scylla/cqlengine/queryset.html @@ -0,0 +1,996 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Making Queries

              +
              +

              Retrieving objects

              +

              Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

              +
              +

              Retrieving all objects

              +

              The simplest query you can make is to return all objects from a table.

              +

              This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

              +

              Using the Person example model, we would get all Person objects like this:

              +
              all_objects = Person.objects.all()
              +
              +
              +
              +
              +

              Retrieving objects with filters

              +

              Typically, you’ll want to query only a subset of the records in your database.

              +

              That can be accomplished with the QuerySet’s .filter(\*\*) method.

              +

              For example, given the model definition:

              +
              class Automobile(Model):
              +    manufacturer = columns.Text(primary_key=True)
              +    year = columns.Integer(primary_key=True)
              +    model = columns.Text()
              +    price = columns.Decimal()
              +    options = columns.Set(columns.Text)
              +
              +
              +

              …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +
              +
              +

              You can also use the more convenient syntax:

              +
              q = Automobile.objects(Automobile.manufacturer == 'Tesla')
              +
              +
              +

              We can then further filter our query with another call to .filter

              +
              q = q.filter(year=2012)
              +
              +
              +

              Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

              +
              +
              +
              +

              Accessing objects in a QuerySet

              +

              There are several methods for getting objects out of a queryset

              +
                +
              • +
                iterating over the queryset
                for car in Automobile.objects.all():
                +    #...do something to the car instance
                +    pass
                +
                +
                +
                +
                +
              • +
              • +
                list index
                q = Automobile.objects.all()
                +q[0] #returns the first result
                +q[1] #returns the second result
                +
                +
                +
                +

                Note

                +
                  +
                • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

                • +
                • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                • +
                +
                +
                +
                +
              • +
              • +
                list slicing
                q = Automobile.objects.all()
                +q[1:] #returns all results except the first
                +q[1:9] #returns a slice of the results
                +
                +
                +
                +

                Note

                +
                  +
                • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

                • +
                • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                • +
                +
                +
                +
                +
              • +
              • +
                calling get() on the queryset
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year=2012)
                +car = q.get()
                +
                +
                +

                this returns the object matching the queryset

                +
                +
                +
              • +
              • +
                calling first() on the queryset
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year=2012)
                +car = q.first()
                +
                +
                +

                this returns the first value in the queryset

                +
                +
                +
              • +
              +
              +
              +

              Filtering Operators

              +

              Equal To

              +

              The default filtering operator.

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year=2012)  #year == 2012
              +
              +
              +

              In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

              +

              in (__in)

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year__in=[2011, 2012])
              +
              +
              +

              > (__gt)

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year__gt=2010)  # year > 2010
              +
              +# or the nicer syntax
              +
              +q.filter(Automobile.year > 2010)
              +
              +
              +

              >= (__gte)

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year__gte=2010)  # year >= 2010
              +
              +# or the nicer syntax
              +
              +q.filter(Automobile.year >= 2010)
              +
              +
              +

              < (__lt)

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year__lt=2012)  # year < 2012
              +
              +# or...
              +
              +q.filter(Automobile.year < 2012)
              +
              +
              +

              <= (__lte)

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q = q.filter(year__lte=2012)  # year <= 2012
              +
              +q.filter(Automobile.year <= 2012)
              +
              +
              +

              CONTAINS (__contains)

              +

              The CONTAINS operator is available for all collection types (List, Set, Map).

              +
              q = Automobile.objects.filter(manufacturer='Tesla')
              +q.filter(options__contains='backup camera').allow_filtering()
              +
              +
              +

              Note that we need to use allow_filtering() since the options column has no secondary index.

              +

              LIKE (__like)

              +

              The LIKE operator is available for text columns that have a SASI secondary index.

              +
              q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
              +
              +
              +

              IS NOT NULL (IsNotNull(column_name))

              +

              The IS NOT NULL operator is not yet supported for C*.

              +
              q = Automobile.objects.filter(IsNotNull('model'))
              +
              +
              +

              Limitations:

              +
                +
              • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

              • +
              • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

              • +
              +
              +
              +

              TimeUUID Functions

              +

              In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

              +
              +
              +class cqlengine.queryset.MinTimeUUID(datetime)
              +

              returns the minimum time uuid value possible for the given datetime

              +
              + +
              +
              +class cqlengine.queryset.MaxTimeUUID(datetime)
              +

              returns the maximum time uuid value possible for the given datetime

              +
              + +

              Example

              +
              class DataStream(Model):
              +    id      = columns.UUID(partition_key=True)
              +    time    = columns.TimeUUID(primary_key=True)
              +    data    = columns.Bytes()
              +
              +min_time = datetime(1982, 1, 1)
              +max_time = datetime(1982, 3, 9)
              +
              +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
              +
              +
              +
              +
              +

              Token Function

              +

              Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

              +

              See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

              +

              Example

              +
              class Items(Model):
              +    id      = columns.Text(primary_key=True)
              +    data    = columns.Bytes()
              +
              +query = Items.objects.all().limit(10)
              +
              +first_page = list(query);
              +last = first_page[-1]
              +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
              +
              +
              +
              +
              +

              QuerySets are immutable

              +

              When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

              +

              Example

              +
              #this produces 3 different querysets
              +#q does not change after it's initial definition
              +q = Automobiles.objects.filter(year=2012)
              +tesla2012 = q.filter(manufacturer='Tesla')
              +honda2012 = q.filter(manufacturer='Honda')
              +
              +
              +
              +
              +

              Ordering QuerySets

              +

              Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

              +

              However, you can set a column to order on with the .order_by(column_name) method.

              +

              Example

              +
              #sort ascending
              +q = Automobiles.objects.all().order_by('year')
              +#sort descending
              +q = Automobiles.objects.all().order_by('-year')
              +
              +
              +

              Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

              +

              For instance, given our Automobile model, year is the only column we can order on.

              +
              +
              +

              Values Lists

              +

              There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

              +
              items = list(range(20))
              +random.shuffle(items)
              +for i in items:
              +    TestModel.create(id=1, clustering_key=i)
              +
              +values = list(TestModel.objects.values_list('clustering_key', flat=True))
              +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
              +
              +
              +
              +
              +

              Per Query Timeouts

              +

              By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

              +
              class Row(Model):
              +    id = columns.Integer(primary_key=True)
              +    name = columns.Text()
              +
              +
              +

              Fetch all objects with a timeout of 5 seconds

              +
              Row.objects().timeout(5).all()
              +
              +
              +

              Create a single row with a 50ms timeout

              +
              Row(id=1, name='Jon').timeout(0.05).create()
              +
              +
              +

              Delete a single row with no timeout

              +
              Row(id=1).timeout(None).delete()
              +
              +
              +

              Update a single row with no timeout

              +
              Row(id=1).timeout(None).update(name='Blake')
              +
              +
              +

              Batch query timeouts

              +
              with BatchQuery(timeout=10) as b:
              +    Row(id=1, name='Jon').create()
              +
              +
              +

              NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

              +
              +
              +

              Default TTL and Per Query TTL

              +

              Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

              +

              Example:

              +
              class User(Model):
              +    __options__ = {'default_time_to_live': 20}
              +
              +    user_id = columns.UUID(primary_key=True)
              +    ...
              +
              +
              +

              You can set TTL per-query if needed. Here are a some examples:

              +

              Example:

              +
              class User(Model):
              +    __options__ = {'default_time_to_live': 20}
              +
              +    user_id = columns.UUID(primary_key=True)
              +    ...
              +
              +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
              +
              +user.ttl(30).update(age=21)            # Update the TTL to 30
              +User.objects.ttl(10).create(user_id=1)  # TTL 10
              +User(user_id=1, age=21).ttl(10).save()  # TTL 10
              +
              +
              +
              +
              +

              Named Tables

              +

              Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

              +
              from cassandra.cqlengine.connection import setup
              +setup("127.0.0.1", "cqlengine_test")
              +
              +from cassandra.cqlengine.named import NamedTable
              +user = NamedTable("cqlengine_test", "user")
              +user.objects()
              +user.objects()[0]
              +
              +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/third_party.html b/3.25.4-scylla/cqlengine/third_party.html new file mode 100644 index 0000000000..5e3715c672 --- /dev/null +++ b/3.25.4-scylla/cqlengine/third_party.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Third party integrations

              +
              +

              Celery

              +

              Here’s how, in substance, CQLengine can be plugged to Celery:

              +
              from celery import Celery
              +from celery.signals import worker_process_init, beat_init
              +from cassandra.cqlengine import connection
              +from cassandra.cqlengine.connection import (
              +    cluster as cql_cluster, session as cql_session)
              +
              +def cassandra_init(**kwargs):
              +    """ Initialize a clean Cassandra connection. """
              +    if cql_cluster is not None:
              +        cql_cluster.shutdown()
              +    if cql_session is not None:
              +        cql_session.shutdown()
              +    connection.setup()
              +
              +# Initialize worker context for both standard and periodic tasks.
              +worker_process_init.connect(cassandra_init)
              +beat_init.connect(cassandra_init)
              +
              +app = Celery()
              +
              +
              +
              +
              +

              uWSGI

              +

              This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

              +
              from cassandra.cqlengine import connection
              +from cassandra.cqlengine.connection import (
              +    cluster as cql_cluster, session as cql_session)
              +
              +try:
              +    from uwsgidecorators import postfork
              +except ImportError:
              +    # We're not in a uWSGI context, no need to hook Cassandra session
              +    # initialization to the postfork event.
              +    pass
              +else:
              +    @postfork
              +    def cassandra_init(**kwargs):
              +        """ Initialize a new Cassandra session in the context.
              +
              +        Ensures that a new session is returned for every new request.
              +        """
              +        if cql_cluster is not None:
              +            cql_cluster.shutdown()
              +        if cql_session is not None:
              +            cql_session.shutdown()
              +        connection.setup()
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/cqlengine/upgrade_guide.html b/3.25.4-scylla/cqlengine/upgrade_guide.html new file mode 100644 index 0000000000..23640b0500 --- /dev/null +++ b/3.25.4-scylla/cqlengine/upgrade_guide.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Upgrade Guide

              +

              This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

              +

              THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

              +
              +

              Functional Changes

              +
              +

              List Prepend Reversing

              +

              Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

              +
              +
              +

              Date Column Type

              +

              The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

              +
              +
              +
              +

              Remove cqlengine

              +

              To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

              +

              The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

              +
              +
              +

              Organization

              +
              +

              Imports

              +

              cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

              +
              from cassandra.cqlengine import columns
              +
              +
              +

              is now:

              +
              from cassandra.cqlengine import columns
              +
              +
              +
              +
              +

              Package-Level Aliases

              +

              Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

              +

              Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

              +

              These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

              +
              +
              +

              Exceptions

              +

              The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

              + + + + + + + + + + + + + + + + + + + + + + + + + + +

              Exception class

              New module

              CQLEngineException

              cassandra.cqlengine

              ModelException

              cassandra.cqlengine.models

              ValidationError

              cassandra.cqlengine

              UndefinedKeyspaceException

              cassandra.cqlengine.connection

              LWTException

              cassandra.cqlengine.query

              IfNotExistsWithCounterColumn

              cassandra.cqlengine.query

              +
              +
              +

              UnicodeMixin Consolidation

              +

              class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

              +
              +
              +
              +

              API Deprecations

              +

              This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

              +
              +

              Float/Double Overload

              +

              Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

              +
              +
              +

              Schema Management

              +

              cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

              + +

              cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

              +
              +
              +

              Model Inheritance

              +

              The names for class attributes controlling model inheritance are changing. Changes are as follows:

              + +

              The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

              +

              The example below shows a simple translation:

              +

              Before:

              +
              class Pet(Model):
              +    __table_name__ = 'pet'
              +    owner_id = UUID(primary_key=True)
              +    pet_id = UUID(primary_key=True)
              +    pet_type = Text(polymorphic_key=True)
              +    name = Text()
              +
              +class Cat(Pet):
              +    __polymorphic_key__ = 'cat'
              +
              +class Dog(Pet):
              +    __polymorphic_key__ = 'dog'
              +
              +
              +

              After:

              +
              class Pet(models.Model):
              +    __table_name__ = 'pet'
              +    owner_id = UUID(primary_key=True)
              +    pet_id = UUID(primary_key=True)
              +    pet_type = Text(discriminator_column=True)
              +    name = Text()
              +
              +class Cat(Pet):
              +    __discriminator_value__ = 'cat'
              +
              +class Dog(Pet):
              +    __discriminator_value__ = 'dog'
              +
              +
              +
              +
              +

              TimeUUID.from_datetime

              +

              This function is deprecated in favor of the core utility function uuid_from_time().

              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/dates_and_times.html b/3.25.4-scylla/dates_and_times.html new file mode 100644 index 0000000000..178a55ba97 --- /dev/null +++ b/3.25.4-scylla/dates_and_times.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Working with Dates and Times

              +

              This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

              +
              +

              timestamps (Cassandra DateType)

              +

              Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

              +
              +

              Write Path

              +

              When inserting timestamps, the driver handles serialization for the write path as follows:

              +

              If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

              +
                +
              • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

              • +
              • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

              • +
              +

              Note the second point above applies even to “local” times created using now():

              +
              >>> d = datetime.now()
              +
              +>>> print(d.tzinfo)
              +None
              +
              +
              +

              These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

              +

              If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

              +
              +
              +

              Read Path

              +

              The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

              +

              The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

              +
              import pytz
              +user_tz = pytz.timezone('US/Central')
              +timestamp_naive = row.ts
              +timestamp_utc = pytz.utc.localize(timestamp_naive)
              +timestamp_presented = timestamp_utc.astimezone(user_tz)
              +
              +
              +

              This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

              +
              +
              +
              +

              date, time (Cassandra DateType)

              +

              Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

              +
              +

              Write Path

              +

              For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

              +

              For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

              +
              +
              +

              Read Path

              +

              The driver always returns custom types for date and time.

              +

              The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

              +

              The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/execution_profiles.html b/3.25.4-scylla/execution_profiles.html new file mode 100644 index 0000000000..250591b252 --- /dev/null +++ b/3.25.4-scylla/execution_profiles.html @@ -0,0 +1,760 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Execution Profiles

              +

              Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

              +

              The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

              +

              An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

              +

              This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

              +
              +

              Mapping Legacy Parameters to Profiles

              +

              Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

              + +

              When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

              +
              +
              +

              Using Execution Profiles

              +
              +

              Default

              +
              from cassandra.cluster import Cluster
              +cluster = Cluster()
              +session = cluster.connect()
              +local_query = 'SELECT rpc_address FROM system.local'
              +for _ in cluster.metadata.all_hosts():
              +    print session.execute(local_query)[0]
              +
              +
              +
              Row(rpc_address='127.0.0.2')
              +Row(rpc_address='127.0.0.1')
              +
              +
              +

              The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

              +
              +
              +

              Initializing cluster with profiles

              +
              from cassandra.cluster import ExecutionProfile
              +from cassandra.policies import WhiteListRoundRobinPolicy
              +
              +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
              +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
              +
              +profiles = {'node1': node1_profile, 'node2': node2_profile}
              +session = Cluster(execution_profiles=profiles).connect()
              +for _ in cluster.metadata.all_hosts():
              +    print session.execute(local_query, execution_profile='node1')[0]
              +
              +
              +
              Row(rpc_address='127.0.0.1')
              +Row(rpc_address='127.0.0.1')
              +
              +
              +
              for _ in cluster.metadata.all_hosts():
              +    print session.execute(local_query, execution_profile='node2')[0]
              +
              +
              +
              Row(rpc_address='127.0.0.2')
              +Row(rpc_address='127.0.0.2')
              +
              +
              +
              for _ in cluster.metadata.all_hosts():
              +    print session.execute(local_query)[0]
              +
              +
              +
              Row(rpc_address='127.0.0.2')
              +Row(rpc_address='127.0.0.1')
              +
              +
              +

              Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

              +
              from cassandra.cluster import EXEC_PROFILE_DEFAULT
              +profile = ExecutionProfile(request_timeout=30)
              +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
              +
              +
              +
              +
              +

              Adding named profiles

              +

              New profiles can be added constructing from scratch, or deriving from default:

              +
              locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
              +node1_profile = 'node1_whitelist'
              +cluster.add_execution_profile(node1_profile, locked_execution)
              +
              +for _ in cluster.metadata.all_hosts():
              +    print session.execute(local_query, execution_profile=node1_profile)[0]
              +
              +
              +
              Row(rpc_address='127.0.0.1')
              +Row(rpc_address='127.0.0.1')
              +
              +
              +

              See Cluster.add_execution_profile() for details and optional parameters.

              +
              +
              +

              Passing a profile instance without mapping

              +

              We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

              +
              from cassandra.query import tuple_factory
              +
              +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
              +
              +print session.execute(local_query, execution_profile=tmp)[0]
              +print session.execute(local_query, execution_profile='node1')[0]
              +
              +
              +
              ('127.0.0.1',)
              +Row(rpc_address='127.0.0.1')
              +
              +
              +

              The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/faq.html b/3.25.4-scylla/faq.html new file mode 100644 index 0000000000..91bbbb0f51 --- /dev/null +++ b/3.25.4-scylla/faq.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Frequently Asked Questions

              +

              See also cqlengine FAQ

              +
              +

              Why do connections or IO operations timeout in my WSGI application?

              +

              Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

              +

              To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

              +
              from flask import Flask
              +from uwsgidecorators import postfork
              +from cassandra.cluster import Cluster
              +
              +session = None
              +prepared = None
              +
              +@postfork
              +def connect():
              +    global session, prepared
              +    session = Cluster().connect()
              +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
              +
              +app = Flask(__name__)
              +
              +@app.route('/')
              +def server_version():
              +    row = session.execute(prepared, ('local',))[0]
              +    return row.release_version
              +
              +
              +

              uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

              +
              +
              +

              How do I trace a request?

              +

              Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

              +
              >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
              +>>> result = future.result()
              +>>> trace = future.get_query_trace()
              +>>> for e in trace.events:
              +>>>     print e.source_elapsed, e.description
              +
              +0:00:00.000077 Parsing select * from system.local
              +0:00:00.000153 Preparing statement
              +0:00:00.000309 Computing ranges to query
              +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
              +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
              +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
              +0:00:00.000669 Read 1 live and 0 tombstone cells
              +0:00:00.000755 Scanned 1 rows and matched 1
              +
              +
              +

              trace is a QueryTrace object.

              +
              +
              +

              How do I determine the replicas for a query?

              +

              With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

              +
              >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
              +>>> bound = prepared.bind((1,))
              +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
              +>>> for h in replicas:
              +>>>   print h.address
              +127.0.0.1
              +127.0.0.2
              +
              +
              +

              replicas is a list of Host objects.

              +
              +
              +

              How does the driver manage request retries?

              +

              By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

              +

              Retries are presently attempted on the same coordinator, but this may change in the future.

              +

              Please see policies.RetryPolicy for further details.

              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/getting_started.html b/3.25.4-scylla/getting_started.html new file mode 100644 index 0000000000..b40e0bac91 --- /dev/null +++ b/3.25.4-scylla/getting_started.html @@ -0,0 +1,1107 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Getting Started

              +

              First, make sure you have the driver properly installed.

              +
              +

              Connecting to a Cluster

              +

              Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

              +

              First, make sure you have the Cassandra driver properly installed.

              +
              +

              Connecting to Cassandra

              +

              The simplest way to create a Cluster is like this:

              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster()
              +
              +
              +

              This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
              +
              +
              +

              The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

              +

              If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

              +
              from cassandra.cluster import Cluster
              +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
              +
              +
              +

              Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

              +
              cluster = Cluster()
              +session = cluster.connect()
              +
              +
              +
              +
              +
              +

              Session Keyspace

              +

              The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

              +
              cluster = Cluster()
              +session = cluster.connect('mykeyspace')
              +
              +
              +

              You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

              +
              session.set_keyspace('users')
              +# or you can do this instead
              +session.execute('USE users')
              +
              +
              +
              +
              +

              Execution Profiles

              +

              Profiles are passed in by execution_profiles dict.

              +

              In this case we can construct the base ExecutionProfile passing all attributes:

              +
              from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
              +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
              +from cassandra.query import tuple_factory
              +
              +profile = ExecutionProfile(
              +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
              +    retry_policy=DowngradingConsistencyRetryPolicy(),
              +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
              +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
              +    request_timeout=15,
              +    row_factory=tuple_factory
              +)
              +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
              +session = cluster.connect()
              +
              +print(session.execute("SELECT release_version FROM system.local").one())
              +
              +
              +

              Users are free to setup additional profiles to be used by name:

              +
              profile_long = ExecutionProfile(request_timeout=30)
              +cluster = Cluster(execution_profiles={'long': profile_long})
              +session = cluster.connect()
              +session.execute(statement, execution_profile='long')
              +
              +
              +

              Also, parameters passed to Session.execute or attached to Statements are still honored as before.

              +
              +
              +

              Executing Queries

              +

              Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

              +
              rows = session.execute('SELECT name, age, email FROM users')
              +for user_row in rows:
              +    print user_row.name, user_row.age, user_row.email
              +
              +
              +

              This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

              +

              By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

              +
              rows = session.execute('SELECT name, age, email FROM users')
              +for row in rows:
              +    print row.name, row.age, row.email
              +
              +
              +
              rows = session.execute('SELECT name, age, email FROM users')
              +for (name, age, email) in rows:
              +    print name, age, email
              +
              +
              +
              rows = session.execute('SELECT name, age, email FROM users')
              +for row in rows:
              +    print row[0], row[1], row[2]
              +
              +
              +

              If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

              +

              As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

              +
              +
              +

              Prepared Statements

              +

              Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

              +

              To prepare a query, use Session.prepare():

              +
              user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
              +
              +users = []
              +for user_id in user_ids_to_query:
              +    user = session.execute(user_lookup_stmt, [user_id])
              +    users.append(user)
              +
              +
              +

              prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

              +

              Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

              +
              +
              +

              Passing Parameters to CQL Queries

              +

              Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

              +

              Positional parameters are used with a %s placeholder. For example, +when you execute:

              +
              session.execute(
              +    """
              +    INSERT INTO users (name, credits, user_id)
              +    VALUES (%s, %s, %s)
              +    """,
              +    ("John O'Reilly", 42, uuid.uuid1())
              +)
              +
              +
              +

              It is translated to the following CQL query:

              +
              INSERT INTO users (name, credits, user_id)
              +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
              +
              +
              +

              Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

              +
              session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
              +
              +
              +

              Instead, use %s for the age placeholder.

              +

              If you need to use a literal % character, use %%.

              +

              Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

              +
              session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
              +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
              +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
              +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
              +
              +
              +

              Note that the second line is incorrect because in Python, single-element tuples +require a comma.

              +

              Named place-holders use the %(name)s form:

              +
              session.execute(
              +    """
              +    INSERT INTO users (name, credits, user_id, username)
              +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
              +    """,
              +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
              +)
              +
              +
              +

              Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

              +

              Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

              +
              +
              +

              Type Conversions

              +

              For non-prepared statements, Python types are cast to CQL literals in the +following way:

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

              Python Type

              CQL Literal Type

              None

              NULL

              bool

              boolean

              float

              +
              float
              +
              double
              +
              +
              +
              int
              +
              long
              +
              +
              +
              int
              +
              bigint
              +
              varint
              +
              smallint
              +
              tinyint
              +
              counter
              +
              +

              decimal.Decimal

              decimal

              +
              str
              +
              unicode
              +
              +
              +
              ascii
              +
              varchar
              +
              text
              +
              +
              +
              buffer
              +
              bytearray
              +
              +

              blob

              date

              date

              datetime

              timestamp

              time

              time

              +
              list
              +
              tuple
              +
              generator
              +
              +

              list

              +
              set
              +
              frozenset
              +
              +

              set

              +
              dict
              +
              OrderedDict
              +
              +

              map

              uuid.UUID

              +
              timeuuid
              +
              uuid
              +
              +
              +
              +
              +

              Asynchronous Queries

              +

              The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

              +

              The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

              +
              from cassandra import ReadTimeout
              +
              +query = "SELECT * FROM users WHERE user_id=%s"
              +future = session.execute_async(query, [user_id])
              +
              +# ... do some other work
              +
              +try:
              +    rows = future.result()
              +    user = rows[0]
              +    print user.name, user.age
              +except ReadTimeout:
              +    log.exception("Query timed out:")
              +
              +
              +

              This works well for executing many queries concurrently:

              +
              # build a list of futures
              +futures = []
              +query = "SELECT * FROM users WHERE user_id=%s"
              +for user_id in ids_to_fetch:
              +    futures.append(session.execute_async(query, [user_id])
              +
              +# wait for them to complete and use the results
              +for future in futures:
              +    rows = future.result()
              +    print rows[0].name
              +
              +
              +

              Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

              +
              def handle_success(rows):
              +    user = rows[0]
              +    try:
              +        process_user(user.name, user.age, user.id)
              +    except Exception:
              +        log.error("Failed to process user %s", user.id)
              +        # don't re-raise errors in the callback
              +
              +def handle_error(exception):
              +    log.error("Failed to fetch user info: %s", exception)
              +
              +
              +future = session.execute_async(query)
              +future.add_callbacks(handle_success, handle_error)
              +
              +
              +
              +
              There are a few important things to remember when working with callbacks:
                +
              • Exceptions that are raised inside the callback functions will be logged and then ignored.

              • +
              • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

              • +
              +
              +
              +
              +
              +

              Setting a Consistency Level

              +

              The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

              +

              By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

              +
              from cassandra import ConsistencyLevel
              +from cassandra.query import SimpleStatement
              +
              +query = SimpleStatement(
              +    "INSERT INTO users (name, age) VALUES (%s, %s)",
              +    consistency_level=ConsistencyLevel.QUORUM)
              +session.execute(query, ('John', 42))
              +
              +
              +
              +
              +

              Setting a Consistency Level with Prepared Statements

              +

              To specify a consistency level for prepared statements, you have two options.

              +

              The first is to set a default consistency level for every execution of the +prepared statement:

              +
              from cassandra import ConsistencyLevel
              +
              +cluster = Cluster()
              +session = cluster.connect("mykeyspace")
              +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
              +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
              +
              +# these will both use QUORUM
              +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
              +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
              +
              +
              +

              The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

              +
              # override the QUORUM default
              +user3_lookup = user_lookup_stmt.bind([user_id3])
              +user3_lookup.consistency_level = ConsistencyLevel.ALL
              +user3 = session.execute(user3_lookup)
              +
              +
              +
              +
              +

              Speculative Execution

              +

              Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

              +

              To enable speculative execution:

              +
                +
              • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

              • +
              • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

              • +
              +

              Example:

              +
              from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
              +from cassandra.policies import ConstantSpeculativeExecutionPolicy
              +from cassandra.query import SimpleStatement
              +
              +# Configure the speculative execution policy
              +ep = ExecutionProfile(
              +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
              +)
              +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
              +session = cluster.connect()
              +
              +# Mark the query idempotent
              +query = SimpleStatement(
              +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
              +    is_idempotent=True
              +)
              +
              +# Execute. A new query will be sent to the server every 0.5 second
              +# until we receive a response, for a max number attempts of 10.
              +session.execute(query)
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/index.html b/3.25.4-scylla/index.html new file mode 100644 index 0000000000..7128da0e96 --- /dev/null +++ b/3.25.4-scylla/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Python Driver for Scylla and Apache Cassandra®

              +

              A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

              +

              The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8.

              +

              This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

              +

              Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

              +
              +

              Contents

              +
              +
              Installation

              How to install the driver.

              +
              +
              Getting Started

              A guide through the first steps of connecting to Scylla and executing queries

              +
              +
              Scylla Specific Features

              A list of feature available only on scylla-driver

              +
              +
              Execution Profiles

              An introduction to a more flexible way of configuring request execution

              +
              +
              Lightweight Transactions (Compare-and-set)

              Working with results of conditional requests

              +
              +
              Object Mapper

              Introduction to the integrated object mapper, cqlengine

              +
              +
              Performance Notes

              Tips for getting good performance.

              +
              +
              Paging Large Queries

              Notes on paging large query results

              +
              +
              Security

              An overview of the security features of the driver

              +
              +
              Upgrading

              A guide to upgrading versions of the driver

              +
              +
              User Defined Types

              Working with Scylla’s user-defined types (UDT)

              +
              +
              Working with Dates and Times

              Some discussion on the driver’s approach to working with timestamp, date, time types

              +
              +
              Scylla Cloud

              Connect to Scylla Cloud

              +
              +
              CHANGELOG

              Log of changes to the driver, organized by version.

              +
              +
              Frequently Asked Questions

              A collection of Frequently Asked Questions

              +
              +
              API Documentation

              The API documentation.

              +
              +
              +
              +
              +
              +
              +

              Getting Help

              +

              Visit the FAQ section in this documentation.

              +

              Please send questions to the Scylla user list.

              +
              +
              +

              Reporting Issues

              +

              Please report any bugs and make any feature requests on the Github project issues

              +
              + +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/installation.html b/3.25.4-scylla/installation.html new file mode 100644 index 0000000000..19dafcc0c3 --- /dev/null +++ b/3.25.4-scylla/installation.html @@ -0,0 +1,859 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Installation

              +
              +

              Supported Platforms

              +

              Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

              +

              Linux, OSX, and Windows are supported.

              +
              +
              +

              Installation through pip

              +

              pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

              +
              pip install scylla-driver
              +
              +
              +

              You can use pip install --pre scylla-driver if you need to install a beta version.

              +

              *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

              +
              +
              +

              Verifying your Installation

              +

              To check if the installation was successful, you can run:

              +
              python -c 'import cassandra; print cassandra.__version__'
              +
              +
              +

              It should print something like “3.22.0”.

              +
              +
              +

              (Optional) Graph

              +

              The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

              +
              pip install scylla-driver[graph]
              +
              +
              +
              +
              +

              (Optional) Compression Support

              +

              Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

              +

              For lz4 support:

              +
              pip install lz4
              +
              +
              +

              For snappy support:

              +
              pip install python-snappy
              +
              +
              +

              (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

              +
              +
              +

              (Optional) Metrics Support

              +

              The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

              +
              pip install scales
              +
              +
              +
              +

              Speeding Up Installation

              +

              By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

              +

              In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

              +
              $ # installing from source
              +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
              +$ # installing from pip
              +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
              +
              +
              +
              +
              +

              OSX Installation Error

              +

              If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

              +
              clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
              +
              +
              +

              To fix this, re-run the installation with an extra compilation flag:

              +
              ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
              +
              +
              +
              +
              +
              +

              Windows Installation Notes

              +

              Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

              +

              Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

              +

              It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

              +
              +
              +

              Manual Installation

              +

              You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

              +

              Once the dependencies are installed, simply run:

              +
              python setup.py install
              +
              +
              +
              +
              +

              (Optional) Non-python Dependencies

              +

              The driver has several optional features that have non-Python dependencies.

              +
              +

              C Extensions

              +

              By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

              +

              When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

              +

              To compile the extensions, ensure that GCC and the Python headers are available.

              +

              On Ubuntu and Debian, this can be accomplished by running:

              +
              $ sudo apt-get install gcc python-dev
              +
              +
              +

              On RedHat and RedHat-based systems like CentOS and Fedora:

              +
              $ sudo yum install gcc python-devel
              +
              +
              +

              On OS X, homebrew installations of Python should provide the necessary headers.

              +

              See Windows Installation Notes for notes on configuring the build environment on Windows.

              +
              +

              Cython-based Extensions

              +

              By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

              +

              This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

              +
              python setup.py install --no-cython
              +
              +
              +

              Alternatively, an environment variable can be used to switch this option regardless of +context:

              +
              CASS_DRIVER_NO_CYTHON=1 <your script here>
              +- or, to disable all extensions:
              +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
              +
              +
              +

              This method is required when using pip, which provides no other way of injecting user options in a single command:

              +
              CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
              +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
              +
              +
              +

              The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

              +

              If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

              +
              sudo pip install six futures
              +sudo pip install --install-option="--no-cython"
              +
              +
              +
              +
              +
              +

              libev support

              +

              The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

              +

              If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

              +
              $ sudo apt-get install libev4 libev-dev
              +
              +
              +

              On RHEL/CentOS/Fedora:

              +
              $ sudo yum install libev libev-devel
              +
              +
              +

              If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

              +
              $ brew install libev
              +
              +
              +

              The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

              +

              If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

              +
              >>> from cassandra.io.libevreactor import LibevConnection
              +>>> from cassandra.cluster import Cluster
              +
              +>>> cluster = Cluster()
              +>>> cluster.connection_class = LibevConnection
              +>>> session = cluster.connect()
              +
              +
              +
              +
              +
              +

              (Optional) Configuring SSL

              +

              Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/lwt.html b/3.25.4-scylla/lwt.html new file mode 100644 index 0000000000..8fa4d14aee --- /dev/null +++ b/3.25.4-scylla/lwt.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Lightweight Transactions (Compare-and-set)

              +

              Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

              +

              For pertinent execution parameters, see Statement.serial_consistency_level.

              +

              This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

              +
              +

              Specialized Results

              +

              The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

              +

              The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

              +
                +
              • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

              • +
              • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

              • +
              • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

              • +
              +

              How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

              +
              CREATE TABLE test.t (
              +    k int PRIMARY KEY,
              +    v int,
              +    x int
              +)
              +
              +
              +

              … the following sections show the expected result for a number of example statements, using the three base row factories.

              +
              +

              named_tuple_factory (default)

              +

              The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

              +
              >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
              +Row(applied=True)
              +
              +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
              +Row(applied=False, k=0, v=0, x=None)
              +
              +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
              +Row(applied=True)
              +
              +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
              +Row(applied=False, v=1, x=2)
              +
              +
              +
              +
              +

              tuple_factory

              +

              This return type does not refer to names, but the boolean value applied is always present in position 0:

              +
              >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
              +(True,)
              +
              +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
              +(False, 0, 0, None)
              +
              +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
              +(True,)
              +
              +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
              +(False, 1, 2)
              +
              +
              +
              +
              +

              dict_factory

              +

              The retuned dict contains the [applied] key:

              +
              >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
              +{u'[applied]': True}
              +
              +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
              +{u'x': 2, u'[applied]': False, u'v': 1}
              +
              +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
              +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
              +
              +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
              +{u'[applied]': True}
              +
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/object_mapper.html b/3.25.4-scylla/object_mapper.html new file mode 100644 index 0000000000..11e25c10a8 --- /dev/null +++ b/3.25.4-scylla/object_mapper.html @@ -0,0 +1,716 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Object Mapper

              +

              cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

              +

              Jump to Getting Started

              +
              +

              Contents

              +
              +
              Upgrade Guide

              For migrating projects from legacy cqlengine, to the integrated product

              +
              +
              Models

              Examples defining models, and mapping them to tables

              +
              +
              Making Queries

              Overview of query sets and filtering

              +
              +
              Batch Queries

              Working with batch mutations

              +
              +
              Connections

              Working with multiple sessions

              +
              +
              API Documentation

              Index of API documentation

              +
              +
              Third party integrations

              High-level examples in Celery and uWSGI

              +
              +
              +

              Frequently Asked Questions

              +
              +
              +
              +
              +

              Getting Started

              +
              import uuid
              +from cassandra.cqlengine import columns
              +from cassandra.cqlengine import connection
              +from datetime import datetime
              +from cassandra.cqlengine.management import sync_table
              +from cassandra.cqlengine.models import Model
              +
              +#first, define a model
              +class ExampleModel(Model):
              +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
              +    example_type    = columns.Integer(index=True)
              +    created_at      = columns.DateTime()
              +    description     = columns.Text(required=False)
              +
              +#next, setup the connection to your cassandra server(s)...
              +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
              +# the list of hosts will be passed to create a Cluster() instance
              +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
              +
              +#...and create your CQL table
              +>>> sync_table(ExampleModel)
              +
              +#now we can create some rows:
              +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
              +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
              +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
              +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
              +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
              +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
              +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
              +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
              +
              +#and now we can run some queries against our table
              +>>> ExampleModel.objects.count()
              +8
              +>>> q = ExampleModel.objects(example_type=1)
              +>>> q.count()
              +4
              +>>> for instance in q:
              +>>>     print instance.description
              +example5
              +example6
              +example7
              +example8
              +
              +#here we are applying additional filtering to an existing query
              +#query objects are immutable, so calling filter returns a new
              +#query object
              +>>> q2 = q.filter(example_id=em5.example_id)
              +
              +>>> q2.count()
              +1
              +>>> for instance in q2:
              +>>>     print instance.description
              +example5
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/objects.inv b/3.25.4-scylla/objects.inv new file mode 100644 index 0000000000..07291f6607 Binary files /dev/null and b/3.25.4-scylla/objects.inv differ diff --git a/3.25.4-scylla/performance.html b/3.25.4-scylla/performance.html new file mode 100644 index 0000000000..9fb6a24160 --- /dev/null +++ b/3.25.4-scylla/performance.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Performance Notes

              +

              The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

              +

              Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

              +

              The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

              +

              Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

              +
              +

              PyPy

              +

              PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

              +
              +
              +

              Cython Extensions

              +

              Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

              +

              See Installation for details on controlling this build.

              +
              +
              +

              multiprocessing

              +

              All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

              +

              Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

              +

              For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/py-modindex.html b/3.25.4-scylla/py-modindex.html new file mode 100644 index 0000000000..b5a2b7e2f9 --- /dev/null +++ b/3.25.4-scylla/py-modindex.html @@ -0,0 +1,601 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + + + +
              + + + + + +
              + + +
              +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/query_paging.html b/3.25.4-scylla/query_paging.html new file mode 100644 index 0000000000..9e4e1277b2 --- /dev/null +++ b/3.25.4-scylla/query_paging.html @@ -0,0 +1,724 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Paging Large Queries

              +

              Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

              +
              +

              Controlling the Page Size

              +

              By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

              +
              +
              +

              Handling Paged Results

              +

              Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

              +
              from cassandra.query import SimpleStatement
              +query = "SELECT * FROM users"  # users contains 100 rows
              +statement = SimpleStatement(query, fetch_size=10)
              +for user_row in session.execute(statement):
              +    process_user(user_row)
              +
              +
              +

              Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

              +

              If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

              +
              +
              +

              Handling Paged Results with Callbacks

              +

              If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

              +

              Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

              +
              class PagedResultHandler(object):
              +
              +    def __init__(self, future):
              +        self.error = None
              +        self.finished_event = Event()
              +        self.future = future
              +        self.future.add_callbacks(
              +            callback=self.handle_page,
              +            errback=self.handle_err)
              +
              +    def handle_page(self, rows):
              +        for row in rows:
              +            process_row(row)
              +
              +        if self.future.has_more_pages:
              +            self.future.start_fetching_next_page()
              +        else:
              +            self.finished_event.set()
              +
              +    def handle_error(self, exc):
              +        self.error = exc
              +        self.finished_event.set()
              +
              +future = session.execute_async("SELECT * FROM users")
              +handler = PagedResultHandler(future)
              +handler.finished_event.wait()
              +if handler.error:
              +    raise handler.error
              +
              +
              +
              +
              +

              Resume Paged Results

              +

              You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

              +
              from cassandra.query import SimpleStatement
              +query = "SELECT * FROM users"
              +statement = SimpleStatement(query, fetch_size=10)
              +results = session.execute(statement)
              +
              +# save the paging_state somewhere and return current results
              +web_session['paging_state'] = results.paging_state
              +
              +
              +# resume the pagination sometime later...
              +statement = SimpleStatement(query, fetch_size=10)
              +ps = web_session['paging_state']
              +results = session.execute(statement, paging_state=ps)
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/scylla_cloud.html b/3.25.4-scylla/scylla_cloud.html new file mode 100644 index 0000000000..17cb44a8be --- /dev/null +++ b/3.25.4-scylla/scylla_cloud.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + Scylla Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Cloud

              +

              To connect to a Scylla Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/scylla_specific.html b/3.25.4-scylla/scylla_specific.html new file mode 100644 index 0000000000..4cb3bfe483 --- /dev/null +++ b/3.25.4-scylla/scylla_specific.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Specific Features

              +
              +

              Shard Awareness

              +

              scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

              +

              Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/design-notes/protocol-extensions.md#intranode-sharding

              +

              For using it you only need to enable TokenAwarePolicy on the Cluster

              +

              See the configuration of native_shard_aware_transport_port and native_shard_aware_transport_port_ssl on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/design-notes/protocols.md#cql-client-protocol

              +
              from cassandra.cluster import Cluster
              +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
              +
              +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
              +
              +
              +
              +
              +

              New Cluster Helpers

              +
                +
              • shard_aware_options

                +

                Setting it to dict(disable=True) would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections

                +

                Other option is to configure scylla by setting enable_shard_aware_drivers: false on scylla.yaml.

                +
              • +
              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster(shard_aware_options=dict(disable=True))
              +session = cluster.connect()
              +
              +assert not cluster.is_shard_aware(), "Shard aware should be disabled"
              +
              +# or just disable the shard aware port logic
              +cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True))
              +session = cluster.connect()
              +
              +
              +
                +
              • cluster.is_shard_aware()

                +

                New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

                +
              • +
              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster()
              +session = cluster.connect()
              +
              +if cluster.is_shard_aware():
              +    print("connected to a scylla cluster")
              +
              +
              +
                +
              • cluster.shard_aware_stats()

                +

                New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

                +
              • +
              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster()
              +session = cluster.connect()
              +
              +stats = cluster.shard_aware_stats()
              +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
              +    print("successfully connected to all shards of all scylla nodes")
              +
              +
              +
              +
              +

              New Table Attributes

              +
                +
              • in_memory flag

                +

                New flag available on TableMetadata.options to indicate that it is an In Memory table

                +
              • +
              +
              +

              Note

              +

              in memory tables is a feature existing only in Scylla Enterprise

              +
              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster()
              +session = cluster.connect()
              +session.execute("""
              +    CREATE KEYSPACE IF NOT EXISTS keyspace1
              +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
              +""")
              +
              +session.execute("""
              +    CREATE TABLE IF NOT EXISTS keyspace1.standard1 (
              +        key blob PRIMARY KEY,
              +        "C0" blob
              +    ) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'}
              +""")
              +
              +cluster.refresh_table_metadata("keyspace1", "standard1")
              +assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True
              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/search.html b/3.25.4-scylla/search.html new file mode 100644 index 0000000000..408a10da04 --- /dev/null +++ b/3.25.4-scylla/search.html @@ -0,0 +1,604 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + + + + + +
              + + + + + +
              + + +
              +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/searchindex.js b/3.25.4-scylla/searchindex.js new file mode 100644 index 0000000000..15d7ba586e --- /dev/null +++ b/3.25.4-scylla/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third_party", "cqlengine/upgrade_guide", "dates_and_times", "execution_profiles", "faq", "getting_started", "index", "installation", "lwt", "object_mapper", "performance", "query_paging", "scylla_cloud", "scylla_specific", "security", "upgrading", "user_defined_types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third_party.rst", "cqlengine/upgrade_guide.rst", "dates_and_times.rst", "execution_profiles.rst", "faq.rst", "getting_started.rst", "index.rst", "installation.rst", "lwt.rst", "object_mapper.rst", "performance.rst", "query_paging.rst", "scylla_cloud.rst", "scylla_specific.rst", "security.rst", "upgrading.rst", "user_defined_types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "Scylla Cloud", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"march": 0, "2021": 0, "ensur": [0, 3, 4, 9, 27, 39, 46, 53], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 55], "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55], "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 53, 54, 55], "invalid": [0, 1, 26, 30], "peer": [0, 5, 25], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54], "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 53], "system": [0, 5, 25, 38, 42, 43, 44, 46, 54], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 53, 54, 55], "1260": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 53, 54], "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 52], "v5": [0, 1], "checksum": 0, "1258": 0, "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 53], "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 54], "mechan": [0, 2, 3, 27, 53], "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 52, 53, 55], "astra": 0, "1265": 0, "asyncor": [0, 33, 46], "race": 0, "condit": [0, 1, 3, 8, 10, 30, 45], "caus": [0, 3, 10, 26, 37, 47], "log": [0, 3, 8, 27, 30, 31, 44, 45, 54], "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53], "shutdown": [0, 3, 39], "1266": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 54], "reserv": 0, "keyword": [0, 3, 6, 7, 9, 10], "1269": 0, "drop": [0, 6, 8, 29], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 52, 53, 54, 55], "1220": 0, "secur": [0, 45, 54], "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 53, 54], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 54, 55], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53], "protocol_tl": [0, 53], "1264": 0, "june": 0, "2020": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 53, 54], "geomet": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 52, 53, 54, 55], "depend": [0, 2, 41, 43, 47, 49], "runtim": [0, 46, 49], "1237": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 54, 55], "use_default_tempdir": 0, "cloud": [0, 3, 27, 45], "config": [0, 53], "1245": 0, "tcp": 0, "flow": 0, "control": [0, 3, 4, 27, 30, 40, 49, 53], "libevreactor": [0, 3, 33, 46], "1248": 0, "unabl": [0, 27, 46], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 46, 48, 49, 51, 53, 55], "ubuntu": [0, 46], "04": 0, "1238": 0, "plaintextauthprovid": [0, 2, 3, 33, 53, 54], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "unicod": [0, 17, 44], "char": 0, "python3": 0, "1241": 0, "graph": [0, 3], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 52, 55], "profil": [0, 3, 4, 12, 14, 45], "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 53], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 52, 53, 54], "local_quorum": [0, 1, 44], "1240": 0, "t": [0, 9, 10, 15, 31, 37, 38, 41, 43, 44, 47, 49, 53, 54, 55], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 52, 54, 55], "boolean": [0, 1, 6, 25, 27, 44, 47], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 55], "fluent": [0, 33, 46, 54], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 53], "1239": 0, "elementmap": 0, "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 52, 55], "deseri": [0, 15, 18, 33, 41], "1233": 0, "bump": 0, "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 54, 55], "1243": 0, "gremlinpython": [0, 46], "1212": 0, "improv": [0, 1, 35, 49, 54], "core": [0, 3, 4, 38, 40, 46, 49], "1244": 0, "april": 0, "transient": 0, "replic": [0, 3, 8, 25, 40, 52], "1207": 0, "peers_v2": 0, "port": [0, 3, 5, 25, 44, 52], "discoveri": 0, "c": [0, 6, 12, 25, 27, 38, 53], "700": 0, "1228": 0, "februari": 0, "26": [0, 38], "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 52, 53, 54], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 52, 53, 54], "resultset": [0, 3, 33, 50, 54], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 53, 54, 55], "schema": [0, 3, 9, 30, 33, 37, 44, 54], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 52, 53, 54], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 54, 55], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 52, 54, 55], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "788": 0, "nativ": [0, 1, 15, 18, 29, 37, 45], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 54, 55], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 52], "1027": 0, "enabl": [0, 3, 10, 44, 52, 53, 54], "page": [0, 1, 3, 45, 51], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 54, 55], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 53, 54], "numer": [0, 41], "wrapper": [0, 27, 30], "proper": [0, 39, 46], "definit": [0, 3, 6, 15, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 53], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "1057": 0, "bulkset": 0, "1060": 0, "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 55], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 53, 54], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 52, 53, 54, 55], "classic": 0, "1090": 0, "1039": 0, "expos": [0, 31, 54], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 15, 25, 26, 30, 32, 38, 45, 54], "1019": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "more": [0, 3, 4, 6, 9, 10, 15, 25, 27, 29, 31, 38, 40, 42, 44, 45, 49, 50, 53, 54], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 53], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 52, 53, 54], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 54, 55], "1205": 0, "januari": 0, "unifi": [0, 54], "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 54], "packag": [0, 2, 32, 41, 46, 48, 53, 54], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 52, 53, 54, 55], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 53], "twist": [0, 33, 44], "1161": 0, "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "1048": 0, "flexibl": [0, 45], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 54], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 55], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 53, 55], "mismatch": 0, "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "re": [0, 27, 30, 37, 38, 39, 44, 46, 53, 55], "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 54], "cqlengineexcept": [0, 40], "1166": 0, "asyncio": [0, 33], "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "process": [0, 3, 4, 20, 43, 44, 46, 49, 52, 53, 54], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 54], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 52, 53], "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "1181": 0, "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 53], "certif": [0, 53], "hostnam": [0, 27, 53], "sslcontext": [0, 53], "check_hostnam": [0, 53], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 55], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 54], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 53], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 53, 54, 55], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 53, 54, 55], "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 53], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "warn": [0, 1, 3, 31, 40, 54], "about": [0, 3, 25, 30, 37, 41, 44, 46, 53, 54], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 52, 53, 54], "balanc": [0, 3, 33, 42, 54], "polici": [0, 3, 33, 42, 43, 44, 52, 54], "1177": 0, "1122": 0, "publish": [0, 46, 53], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 54], "next": [0, 3, 21, 27, 42, 48, 50, 53], "major": [0, 27, 42, 53, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 53, 54], "defaultloadbalancingpolici": [0, 27, 54], "integr": [0, 29, 40, 41, 45, 46, 48, 54], "1047": 0, "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 52, 53, 54], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 52, 53, 54, 55], "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 54], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 53], "unknown": [0, 15, 18, 46, 54], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 53, 55], "819": 0, "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 53, 55], "773": 0, "authprovid": [0, 2, 3, 33, 53], "transit": 0, "mode": 0, "831": 0, "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 53], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 54], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45, 52], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 54], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 53], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 53], "574": 0, "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 52, 54], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 54], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 53], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 52], "avail": [0, 3, 10, 30, 38, 45, 46, 52, 54], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 46, 47, 48, 49, 50, 52, 53, 55], "runtimeerror": 0, "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 54], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 53, 55], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 52, 53], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 53, 54], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 53, 54], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 54], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 53, 54], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 54], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 54, 55], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 52, 53, 54], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "unexpectedli": 0, "709": 0, "socket": [0, 5, 53], "associ": [0, 3, 54], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46], "clean": [0, 39, 46, 54], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 53, 54], "673": 0, "fqdn": [0, 53], "ip": [0, 3, 5, 27, 28, 44, 53], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 53, 54, 55], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 55], "empti": [0, 2, 3, 25, 47], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "around": [0, 9, 32, 40, 41, 54], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 53, 54], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 55], "789": 0, "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 53, 54, 55], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 53], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 53, 54], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 53, 54, 55], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 53], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 54], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 46, 48, 53, 54], "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 53], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 52], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44], "1009": 0, "deadlock": [0, 4], "heartbeat": 0, "whilst": 0, "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 53, 54], "flight": [0, 5], "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 54], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 53], "1044": 0, "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 52, 53, 54], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 54], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 54], "1023": 0, "param": [0, 4, 13], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 15, 27, 33, 43, 46, 52], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 55], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 53, 54], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 55], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 54], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 54, 55], "1093": 0, "incorrect": [0, 44], "compact": [0, 9, 52], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 53], "1117": 0, "built": [0, 32, 42, 46, 49, 54], "sourc": [0, 3, 15, 18, 45, 46], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 52, 54], "doesn": [0, 31, 54], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45, 52], "1127": 0, "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 53, 55], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 53], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41], "1079": 0, "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 53], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 53, 54], "1082": 0, "let": [0, 3, 54], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 53, 54], "sortedset": [0, 32, 33, 54], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 54], "1068": 0, "ssl_context": [0, 3, 44, 53], "995": 0, "encrypt": [0, 53], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 15, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 52, 53, 55], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 54, 55], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 54, 55], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 53], "releas": [0, 9, 27, 40, 42, 53, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 53, 54, 55], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 54], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 53], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 52, 53, 54], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 52, 54], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 53, 55], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 53, 54], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 54], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 54], "1015": 0, "septemb": 0, "logic": [0, 37, 52], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 52, 54], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 53], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 53, 54], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 53, 54], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 53], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 53], "loop": [0, 3, 4, 21, 33, 44, 46, 53], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 53, 54], "subclass": [0, 1, 2, 3, 27, 30, 37, 53], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 54], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 53, 54], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 53, 54, 55], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 54], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 52], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 54], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 52, 53], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 53, 54], "cassandra_vers": 0, "910": 0, "refactor": [0, 41], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 53, 54, 55], "kind": [0, 27, 54], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 54, 55], "915": 0, "authent": [0, 1, 3, 33], "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 55], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 53, 55], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 55], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 54, 55], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 55], "865": 0, "deprecationwarn": [0, 54], "846": 0, "example_mapp": 0, "py": [0, 46], "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 53, 54], "execute_concurr": [0, 4, 33, 49], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 53], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 53], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 54], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 54], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 54, 55], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 54], "810": 0, "833": 0, "juli": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 53, 54], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46, 52], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 54], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 53], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 53], "772": 0, "pool": [0, 1, 3, 33, 54], "739": 0, "murmur3": [0, 3, 46], "big": [0, 52], "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 54], "785": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 53], "464": 0, "inupt": 0, "microsecond": [0, 31, 54], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "pr": 0, "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 52, 55], "705": 0, "get_query_trac": [0, 3, 43, 54], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 54], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44], "drain": 0, "734": 0, "resulset": 0, "trace": [0, 3, 33], "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 52, 54], "grow": 0, "720": 0, "size": [0, 3, 10, 54], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 52, 53, 54, 55], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 53], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "callback": [0, 3, 10, 44, 49, 53], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 54], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 52, 53], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 54], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 52], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 54], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 54], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 54], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 54], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 54], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 53, 54, 55], "lead": [0, 34, 49, 54], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 54, 55], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 53, 54], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 53, 54], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47, 52], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 53], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 54], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 54], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 55], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 54], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 54], "stat": [0, 26, 52], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 52, 54], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 53, 54], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 53, 54], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 54], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "alias": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 54], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 52], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "569": 0, "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 53], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 54, 55], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "compat": [0, 3, 18, 25, 33, 54], "434": 0, "unicodedecodeerror": 0, "bop": 0, "559": 0, "565": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 53, 54, 55], "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 52], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46, 52], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 54], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 53, 54], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 53, 54], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 53, 54], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 54], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 54, 55], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 53], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 54], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 53], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 52, 54], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 54], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 54], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 52, 53], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 52], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53], "489": 0, "typo": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": [0, 52], "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 54, 55], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 54], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55], "might": [0, 3, 30, 50, 53], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 53, 55], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 52, 53, 54], "access": [0, 3, 9, 26, 30, 37, 44, 54], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 53, 54], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 53, 54, 55], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 53, 54], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28], "dc": [0, 3, 27, 54], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 54], "408": [0, 54], "400": [0, 54], "422": [0, 54], "292": [0, 54], "318": [0, 54], "368": [0, 54], "371": 0, "blist": 0, "soft": 0, "385": [0, 54], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44], "178": [0, 30, 54], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "well": [0, 27, 35, 44, 53], "pagedresult": [0, 50, 54], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "397": 0, "398": 0, "extens": [0, 3, 27, 41, 52], "file": [0, 40, 49, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 55], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 54], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 54], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 54], "round": [0, 27, 32], "341": 0, "sizeti": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55], "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 54], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 53], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 54], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 53], "patch": [0, 21, 22, 41, 53], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 53], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 54], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 54], "243": 0, "kerbero": [0, 53], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 54], "192": [0, 3, 44], "stream": [0, 29], "set_keyspac": [0, 3, 27, 44, 55], "195": 0, "implicit": [0, 10, 54], "204": 0, "collis": 0, "sasl": [0, 2, 53], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 54], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 54], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 54], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27], "contact_point": [0, 3, 7, 27, 53], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 54], "88": 0, "constructor": [0, 3, 6, 38], "basi": [0, 54], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 52], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 52, 53, 54], "use_client_timestamp": [0, 1, 3, 54], "overrid": [0, 3, 9, 15, 18, 42, 44, 54], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 52, 55], "refer": [0, 10, 34, 40, 42, 47, 54], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 54], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 54], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 53, 54, 55], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 54], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 53, 54, 55], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 53], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 53, 54, 55], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 53, 54], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 52], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 54], "help": [0, 38, 54], "done": [0, 3, 37, 41, 43, 53, 54], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 53, 54], "guarante": [0, 27, 30, 54], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 54, 55], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 53], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 52, 53, 54, 55], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 53, 54, 55], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 54], "left": [0, 3, 4, 9, 41, 54], "place": [0, 40, 44, 54], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 54], "dict_factori": [0, 3, 7, 16, 30, 33, 54], "ordered_dict_factori": [0, 3, 16, 30, 33, 54], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 53, 54, 55], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 54], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 54], "executor": 0, "becom": [0, 3, 8, 49, 54], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 53, 54], "lowercas": 0, "liter": [0, 15, 17, 18, 30, 41, 44, 54, 55], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 54], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 54, 55], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 53, 54], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 52, 53, 54], "never": [0, 27, 34, 47, 49, 54], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 52, 54], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": [0, 54], "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 53, 54], "main": [0, 3, 53, 55], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 49, 52, 53, 54], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 53, 54], "strong": 0, "garbag": [0, 54], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 54], "twice": 0, "had": [0, 40, 54], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 55], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 52], "parallel": 0, "sesssion": 0, "effort": [0, 40, 53], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 53], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 54], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 53], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 52], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 53], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 53], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 54, 55], "constant": [0, 53], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 54], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 53, 54], "ONE": [1, 3, 10, 40, 54], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 55], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 55], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 52, 53, 55], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 52, 55], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 54, 55], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 55], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 53], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 54], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27, 52], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 52], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 54], "higher": [1, 3, 4, 30, 53, 54], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 54], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 53], "author": [1, 53], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 54], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 53], "usernam": [2, 44, 53], "password": [2, 53], "passwordauthent": [2, 53], "auth_provid": [2, 3, 53], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 53], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 52, 53, 54, 55], "servic": [2, 53], "someth": [2, 27, 37, 38, 46, 53], "qop": [2, 53], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 53], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 53], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "mutabl": 3, "load_balancing_polici": [3, 27, 42, 44, 52], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 52, 53, 54], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 53], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 53, 55], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 53, 54], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50, 52], "purpos": [3, 6], "register_user_typ": [3, 54, 55], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 53, 54], "whose": 3, "mykeyspac": [3, 30, 44, 54, 55], "street": [3, 11, 37, 54, 55], "zipcod": [3, 11, 37, 54, 55], "locat": [3, 40, 53, 55], "def": [3, 27, 34, 37, 39, 43, 44, 50, 53, 54, 55], "self": [3, 15, 18, 37, 50, 54, 55], "INTO": [3, 4, 30, 44, 47, 55], "st": [3, 37, 55], "78723": [3, 55], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 55], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 54], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 54], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 53], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": [3, 52], "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 53], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 54], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 54], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 55], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "24": 3, "appropri": [3, 37, 46, 53], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 54], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 53], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 53], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 53, 54], "placehold": [3, 15, 18, 30, 44, 55], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 53], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 54], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 55], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 53], "expir": 3, "exceed": [3, 4], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 54], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 53], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 53, 54], "backward": [3, 18, 25, 54], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 53], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 54, 55], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 54], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 53], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 53], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 52], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 53], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 53], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 52], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 52], "www": 6, "com": [6, 10, 52, 53], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 52], "durable_writ": 8, "simplestrategi": [8, 25, 52], "caution": [8, 37], "product": [8, 48, 53, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 53, 54], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 52, 55], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 54], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 53], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 54], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 54], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 54], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 53], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 53], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 53], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 54], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 54], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "val": 15, "concis": 15, "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 54], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 53], "handle_fork": 20, "eventletconnect": [21, 33, 53], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 54], "twistedconnect": [24, 33, 53], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 54], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "replicationfactor": 25, "all_replica": 25, "transient_replica": 25, "options_map": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 53], "pmfstat": 26, "latenc": [26, 44, 52], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 53], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 52], "evenli": 27, "what": [27, 30, 37, 41, 53, 54, 55], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 53], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 53], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 52, 54], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 53, 54], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 53, 54], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 53], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 53], "silent": 27, "idea": 27, "best": [27, 44, 51, 53], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 53], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 53], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 54], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 53], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "23": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "asyncioreactor": 33, "eventletreactor": 33, "twistedreactor": [33, 53], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 53], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 52], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41, 54], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 53], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 53, 54], "presist": 37, "pattern": [37, 49], "joe": [37, 53], "99999": 37, "ll": [38, 53], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 53], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 54], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 52], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 54], "scylla": [38, 40, 46, 54], "21": [38, 54], "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "17": [38, 53], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45, 54], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 54], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 54], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 54], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": 42, "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 54, 55], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 53], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 55], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49, 52], "handle_success": 44, "rememb": 44, "user1": [44, 53], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "upgrad": [45, 48, 53], "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 54], "reinstal": 46, "22": 46, "abl": 46, "snappi": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 53], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": 46, "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 53], "mussei": [46, 53], "thorough": [46, 53], "outcom": 47, "pertin": 47, "appear": 47, "reject": 47, "statu": [47, 52], "squar": 47, "bracket": 47, "AND": [47, 52], "retun": 47, "jump": 48, "migrat": [48, 54], "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 53], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "p": 50, "onward": 52, "scylladb": 52, "md": 52, "intranod": 52, "native_shard_aware_transport_port": 52, "native_shard_aware_transport_port_ssl": 52, "shard_aware_opt": 52, "enable_shard_aware_driv": 52, "is_shard_awar": 52, "disable_shardaware_port": 52, "shard_aware_stat": 52, "shards_count": 52, "in_memori": 52, "enterpris": 52, "keyspace1": 52, "standard1": 52, "c0": 52, "inmemorycompactionstrategi": 52, "get_credenti": 53, "host_address": 53, "1234": 53, "wrap_socket": 53, "create_default_context": 53, "server_hostnam": 53, "keystor": 53, "intruct": 53, "cert": 53, "understand": 53, "demonstr": 53, "deploy": 53, "client_encryption_opt": 53, "keystore_password": 53, "mystorepass": 53, "require_client_auth": 53, "veri": 53, "verify_mod": 53, "cert_requir": 53, "load_verify_loc": 53, "rootca": 53, "crt": 53, "truststor": 53, "jk": 53, "truststore_password": 53, "pem": 53, "conf": 53, "gen_client_cert": 53, "eof": 53, "req": 53, "distinguished_nam": 53, "req_distinguished_nam": 53, "output_password": 53, "root_cert_pass": 53, "default_bit": 53, "2048": 53, "cert_countri": 53, "cert_org_nam": 53, "ou": 53, "cert_ou": 53, "cn": 53, "root": 53, "Then": 53, "openssl": 53, "newkei": 53, "rsa": 53, "keyout": 53, "csr": 53, "x509": 53, "root_ca_base_nam": 53, "cakei": 53, "passin": 53, "crt_sign": 53, "cert_valid": 53, "cacreateseri": 53, "load_cert_chain": 53, "certfil": 53, "keyfil": 53, "crypto": 53, "tlsv1_2_method": 53, "set_verifi": 53, "verify_p": 53, "lambda": 53, "_1": 53, "_2": 53, "_3": 53, "_4": 53, "use_certificate_fil": 53, "use_privatekey_fil": 53, "ca_cert": 53, "ssl_version": 53, "ssl_opt": 53, "my": 53, "cert_req": 53, "risen": 53, "advanc": 53, "dseplaintextauthprovid": 53, "act": 53, "permiss": 53, "grant": 53, "role": 53, "plain": 53, "authorization_id": 53, "ticket": 53, "kinit": 53, "offici": [53, 54], "fulli": 54, "benefit": 54, "dse_graph": 54, "swap": 54, "rework": 54, "mesh": 54, "afterward": 54, "got": 54, "row_list": 54, "first_result": 54, "variant": 54, "brought": 54, "overhaul": 54, "highlight": 54, "nomenclatur": 54, "keyspace_nam": 54, "031ebb0": 54, "refresh_": 54, "_metadata": 54, "419fcdf": 54, "submit_schema_refresh": 54, "574266d": 54, "cqltype": 54, "bb984ee": 54, "e16a073": 54, "cc94073": 54, "from_datetim": 54, "96489cc": 54, "a2d3a98": 54, "4bd5909": 54, "__polymorphic_": 54, "__discrimin": 54, "9d98c8e": 54, "79efe97": 54, "citi": 54, "zip": [54, 55], "though": 54, "notabl": 54, "simpler": 54, "unclean": 54, "tell": 55, "insert_stat": 55, "otherstuff": 55, "first_row": 55, "fine": 55, "unprepar": 55, "parameter": 55, "interpol": 55}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph": [[12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 3, 1, "", "ReplicationFactor"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 53, 54], "25": 0, "0": [0, 53, 54], "featur": [0, 29, 52, 54], "bug": 0, "fix": 0, "other": 0, "24": 0, "23": 0, "22": 0, "21": 0, "deprec": [0, 40, 54], "20": 0, "2": [0, 54], "1": [0, 54], "19": 0, "18": 0, "17": 0, "16": [0, 53], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 54], "x": [0, 54], "upgrad": [0, 40, 54], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 54], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 53, 54], "cluster": [3, 42, 44, 52, 54], "session": [3, 44, 54], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 54], "execut": [4, 34, 42, 44, 53, 54], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 54], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 54, 55], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 55], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38, 52], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 54], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 55], "user": [11, 37, 54, 55], "defin": [11, 37, 54, 55], "datastax": [12, 13, 14, 15, 33], "graph": [12, 13, 14, 15, 18, 33, 46, 54], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 54], "format": 16, "encod": [17, 54], "non": [17, 46, 54], "prepar": [17, 30, 44, 54], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 53], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 53], "metadata": [25, 54], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 53], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 53, 54], "custom": [29, 53, 54], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 54], "trace": [30, 43, 54], "timestamp": [31, 41, 54], "gener": [31, 34], "api": [33, 40, 54], "document": 33, "core": 33, "driver": [33, 43, 45, 54], "mapper": [33, 48], "us": [34, 42, 54, 55], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 55], "new": [35, 52], "chang": [35, 40, 54], "default": [35, 38, 42, 47, 54], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 54], "work": [36, 41, 54], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 54], "delet": 36, "individu": 36, "exampl": [37, 53], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 54], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 54], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 54], "organ": 40, "import": [40, 54], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": [42, 44], "legaci": 42, "paramet": [42, 44, 54], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 55], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "keyspac": 44, "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 54], "specul": 44, "python": [45, 46], "scylla": [45, 51, 52], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 54], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 53], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": 46, "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 54], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 54], "configur": [46, 53], "ssl": [46, 53], "lightweight": [47, 54], "transact": [47, 54], "compar": 47, "special": 47, "result": [47, 50, 54], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 54], "larg": 50, "control": 50, "size": 50, "resum": 50, "cloud": 51, "specif": 52, "shard": 52, "awar": 52, "helper": 52, "attribut": 52, "secur": 53, "v1": 53, "No": 53, "ident": 53, "verif": 53, "client": [53, 54], "version": 53, "lower": 53, "dse": [53, 54], "unifi": 53, "proxi": 53, "login": 53, "modul": 54, "execute_async": 54, "now": 54, "local_on": 54, "normal": 54, "inform": 54, "attach": 54, "bind": 54, "ignor": 54, "extra": 54, "blist": 54, "soft": 54, "sever": 54, "v3": 54, "nativ": 54, "side": 54, "v2": 54, "automat": 54, "sasl": 54, "call": 54, "shutdown": 54, "udt": 55, "dict": 55, "them": 55}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Execution Profiles": [[42, "execution-profiles"], [44, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Frequently Asked Questions": [[43, "frequently-asked-questions"], [36, "frequently-asked-questions"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "Model Inheritance": [[37, "model-inheritance"], [40, "model-inheritance"]], "User Defined Types": [[37, "user-defined-types"], [55, "user-defined-types"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Registering a UDT": [[55, "registering-a-udt"]], "Map a Class to a UDT": [[55, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[55, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[55, "using-udts-without-registering-them"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Contents": [[45, "contents"], [48, "contents"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "Getting Started": [[44, "getting-started"], [48, "getting-started"]], "Connecting to a Cluster": [[44, "connecting-to-a-cluster"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Session Keyspace": [[44, "session-keyspace"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "Security": [[53, "security"]], "Authentication": [[53, "authentication"]], "Custom Authenticators": [[53, "custom-authenticators"]], "Protocol v1 Authentication": [[53, "protocol-v1-authentication"]], "SSL": [[53, "ssl"]], "SSL with Twisted or Eventlet": [[53, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[53, "ssl-configuration-examples"]], "No identity verification": [[53, "no-identity-verification"]], "Client verifies server": [[53, "client-verifies-server"]], "Server verifies client": [[53, "server-verifies-client"]], "Server verifies client and client verifies server": [[53, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[53, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[53, "ssl-with-twisted"]], "DSE Authentication": [[53, "dse-authentication"]], "DSE Unified Authentication": [[53, "dse-unified-authentication"]], "Proxy Login": [[53, "proxy-login"]], "Proxy Execute": [[53, "proxy-execute"]], "Scylla Specific Features": [[52, "scylla-specific-features"]], "Shard Awareness": [[52, "shard-awareness"]], "New Cluster Helpers": [[52, "new-cluster-helpers"]], "New Table Attributes": [[52, "new-table-attributes"]], "Upgrading": [[54, "upgrading"]], "Upgrading from dse-driver": [[54, "upgrading-from-dse-driver"]], "Installation": [[54, "installation"], [46, "installation"]], "Import from the cassandra module": [[54, "import-from-the-cassandra-module"]], "dse-graph": [[54, "dse-graph"]], "Session.execute and Session.execute_async API": [[54, "session-execute-and-session-execute-async-api"]], "Deprecations": [[54, "deprecations"], [54, "id2"], [0, "deprecations"], [0, "id38"], [0, "id163"]], "Upgrading to 3.0": [[54, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[54, "default-consistency-is-now-local-one"]], "Execution API Updates": [[54, "execution-api-updates"]], "Result return normalization": [[54, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[54, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[54, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[54, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[54, "metadata-api-updates"]], "Several deprecated features are removed": [[54, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[54, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[54, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[54, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[54, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[54, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[54, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[54, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[54, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[54, "protocol-level-batch-statements"]], "SASL-based Authentication": [[54, "sasl-based-authentication"]], "Lightweight Transactions": [[54, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[54, "calling-cluster-shutdown"]], "Dependency Changes": [[54, "dependency-changes"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "Scylla Cloud": [[51, "scylla-cloud"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) Graph": [[46, "optional-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]], "CHANGELOG": [[0, "changelog"]], "3.25.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id7"], [0, "id10"], [0, "id13"], [0, "id16"], [0, "id23"], [0, "id26"], [0, "id30"], [0, "id35"], [0, "id45"], [0, "id49"], [0, "id52"], [0, "id56"], [0, "id60"], [0, "id64"], [0, "id68"], [0, "id74"], [0, "id80"], [0, "id83"], [0, "id86"], [0, "id91"], [0, "id94"], [0, "id99"], [0, "id104"], [0, "id108"], [0, "id110"], [0, "id117"], [0, "id121"], [0, "id123"], [0, "id128"], [0, "id131"], [0, "id134"], [0, "id137"], [0, "id140"], [0, "id148"], [0, "id155"], [0, "id157"], [0, "id161"], [0, "id165"], [0, "id171"], [0, "id181"], [0, "id183"], [0, "id188"], [0, "id191"], [0, "id193"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id8"], [0, "id11"], [0, "id14"], [0, "id17"], [0, "id19"], [0, "id21"], [0, "id24"], [0, "id27"], [0, "id31"], [0, "id33"], [0, "id36"], [0, "id40"], [0, "id43"], [0, "id46"], [0, "id53"], [0, "id57"], [0, "id61"], [0, "id65"], [0, "id69"], [0, "id72"], [0, "id75"], [0, "id78"], [0, "id81"], [0, "id84"], [0, "id87"], [0, "id89"], [0, "id92"], [0, "id95"], [0, "id100"], [0, "id102"], [0, "id105"], [0, "id109"], [0, "id111"], [0, "id113"], [0, "id115"], [0, "id118"], [0, "id120"], [0, "id122"], [0, "id124"], [0, "id126"], [0, "id129"], [0, "id132"], [0, "id135"], [0, "id138"], [0, "id141"], [0, "id144"], [0, "id146"], [0, "id149"], [0, "id151"], [0, "id153"], [0, "id156"], [0, "id158"], [0, "id162"], [0, "id166"], [0, "id169"], [0, "id172"], [0, "id175"], [0, "id178"], [0, "id180"], [0, "id184"], [0, "id186"], [0, "id189"], [0, "id192"], [0, "id194"], [0, "id196"]], "Others": [[0, "others"], [0, "id5"], [0, "id15"]], "3.24.0": [[0, "id2"]], "3.23.0": [[0, "id6"]], "3.22.0": [[0, "id9"]], "3.21.0": [[0, "id12"]], "Other": [[0, "other"], [0, "id28"], [0, "id37"], [0, "id41"], [0, "id47"], [0, "id50"], [0, "id54"], [0, "id58"], [0, "id62"], [0, "id66"], [0, "id70"], [0, "id76"], [0, "id106"], [0, "id142"], [0, "id147"], [0, "id159"], [0, "id167"], [0, "id173"], [0, "id176"], [0, "id179"], [0, "id182"], [0, "id185"], [0, "id187"], [0, "id190"], [0, "id195"]], "3.20.2": [[0, "id18"]], "3.20.1": [[0, "id20"]], "3.20.0": [[0, "id22"]], "3.19.0": [[0, "id25"]], "3.18.0": [[0, "id29"]], "3.17.1": [[0, "id32"]], "3.17.0": [[0, "id34"]], "3.16.0": [[0, "id39"]], "3.15.1": [[0, "id42"]], "3.15.0": [[0, "id44"]], "3.14.0": [[0, "id48"]], "3.13.0": [[0, "id51"]], "3.12.0": [[0, "id55"]], "3.11.0": [[0, "id59"]], "3.10.0": [[0, "id63"]], "3.9.0": [[0, "id67"]], "3.8.1": [[0, "id71"]], "3.8.0": [[0, "id73"]], "3.7.1": [[0, "id77"]], "3.7.0": [[0, "id79"]], "3.6.0": [[0, "id82"]], "3.5.0": [[0, "id85"]], "3.4.1": [[0, "id88"]], "3.4.0": [[0, "id90"]], "3.3.0": [[0, "id93"]], "3.2.2": [[0, "id96"]], "3.2.1": [[0, "id97"]], "3.2.0": [[0, "id98"]], "3.1.1": [[0, "id101"]], "3.1.0": [[0, "id103"]], "3.0.0": [[0, "id107"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id112"]], "2.7.1": [[0, "id114"]], "2.7.0": [[0, "id116"]], "2.6.0": [[0, "id119"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id125"]], "2.5.0": [[0, "id127"]], "2.1.4": [[0, "id130"]], "2.1.3": [[0, "id133"]], "2.1.2": [[0, "id136"]], "2.1.1": [[0, "id139"]], "2.1.0": [[0, "id143"]], "2.1.0c1": [[0, "id145"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id150"]], "2.0.1": [[0, "id152"]], "2.0.0": [[0, "id154"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id160"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id164"]], "1.1.1": [[0, "id168"]], "1.1.0": [[0, "id170"]], "1.0.2": [[0, "id174"]], "1.0.1": [[0, "id177"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationfactor (class in cassandra.metadata)": [[25, "cassandra.metadata.ReplicationFactor"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/3.25.4-scylla/security.html b/3.25.4-scylla/security.html new file mode 100644 index 0000000000..3085b9c164 --- /dev/null +++ b/3.25.4-scylla/security.html @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Security

              +

              The two main security components you will use with the +Python driver are Authentication and SSL.

              +
              +

              Authentication

              +

              Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

              +

              For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

              +
              from cassandra.cluster import Cluster
              +from cassandra.auth import PlainTextAuthProvider
              +
              +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
              +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
              +
              +
              +
              +

              Custom Authenticators

              +

              If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

              +
              +
              +

              Protocol v1 Authentication

              +

              When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

              +
              from cassandra.cluster import Cluster
              +
              +def get_credentials(host_address):
              +    return {'username': 'joe', 'password': '1234'}
              +
              +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
              +
              +
              +
              +
              +
              +

              SSL

              +

              SSL should be used when client encryption is enabled in Cassandra.

              +

              To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

              +

              To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

              +

              If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

              +

              The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

              + +

              It might be also useful to learn about the different levels of identity verification to understand the examples:

              + +
              +

              SSL with Twisted or Eventlet

              +

              Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

              +
              +
              +

              SSL Configuration Examples

              +

              Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

              +
              +

              No identity verification

              +

              No identity verification at all. Note that this is not recommended for for production deployments.

              +

              The Cassandra configuration:

              +
              client_encryption_options:
              +  enabled: true
              +  keystore: /path/to/127.0.0.1.keystore
              +  keystore_password: myStorePass
              +  require_client_auth: false
              +
              +
              +

              The driver configuration:

              +
              from cassandra.cluster import Cluster, Session
              +from ssl import SSLContext, PROTOCOL_TLS
              +
              +ssl_context = SSLContext(PROTOCOL_TLS)
              +
              +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
              +session = cluster.connect()
              +
              +
              +
              +
              +

              Client verifies server

              +

              Ensure the python driver verifies the identity of the server.

              +

              The Cassandra configuration:

              +
              client_encryption_options:
              +  enabled: true
              +  keystore: /path/to/127.0.0.1.keystore
              +  keystore_password: myStorePass
              +  require_client_auth: false
              +
              +
              +

              For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

              +
              from cassandra.cluster import Cluster, Session
              +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
              +
              +ssl_context = SSLContext(PROTOCOL_TLS)
              +ssl_context.load_verify_locations('/path/to/rootca.crt')
              +ssl_context.verify_mode = CERT_REQUIRED
              +
              +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
              +session = cluster.connect()
              +
              +
              +

              Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

              +
              from cassandra.cluster import Cluster, Session
              +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
              +
              +ssl_context = SSLContext(PROTOCOL_TLS)
              +ssl_context.load_verify_locations('/path/to/rootca.crt')
              +ssl_context.verify_mode = CERT_REQUIRED
              +ssl_context.check_hostname = True
              +ssl_options = {'server_hostname': '127.0.0.1'}
              +
              +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
              +session = cluster.connect()
              +
              +
              +
              +
              +

              Server verifies client

              +

              If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

              +

              The cassandra configuration:

              +
              client_encryption_options:
              +  enabled: true
              +  keystore: /path/to/127.0.0.1.keystore
              +  keystore_password: myStorePass
              +  require_client_auth: true
              +  truststore: /path/to/dse-truststore.jks
              +  truststore_password: myStorePass
              +
              +
              +

              The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

              +
              cat > gen_client_cert.conf <<EOF
              +[ req ]
              +distinguished_name = req_distinguished_name
              +prompt = no
              +output_password = ${ROOT_CERT_PASS}
              +default_bits = 2048
              +
              +[ req_distinguished_name ]
              +C = ${CERT_COUNTRY}
              +O = ${CERT_ORG_NAME}
              +OU = ${CERT_OU}
              +CN = client
              +EOF
              +
              +
              +

              Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

              +
              openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
              +
              +
              +

              And generate the client signed certificate:

              +
              openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
              +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
              +
              +
              +

              Finally, you can use that configuration with the following driver code:

              +
              from cassandra.cluster import Cluster, Session
              +from ssl import SSLContext, PROTOCOL_TLS
              +
              +ssl_context = SSLContext(PROTOCOL_TLS)
              +ssl_context.load_cert_chain(
              +    certfile='/path/to/client.crt_signed',
              +    keyfile='/path/to/client.key')
              +
              +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
              +session = cluster.connect()
              +
              +
              +
              +
              +

              Server verifies client and client verifies server

              +

              See the previous section for examples of Cassandra configuration and preparing +the client certificates.

              +

              The following driver code specifies that the connection should use two-way verification:

              +
              from cassandra.cluster import Cluster, Session
              +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
              +
              +ssl_context = SSLContext(PROTOCOL_TLS)
              +ssl_context.load_verify_locations('/path/to/rootca.crt')
              +ssl_context.verify_mode = CERT_REQUIRED
              +ssl_context.load_cert_chain(
              +    certfile='/path/to/client.crt_signed',
              +    keyfile='/path/to/client.key')
              +
              +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
              +session = cluster.connect()
              +
              +
              +

              The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

              +

              Server verifies client and client verifies server using Twisted and pyOpenSSL

              +
              from OpenSSL import SSL, crypto
              +from cassandra.cluster import Cluster
              +from cassandra.io.twistedreactor import TwistedConnection
              +
              +ssl_context = SSL.Context(SSL.TLSv1_2_METHOD)
              +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
              +ssl_context.use_certificate_file('/path/to/client.crt_signed')
              +ssl_context.use_privatekey_file('/path/to/client.key')
              +ssl_context.load_verify_locations('/path/to/rootca.crt')
              +
              +cluster = Cluster(
              +    contact_points=['127.0.0.1'],
              +    connection_class=TwistedConnection,
              +    ssl_context=ssl_context,
              +    ssl_options={'check_hostname': True}
              +)
              +session = cluster.connect()
              +
              +
              +

              Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

              +
              +
              +
              +

              Versions 3.16.0 and lower

              +

              To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

              +

              By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLS to match +Cassandra’s default protocol.

              +

              For example:

              +
              from cassandra.cluster import Cluster
              +from ssl import PROTOCOL_TLS, CERT_REQUIRED
              +
              +ssl_opts = {
              +    'ca_certs': '/path/to/my/ca.certs',
              +    'ssl_version': PROTOCOL_TLS,
              +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
              +}
              +cluster = Cluster(ssl_options=ssl_opts)
              +
              +
              +

              This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

              +
              +

              SSL with Twisted

              +

              In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

              +
              +
              +
              +
              +

              DSE Authentication

              +

              When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

              +
              from cassandra.auth import DSEGSSAPIAuthProvider
              +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
              +cluster = Cluster(auth_provider=auth_provider)
              +session = cluster.connect()
              +
              +
              +

              Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

              +
              +

              DSE Unified Authentication

              +

              With DSE (>=5.1), unified Authentication allows you to:

              +
                +
              • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

              • +
              • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

              • +
              +
              +

              Proxy Login

              +

              Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

              +
              GRANT PROXY.LOGIN on role user1 to server
              +
              +
              +

              then you can do the proxy authentication….

              +
              from cassandra.cluster import Cluster
              +from cassandra.auth import SaslAuthProvider
              +
              +sasl_kwargs = {
              +  "service": 'dse',
              +  "mechanism":"PLAIN",
              +  "username": 'server',
              +  'password': 'server',
              +  'authorization_id': 'user1'
              +}
              +
              +auth_provider = SaslAuthProvider(**sasl_kwargs)
              +c = Cluster(auth_provider=auth_provider)
              +s = c.connect()
              +s.execute(...)  # all requests will be executed as 'user1'
              +
              +
              +

              If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

              +
              from cassandra.cluster import Cluster
              +from cassandra.auth import DSEGSSAPIAuthProvider
              +
              +# Ensure the kerberos ticket of the server user is set with the kinit utility.
              +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
              +                                      authorization_id='user1@DATASTAX.COM')
              +c = Cluster(auth_provider=auth_provider)
              +s = c.connect()
              +s.execute(...)  # all requests will be executed as 'user1'
              +
              +
              +
              +
              +

              Proxy Execute

              +

              Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

              +
              GRANT PROXY.EXECUTE on role user1 to server
              +
              +
              +

              then you can do a proxy execute…

              +
              from cassandra.cluster import Cluster
              +from cassandra.auth import DSEPlainTextAuthProvider,
              +
              +auth_provider = DSEPlainTextAuthProvider('server', 'server')
              +
              +c = Cluster(auth_provider=auth_provider)
              +s = c.connect()
              +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
              +
              +
              +

              Please see the official documentation for more details on the feature and configuration process.

              +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/sitemap.xml b/3.25.4-scylla/sitemap.xml new file mode 100644 index 0000000000..8871657309 --- /dev/null +++ b/3.25.4-scylla/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade_guide.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/dates_and_times.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/execution_profiles.htmlhttps://python-driver.docs.scylladb.com/stable/user_defined_types.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/getting_started.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third_party.htmlhttps://python-driver.docs.scylladb.com/stable/object_mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query_paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla_specific.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/3.25.4-scylla/upgrading.html b/3.25.4-scylla/upgrading.html new file mode 100644 index 0000000000..12954f7d6b --- /dev/null +++ b/3.25.4-scylla/upgrading.html @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Upgrading

              +
              +
              +
              +

              Upgrading from dse-driver

              +

              Since 3.21.0, scylla-driver fully supports DataStax products. dse-driver and +dse-graph users should now migrate to scylla-driver to benefit from latest bug fixes +and new features. The upgrade to this new unified driver version is straightforward +with no major API changes.

              +
              +

              Installation

              +

              Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

              +
              pip install scylla-driver
              +
              +
              +

              If you need the Graph Fluent API (features provided by dse-graph):

              +
              pip install scylla-driver[graph]
              +
              +
              +

              See Installation for more details.

              +
              +
              +

              Import from the cassandra module

              +

              There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

              +
              from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
              +from dse.auth import PlainTextAuthProvider
              +from dse.policies import WhiteListRoundRobinPolicy
              +
              +# becomes
              +
              +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
              +from cassandra.auth import PlainTextAuthProvider
              +from cassandra.policies import WhiteListRoundRobinPolicy
              +
              +
              +

              Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

              +
              +
              +

              dse-graph

              +

              dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

              +
              from dse_graph import ..
              +from dse_graph.query import ..
              +
              +# becomes
              +
              +from cassandra.datastax.graph.fluent import ..
              +from cassandra.datastax.graph.fluent.query import ..
              +
              +
              +

              See fluent.

              +
              +
              +

              Session.execute and Session.execute_async API

              +

              Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

              +

              See Session.execute().

              +
              +
              +

              Deprecations

              +

              These changes are optional, but recommended:

              +
                +
              • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

              • +
              • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

              • +
              +
              +
              +
              +

              Upgrading to 3.0

              +

              Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

              +
              +

              Default consistency is now LOCAL_ONE

              +

              Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

              +
              +
              +

              Execution API Updates

              +
              +

              Result return normalization

              +

              PYTHON-368

              +

              Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

              +

              Now, all results are returned as an iterable ResultSet.

              +

              The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

              +
              results = session.execute("SELECT * FROM system.local")
              +for row in results:
              +    process(row)
              +
              +
              +

              If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

              +
              results = session.execute("SELECT * FROM system.local")
              +row_list = list(results)
              +
              +
              +

              For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

              +
              results = session.execute("SELECT * FROM system.local")
              +first_result = results[0]  # materializes results, fetching all pages
              +
              +
              +

              This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

              +
              +
              +

              Trace information is not attached to executed Statements

              +

              PYTHON-318

              +

              Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

              +

              Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

              +

              ResponseFuture.get_query_trace()

              +

              ResponseFuture.get_all_query_traces()

              +

              ResultSet.get_query_trace()

              +

              ResultSet.get_all_query_traces()

              +
              +
              +

              Binding named parameters now ignores extra names

              +

              PYTHON-178

              +

              Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

              +

              Behavior in 3.0+ is to ignore extra names.

              +
              +
              +
              +

              blist removed as soft dependency

              +

              PYTHON-385

              +

              Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

              +

              Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

              +
              +
              +

              Metadata API Updates

              +

              PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

              +

              Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

              +

              The present API is documented: cassandra.metadata. Changes highlighted below:

              +
                +
              • All types are now exposed as CQL types instead of types derived from the internal server implementation

              • +
              • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

              • +
              • Some metadata attributes removed

                +
                  +
                • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

                • +
                • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

                • +
                +
              • +
              +
              +
              +

              Several deprecated features are removed

              +

              PYTHON-292

              +
                +
              • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

              • +
              • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

              • +
              • Cluster.submit_schema_refresh removed (574266d)

              • +
              • cqltypes time/date functions removed, use util entry points instead (bb984ee)

              • +
              • decoder module removed (e16a073)

              • +
              • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

              • +
              • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

              • +
              • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

              • +
              • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

              • +
              • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

              • +
              • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

              • +
              +
              +
              +
              +

              Upgrading to 2.1 from 2.0

              +

              Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

              +

              Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

              +
              +

              Using the v3 Native Protocol

              +

              By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster(protocol_version=3)
              +
              +
              +

              Note that protocol version 3 is only supported by Cassandra 2.1+.

              +

              In future releases, the driver may default to using protocol version +3.

              +
              +
              +

              Working with User-Defined Types

              +

              Cassandra 2.1 introduced the ability to define new types:

              +
              USE KEYSPACE mykeyspace;
              +
              +CREATE TYPE address (street text, city text, zip int);
              +
              +
              +

              The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

              +
              cluster = Cluster()
              +
              +class Address(object):
              +
              +    def __init__(self, street, city, zipcode):
              +        self.street = street
              +        self.city = text
              +        self.zipcode = zipcode
              +
              +cluster.register_user_type('mykeyspace', 'address', Address)
              +
              +
              +

              When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

              +

              If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

              +

              See User Defined Types for more details.

              +
              +
              +

              Customizing Encoders for Non-prepared Statements

              +

              Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

              +
              cluster = Cluster()
              +session = cluster.connect()
              +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
              +
              +
              +

              See Type Conversions for the table of default CQL literal conversions.

              +
              +
              +

              Using Client-Side Protocol-Level Timestamps

              +

              With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

              +

              When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

              +
              +
              +
              +

              Upgrading to 2.0 from 1.x

              +

              Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

              +
              +

              Using the v2 Native Protocol

              +

              By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster(protocol_version=2)
              +
              +
              +

              When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

              +
              from cassandra.cluster import Cluster
              +
              +cluster = Cluster(protocol_version=1)
              +
              +
              +
              +
              +

              Automatic Query Paging

              +

              Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

              +

              See Paging Large Queries for full details.

              +
              +
              +

              Protocol-Level Batch Statements

              +

              With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

              +

              See BatchStatement for details and usage examples.

              +
              +
              +

              SASL-based Authentication

              +

              Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

              +
              +
              +

              Lightweight Transactions

              +

              Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

              +
              +
              +

              Calling Cluster.shutdown()

              +

              In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

              +
              +
              +

              Deprecations

              +

              The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

              + +
              +
              +

              Dependency Changes

              +

              The following dependencies have officially been made optional:

              +
                +
              • scales

              • +
              • blist

              • +
              +

              And one new dependency has been added (to enable Python 3 support):

              +
                +
              • six

              • +
              +
              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.25.4-scylla/user_defined_types.html b/3.25.4-scylla/user_defined_types.html new file mode 100644 index 0000000000..13e99659cd --- /dev/null +++ b/3.25.4-scylla/user_defined_types.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of Scylla Python Driver. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              User Defined Types

              +

              Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

              +
              CREATE TYPE address (street text, zip int);
              +
              +
              +

              Version 2.1 of the Python driver adds support for user-defined types.

              +
              +

              Registering a UDT

              +

              You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

              +
              +

              Map a Class to a UDT

              +
              cluster = Cluster(protocol_version=3)
              +session = cluster.connect()
              +session.set_keyspace('mykeyspace')
              +session.execute("CREATE TYPE address (street text, zipcode int)")
              +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
              +
              +# create a class to map to the "address" UDT
              +class Address(object):
              +
              +    def __init__(self, street, zipcode):
              +        self.street = street
              +        self.zipcode = zipcode
              +
              +cluster.register_user_type('mykeyspace', 'address', Address)
              +
              +# insert a row using an instance of Address
              +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
              +                (0, Address("123 Main St.", 78723)))
              +
              +# results will include Address instances
              +results = session.execute("SELECT * FROM users")
              +row = results[0]
              +print(row.id, row.location.street, row.location.zipcode)
              +
              +
              +
              +
              +

              Map a dict to a UDT

              +
              cluster = Cluster(protocol_version=3)
              +session = cluster.connect()
              +session.set_keyspace('mykeyspace')
              +session.execute("CREATE TYPE address (street text, zipcode int)")
              +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
              +
              +cluster.register_user_type('mykeyspace', 'address', dict)
              +
              +# insert a row using a prepared statement and a tuple
              +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
              +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
              +
              +# results will include dict instances
              +results = session.execute("SELECT * FROM users")
              +row = results[0]
              +print(row.id, row.location['street'], row.location['zipcode'])
              +
              +
              +
              +
              +
              +

              Using UDTs Without Registering Them

              +

              Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

              +

              When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

              +
              cluster = Cluster(protocol_version=3)
              +session = cluster.connect()
              +session.set_keyspace('mykeyspace')
              +session.execute("CREATE TYPE address (street text, zipcode int)")
              +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
              +
              +class Foo(object):
              +
              +    def __init__(self, street, zipcode, otherstuff):
              +        self.street = street
              +        self.zipcode = zipcode
              +        self.otherstuff = otherstuff
              +
              +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
              +
              +# since we're using a prepared statement, we don't *have* to register
              +# a class to map to the UDT to insert data.  The object just needs to have
              +# "street" and "zipcode" attributes (which Foo does):
              +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
              +
              +# when we query data, UDT columns that don't have a class registered
              +# will be returned as namedtuples:
              +results = session.execute("SELECT * FROM users")
              +first_row = results[0]
              +address = first_row.location
              +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
              +street = address.street
              +zipcode = address.street
              +
              +
              +

              As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

              +

              * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

              +
              +
              + + +
              + + + + + + +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/.buildinfo b/3.26.4-scylla/.buildinfo new file mode 100644 index 0000000000..178c4e2e0d --- /dev/null +++ b/3.26.4-scylla/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e84c6ce988dc6a43f9017029bd091a8a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/3.26.4-scylla/.doctrees/CHANGELOG.doctree b/3.26.4-scylla/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..081385137d Binary files /dev/null and b/3.26.4-scylla/.doctrees/CHANGELOG.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra.doctree b/3.26.4-scylla/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..43c716cca6 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/auth.doctree b/3.26.4-scylla/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..f7db6530c3 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/auth.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cluster.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..c707c00519 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cluster.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/concurrent.doctree b/3.26.4-scylla/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..6c5f9b5b05 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/connection.doctree b/3.26.4-scylla/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..a6ae323493 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/connection.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..d64f68693e Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..b12aafe433 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/management.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..854cbcc04a Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/models.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..3314453e10 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/query.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..5bd9cb2dff Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..4f9b7f82b0 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..c943ad53fe Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..7ae1238d5b Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..30acb1c98a Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..d3fe49c38b Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/decoder.doctree b/3.26.4-scylla/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..bb6b1c2284 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/decoder.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/encoder.doctree b/3.26.4-scylla/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..258d86e74a Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/encoder.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/graph.doctree b/3.26.4-scylla/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..acf548ad29 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/graph.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree b/3.26.4-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..4b9515f5c6 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree b/3.26.4-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..b03963cbe4 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree b/3.26.4-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..1e12118b78 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/io/geventreactor.doctree b/3.26.4-scylla/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..34e337e08f Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/io/libevreactor.doctree b/3.26.4-scylla/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..9ad82668da Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree b/3.26.4-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..96b479a3ec Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/metadata.doctree b/3.26.4-scylla/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..556e64697c Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/metadata.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/metrics.doctree b/3.26.4-scylla/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..5b4c5823b6 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/metrics.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/policies.doctree b/3.26.4-scylla/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..8f23734a15 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/policies.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/pool.doctree b/3.26.4-scylla/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..22be5f624f Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/pool.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/protocol.doctree b/3.26.4-scylla/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..d8549f2978 Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/protocol.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/query.doctree b/3.26.4-scylla/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..b7521f668e Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/query.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/timestamps.doctree b/3.26.4-scylla/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..f17db6b0cb Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/cassandra/util.doctree b/3.26.4-scylla/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..1f0e5f38cb Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/cassandra/util.doctree differ diff --git a/3.26.4-scylla/.doctrees/api/index.doctree b/3.26.4-scylla/.doctrees/api/index.doctree new file mode 100644 index 0000000000..7b6c45c18e Binary files /dev/null and b/3.26.4-scylla/.doctrees/api/index.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/batches.doctree b/3.26.4-scylla/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..95aea5a556 Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/batches.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/connections.doctree b/3.26.4-scylla/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..83fd530ec0 Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/connections.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/faq.doctree b/3.26.4-scylla/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..1f6dabda29 Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/faq.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/models.doctree b/3.26.4-scylla/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..f075bcbc25 Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/models.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/queryset.doctree b/3.26.4-scylla/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..47ddd293fe Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/queryset.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/third-party.doctree b/3.26.4-scylla/.doctrees/cqlengine/third-party.doctree new file mode 100644 index 0000000000..66b89604c8 Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/third-party.doctree differ diff --git a/3.26.4-scylla/.doctrees/cqlengine/upgrade-guide.doctree b/3.26.4-scylla/.doctrees/cqlengine/upgrade-guide.doctree new file mode 100644 index 0000000000..85ee707d1e Binary files /dev/null and b/3.26.4-scylla/.doctrees/cqlengine/upgrade-guide.doctree differ diff --git a/3.26.4-scylla/.doctrees/dates-and-times.doctree b/3.26.4-scylla/.doctrees/dates-and-times.doctree new file mode 100644 index 0000000000..4eb6f8902a Binary files /dev/null and b/3.26.4-scylla/.doctrees/dates-and-times.doctree differ diff --git a/3.26.4-scylla/.doctrees/environment.pickle b/3.26.4-scylla/.doctrees/environment.pickle new file mode 100644 index 0000000000..0f00bec039 Binary files /dev/null and b/3.26.4-scylla/.doctrees/environment.pickle differ diff --git a/3.26.4-scylla/.doctrees/execution-profiles.doctree b/3.26.4-scylla/.doctrees/execution-profiles.doctree new file mode 100644 index 0000000000..b816f4e861 Binary files /dev/null and b/3.26.4-scylla/.doctrees/execution-profiles.doctree differ diff --git a/3.26.4-scylla/.doctrees/faq.doctree b/3.26.4-scylla/.doctrees/faq.doctree new file mode 100644 index 0000000000..99fda588af Binary files /dev/null and b/3.26.4-scylla/.doctrees/faq.doctree differ diff --git a/3.26.4-scylla/.doctrees/getting-started.doctree b/3.26.4-scylla/.doctrees/getting-started.doctree new file mode 100644 index 0000000000..c7d4af0b78 Binary files /dev/null and b/3.26.4-scylla/.doctrees/getting-started.doctree differ diff --git a/3.26.4-scylla/.doctrees/index.doctree b/3.26.4-scylla/.doctrees/index.doctree new file mode 100644 index 0000000000..9c8fb60865 Binary files /dev/null and b/3.26.4-scylla/.doctrees/index.doctree differ diff --git a/3.26.4-scylla/.doctrees/installation.doctree b/3.26.4-scylla/.doctrees/installation.doctree new file mode 100644 index 0000000000..e09e52ce52 Binary files /dev/null and b/3.26.4-scylla/.doctrees/installation.doctree differ diff --git a/3.26.4-scylla/.doctrees/lwt.doctree b/3.26.4-scylla/.doctrees/lwt.doctree new file mode 100644 index 0000000000..eb78074c76 Binary files /dev/null and b/3.26.4-scylla/.doctrees/lwt.doctree differ diff --git a/3.26.4-scylla/.doctrees/object-mapper.doctree b/3.26.4-scylla/.doctrees/object-mapper.doctree new file mode 100644 index 0000000000..049f668da2 Binary files /dev/null and b/3.26.4-scylla/.doctrees/object-mapper.doctree differ diff --git a/3.26.4-scylla/.doctrees/performance.doctree b/3.26.4-scylla/.doctrees/performance.doctree new file mode 100644 index 0000000000..235281b309 Binary files /dev/null and b/3.26.4-scylla/.doctrees/performance.doctree differ diff --git a/3.26.4-scylla/.doctrees/query-paging.doctree b/3.26.4-scylla/.doctrees/query-paging.doctree new file mode 100644 index 0000000000..32f01a3303 Binary files /dev/null and b/3.26.4-scylla/.doctrees/query-paging.doctree differ diff --git a/3.26.4-scylla/.doctrees/scylla-cloud-serverless.doctree b/3.26.4-scylla/.doctrees/scylla-cloud-serverless.doctree new file mode 100644 index 0000000000..b7a96719a0 Binary files /dev/null and b/3.26.4-scylla/.doctrees/scylla-cloud-serverless.doctree differ diff --git a/3.26.4-scylla/.doctrees/scylla-cloud.doctree b/3.26.4-scylla/.doctrees/scylla-cloud.doctree new file mode 100644 index 0000000000..8d1558ee62 Binary files /dev/null and b/3.26.4-scylla/.doctrees/scylla-cloud.doctree differ diff --git a/3.26.4-scylla/.doctrees/scylla-specific.doctree b/3.26.4-scylla/.doctrees/scylla-specific.doctree new file mode 100644 index 0000000000..a7c6e328be Binary files /dev/null and b/3.26.4-scylla/.doctrees/scylla-specific.doctree differ diff --git a/3.26.4-scylla/.doctrees/security.doctree b/3.26.4-scylla/.doctrees/security.doctree new file mode 100644 index 0000000000..b1be06a844 Binary files /dev/null and b/3.26.4-scylla/.doctrees/security.doctree differ diff --git a/3.26.4-scylla/.doctrees/upgrading.doctree b/3.26.4-scylla/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..76881f2a8f Binary files /dev/null and b/3.26.4-scylla/.doctrees/upgrading.doctree differ diff --git a/3.26.4-scylla/.doctrees/user-defined-types.doctree b/3.26.4-scylla/.doctrees/user-defined-types.doctree new file mode 100644 index 0000000000..0b781ba039 Binary files /dev/null and b/3.26.4-scylla/.doctrees/user-defined-types.doctree differ diff --git a/3.26.4-scylla/.nojekyll b/3.26.4-scylla/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/3.26.4-scylla/404.html b/3.26.4-scylla/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/3.26.4-scylla/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
              +

              404

              +

              The ScyllaDB monster ate your page!

              +

              + Home +

              +
              + + + \ No newline at end of file diff --git a/3.26.4-scylla/CHANGELOG.html b/3.26.4-scylla/CHANGELOG.html new file mode 100644 index 0000000000..2738945603 --- /dev/null +++ b/3.26.4-scylla/CHANGELOG.html @@ -0,0 +1,2942 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + + + +
              + +
              + +
              +

              CHANGELOG

              +
              +

              3.26.0

              +

              March 13, 2023

              +
              +

              Features

              +
                +
              • Add support for execution profiles in execute_concurrent (PR 1122)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Handle empty non-final result pages (PR 1110)

              • +
              • Do not re-use stream IDs for in-flight requests (PR 1114)

              • +
              • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

              • +
              +
              +
              +

              Others

              +
                +
              • Fix deprecation warning in query tracing (PR 1103)

              • +
              • Remove mutable default values from some tests (PR 1116)

              • +
              • Remove dependency on unittest2 (PYTHON-1289)

              • +
              • Fix deprecation warnings for asyncio.coroutine annotation in asyncioreactor (PYTTHON-1290)

              • +
              • Fix typos in source files (PR 1126)

              • +
              • HostFilterPolicyInitTest fix for Python 3.11 (PR 1131)

              • +
              • Fix for DontPrepareOnIgnoredHostsTest (PYTHON-1287)

              • +
              • tests.integration.simulacron.test_connection failures (PYTHON-1304)

              • +
              • tests.integration.standard.test_single_interface.py appears to be failing for C* 4.0 (PYTHON-1329)

              • +
              • Authentication tests appear to be failing fraudulently (PYTHON-1328)

              • +
              • PreparedStatementTests.test_fail_if_different_query_id_on_reprepare() failing unexpectedly (PTYHON-1327)

              • +
              • Refactor deprecated unittest aliases for Python 3.11 compatibility (PR 1112)

              • +
              +
              +
              +

              Deprecations

              +
                +
              • This release removes support for Python 2.7.x as well as Python 3.5.x and 3.6.x

              • +
              +
              +
              +
              +

              3.25.0

              +

              March 18, 2021

              +
              +

              Features

              +
                +
              • Ensure the driver can connect when invalid peer hosts are in system.peers (PYTHON-1260)

              • +
              • Implement protocol v5 checksumming (PYTHON-1258)

              • +
              • Fix the default cqlengine connection mechanism to work with Astra (PYTHON-1265)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

              • +
              • Update list of reserved keywords (PYTHON-1269)

              • +
              +
              +
              +

              Others

              +
                +
              • Drop Python 3.4 support (PYTHON-1220)

              • +
              • Update security documentation and examples to use PROTOCOL_TLS (PYTHON-1264)

              • +
              +
              +
              +
              +

              3.24.0

              +

              June 18, 2020

              +
              +

              Features

              +
                +
              • Make geomet an optional dependency at runtime (PYTHON-1237)

              • +
              • Add use_default_tempdir cloud config options (PYTHON-1245)

              • +
              • Tcp flow control for libevreactor (PYTHON-1248)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Unable to connect to a cloud cluster using Ubuntu 20.04 (PYTHON-1238)

              • +
              • PlainTextAuthProvider fails with unicode chars and Python3 (PYTHON-1241)

              • +
              • [GRAPH] Graph execution profiles consistency level are not set to LOCAL_QUORUM with a cloud cluster (PYTHON-1240)

              • +
              • [GRAPH] Can’t write data in a Boolean field using the Fluent API (PYTHON-1239)

              • +
              • [GRAPH] Fix elementMap() result deserialization (PYTHON-1233)

              • +
              +
              +
              +

              Others

              +
                +
              • Bump geomet dependency version to 0.2 (PYTHON-1243)

              • +
              • Bump gremlinpython dependency version to 3.4.6 (PYTHON-1212)

              • +
              • Improve fluent graph documentation for core graphs (PYTHON-1244)

              • +
              +
              +
              +
              +

              3.23.0

              +

              April 6, 2020

              +
              +

              Features

              +
                +
              • Transient Replication Support (PYTHON-1207)

              • +
              • Support system.peers_v2 and port discovery for C* 4.0 (PYTHON-700)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Asyncore logging exception on shutdown (PYTHON-1228)

              • +
              +
              +
              +
              +

              3.22.0

              +

              February 26, 2020

              +
              +

              Features

              +
                +
              • Add all() function to the ResultSet API (PYTHON-1203)

              • +
              • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

              • +
              • Add GraphSON3 support (PYTHON-788)

              • +
              • Use GraphSON3 as default for Native graphs (PYTHON-1004)

              • +
              • Add Tuple and UDT types for native graph (PYTHON-1005)

              • +
              • Add Duration type for native graph (PYTHON-1000)

              • +
              • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

              • +
              • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

              • +
              • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

              • +
              • Resolve the row_factory automatically for native graphs (PYTHON-1056)

              • +
              • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

              • +
              • Add g:BulkSet graph deserializers (PYTHON-1060)

              • +
              • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

              • +
              • Update Native to Core Graph Engine

              • +
              • Add graphson3 and native graph support (PYTHON-1039)

              • +
              • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

              • +
              • Expose filter predicates for cql collections (PYTHON-1019)

              • +
              • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

              • +
              • Make graph metadata handling more robust (PYTHON-1204)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

              • +
              +
              +
              +
              +

              3.21.0

              +

              January 15, 2020

              +
              +

              Features

              +
                +
              • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

              • +
              • Add Python 3.8 support (PYTHON-1189)

              • +
              • Allow passing ssl context for Twisted (PYTHON-1161)

              • +
              • Ssl context and cloud support for Eventlet (PYTHON-1162)

              • +
              • Cloud Twisted support (PYTHON-1163)

              • +
              • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

              • +
              • Flexible version parsing (PYTHON-1174)

              • +
              • Support NULL in collection deserializer (PYTHON-1123)

              • +
              • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

              • +
              • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

              • +
              • asyncio message chunks can be processed discontinuously (PYTHON-1185)

              • +
              • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

              • +
              • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

              • +
              • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

              • +
              • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

              • +
              +
              +
              +

              Others

              +
                +
              • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

              • +
              • Remove *read_repair_chance table options (PYTHON-1140)

              • +
              • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

              • +
              • Add new DSE CQL keywords (PYTHON-1122)

              • +
              • Publish binary wheel distributions (PYTHON-1013)

              • +
              +
              +
              +

              Deprecations

              +
                +
              • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

              • +
              +

              Merged from dse-driver:

              +
              +
              +

              Features

              +
                +
              • Insights integration (PYTHON-1047)

              • +
              • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

              • +
              • Add NodeSync metadata (PYTHON-799)

              • +
              • Add new NodeSync failure values (PYTHON-934)

              • +
              • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

              • +
              • GraphOptions should show a warning for unknown parameters (PYTHON-819)

              • +
              • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

              • +
              • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

              • +
              • Add graph-results payload option for GraphSON format (PYTHON-773)

              • +
              • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

              • +
              • Implement serializers for the Graph String API (PYTHON-778)

              • +
              • Provide deserializers for GraphSON types (PYTHON-782)

              • +
              • Add Graph DurationType support (PYTHON-607)

              • +
              • Support DSE DateRange type (PYTHON-668)

              • +
              • RLAC CQL output for materialized views (PYTHON-682)

              • +
              • Add Geom Types wkt deserializer

              • +
              • DSE Graph Client timeouts in custom payload (PYTHON-589)

              • +
              • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

              • +
              • Add config profiles to DSE graph execution (PYTHON-570)

              • +
              • DSE Driver version checking (PYTHON-568)

              • +
              • Distinct default timeout for graph queries (PYTHON-477)

              • +
              • Graph result parsing for known types (PYTHON-479,487)

              • +
              • Distinct read/write CL for graph execution (PYTHON-509)

              • +
              • Target graph analytics query to spark master when available (PYTHON-510)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

              • +
              • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

              • +
              • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

              • +
              • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

              • +
              • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

              • +
              • Update date serialization to isoformat in graph (PYTHON-805)

              • +
              • DateRange Parse Error (PYTHON-729)

              • +
              • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

              • +
              • metadata.get_host returning None unexpectedly (PYTHON-709)

              • +
              • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

              • +
              • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

              • +
              • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

              • +
              • Correctly handle other types in geo type equality (PYTHON-508)

              • +
              +
              +
              +

              Other

              +
                +
              • Add tests around cqlengine and continuous paging (PYTHON-872)

              • +
              • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

              • +
              • Write documentation examples for DSE 2.0 features (PYTHON-732)

              • +
              • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

              • +
              +
              +
              +
              +

              3.20.2

              +

              November 19, 2019

              +
              +

              Bug Fixes

              +
                +
              • Fix import error for old python installation without SSLContext (PYTHON-1183)

              • +
              +
              +
              +
              +

              3.20.1

              +

              November 6, 2019

              +
              +

              Bug Fixes

              +
                +
              • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

              • +
              +
              +
              +
              +

              3.20.0

              +

              October 28, 2019

              +
              +

              Features

              +
                +
              • DataStax Astra Support (PYTHON-1074)

              • +
              • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

              • +
              • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

              • +
              • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

              • +
              +
              +
              +
              +

              3.19.0

              +

              August 26, 2019

              +
              +

              Features

              +
                +
              • Add Python 3.7 support (PYTHON-1016)

              • +
              • Future-proof Mapping imports (PYTHON-1023)

              • +
              • Include param values in cqlengine logging (PYTHON-1105)

              • +
              • NTS Token Replica Map Generation is slow (PYTHON-622)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

              • +
              • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

              • +
              • Fix incorrect metadata for compact counter tables (PYTHON-1100)

              • +
              • Call ConnectionException with correct kwargs (PYTHON-1117)

              • +
              • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

              • +
              • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

              • +
              • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

              • +
              +
              +
              +

              Other

              +
                +
              • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

              • +
              • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

              • +
              +
              +
              +
              +

              3.18.0

              +

              May 27, 2019

              +
              +

              Features

              +
                +
              • Abstract Host Connection information (PYTHON-1079)

              • +
              • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

              • +
              • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

              • +
              • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

              • +
              • Accept legacy empty strings as column names (PYTHON-1082)

              • +
              • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

              • +
              +
              +
              +
              +

              3.17.1

              +

              May 2, 2019

              +
              +

              Bug Fixes

              +
                +
              • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

              • +
              +
              +
              +
              +

              3.17.0

              +

              February 19, 2019

              +
              +

              Features

              +
                +
              • Send driver name and version in startup message (PYTHON-1068)

              • +
              • Add Cluster ssl_context option to enable SSL (PYTHON-995)

              • +
              • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

              • +
              • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

              • +
              • Add Session.get_execution_profile (PYTHON-932)

              • +
              • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

              • +
              • Serial consistency level is not used (PYTHON-1007)

              • +
              +
              +
              +

              Other

              +
                +
              • Fail faster on incorrect lz4 import (PYTHON-1042)

              • +
              • Bump Cython dependency version to 0.29 (PYTHON-1036)

              • +
              • Expand Driver SSL Documentation (PYTHON-740)

              • +
              +
              +
              +

              Deprecations

              +
                +
              • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

              • +
              • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

              • +
              +
              +
              +
              +

              3.16.0

              +

              November 12, 2018

              +
              +

              Bug Fixes

              +
                +
              • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

              • +
              • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

              • +
              • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

              • +
              • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

              • +
              • Log profile name on attempt to create existing profile (PYTHON-944)

              • +
              • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

              • +
              +
              +
              +

              Other

              +
                +
              • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

              • +
              • Fix wrong use of ResultSet indexing (PYTHON-1015)

              • +
              +
              +
              +
              +

              3.15.1

              +

              September 6, 2018

              +
              +

              Bug Fixes

              +
                +
              • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

              • +
              +
              +
              +
              +

              3.15.0

              +

              August 30, 2018

              +
              +

              Features

              +
                +
              • Parse Virtual Keyspace Metadata (PYTHON-992)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

              • +
              • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

              • +
              • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

              • +
              • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

              • +
              +
              +
              +

              Other

              +
                +
              • Use global variable for libev loops so it can be subclassed (PYTHON-973)

              • +
              • Update SchemaParser for V4 (PYTHON-1006)

              • +
              • Bump Cython dependency version to 0.28 (PYTHON-1012)

              • +
              +
              +
              +
              +

              3.14.0

              +

              April 17, 2018

              +
              +

              Features

              +
                +
              • Add one() function to the ResultSet API (PYTHON-947)

              • +
              • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

              • +
              • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

              • +
              • Twisted SSL Support (PYTHON-343)

              • +
              • Support IS NOT NULL operator in cqlengine (PYTHON-968)

              • +
              +
              +
              +

              Other

              +
                +
              • Fix Broken Links in Docs (PYTHON-916)

              • +
              • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

              • +
              • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

              • +
              • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

              • +
              • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

              • +
              • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

              • +
              • Add DSE smoke test to OSS driver tests (PYTHON-894)

              • +
              • Document long compilation times and workarounds (PYTHON-868)

              • +
              • Improve error for batch WriteTimeouts (PYTHON-941)

              • +
              • Deprecate ResultSet indexing (PYTHON-945)

              • +
              +
              +
              +
              +

              3.13.0

              +

              January 30, 2018

              +
              +

              Features

              +
                +
              • cqlengine: LIKE filter operator (PYTHON-512)

              • +
              • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

              • +
              • Support retry_policy in PreparedStatement (PYTHON-861)

              • +
              • __del__ method in Session is throwing an exception (PYTHON-813)

              • +
              • LZ4 import issue with recent versions (PYTHON-897)

              • +
              • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

              • +
              • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

              • +
              +
              +
              +

              Other

              +
                +
              • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

              • +
              • Fix DeprecationWarning of log.warn (PYTHON-846)

              • +
              • Fix example_mapper.py for python3 (PYTHON-860)

              • +
              • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

              • +
              • Add some known deprecated warnings for 4.x (PYTHON-877)

              • +
              • Remove copyright dates from copyright notices (PYTHON-863)

              • +
              • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

              • +
              • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

              • +
              • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

              • +
              • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

              • +
              +
              +
              +
              +

              3.12.0

              +

              November 6, 2017

              +
              +

              Features

              +
                +
              • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

              • +
              • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

              • +
              • WriteType.CDC and VIEW missing (PYTHON-794)

              • +
              • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

              • +
              • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

              • +
              • Include hash of result set metadata in prepared stmt id (PYTHON-808)

              • +
              • Add NO_COMPACT startup option (PYTHON-839)

              • +
              • Add new exception type for CDC (PYTHON-837)

              • +
              • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

              • +
              • Add asyncio reactor (PYTHON-507)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

              • +
              • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

              • +
              • Not create two sessions by default in CQLEngine (PYTHON-814)

              • +
              • Bug when subclassing AyncoreConnection (PYTHON-827)

              • +
              • Error at cleanup when closing the asyncore connections (PYTHON-829)

              • +
              • Fix sites where sessions can change during iteration (PYTHON-793)

              • +
              • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

              • +
              • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

              • +
              • Dont set the session keyspace when preparing statements (PYTHON-843)

              • +
              • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

              • +
              +
              +
              +

              Other

              +
                +
              • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

              • +
              • Bump Cython dependency version to 0.27 (PYTHON-833)

              • +
              +
              +
              +
              +

              3.11.0

              +

              July 24, 2017

              +
              +

              Features

              +
                +
              • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

              • +
              • Add HostFilterPolicy (PYTHON-761)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

              • +
              • Fix asyncore hang on exit (PYTHON-767)

              • +
              • Driver takes several minutes to remove a bad host from session (PYTHON-762)

              • +
              • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

              • +
              • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

              • +
              • request_ids may not be returned to the pool (PYTHON-739)

              • +
              • Fix murmur3 on big-endian systems (PYTHON-653)

              • +
              • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

              • +
              • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

              • +
              +
              +
              +

              Other

              +
                +
              • Bump Cython dependency version to 0.25.2 (PYTHON-754)

              • +
              • Fix DeprecationWarning when using lz4 (PYTHON-769)

              • +
              • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

              • +
              • Improve upgrade guide for materializing pages (PYTHON-464)

              • +
              • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

              • +
              • Point to DSA Slack, not IRC, in docs index

              • +
              +
              +
              +
              +

              3.10.0

              +

              May 24, 2017

              +
              +

              Features

              +
                +
              • Add Duration type to cqlengine (PYTHON-750)

              • +
              • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

              • +
              • get_query_trace() contract is ambiguous (PYTHON-196)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Queries using speculative execution policy timeout prematurely (PYTHON-755)

              • +
              • Fix map where results are not consumed (PYTHON-749)

              • +
              • Driver fails to encode Duration’s with large values (PYTHON-747)

              • +
              • UDT values are not updated correctly in CQLEngine (PYTHON-743)

              • +
              • UDT types are not validated in CQLEngine (PYTHON-742)

              • +
              • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

              • +
              • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

              • +
              • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

              • +
              • Memory grows and doesn’t get removed (PYTHON-720)

              • +
              • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

              • +
              • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

              • +
              • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

              • +
              +
              +
              +

              Other

              +
                +
              • Update README (PYTHON-746)

              • +
              • Test python versions 3.5 and 3.6 (PYTHON-737)

              • +
              • Docs Warning About Prepare select * (PYTHON-626)

              • +
              • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

              • +
              • Example SSL connection code does not verify server certificates (PYTHON-469)

              • +
              +
              +
              +
              +

              3.9.0

              +
              +

              Features

              +
                +
              • cqlengine: remove elements by key from a map (PYTHON-688)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • improve error handling when connecting to non-existent keyspace (PYTHON-665)

              • +
              • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

              • +
              • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

              • +
              • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

              • +
              • race where callback or errback for request may not be called (PYTHON-733)

              • +
              • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

              • +
              • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

              • +
              +
              +
              +

              Other

              +
                +
              • Connection not closed in example_mapper (PYTHON-723)

              • +
              • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

              • +
              +
              +
              +
              +

              3.8.1

              +

              March 16, 2017

              +
              +

              Bug Fixes

              +
                +
              • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

              • +
              • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

              • +
              • Fix DecimalType regression (PYTHON-724)

              • +
              +
              +
              +
              +

              3.8.0

              +
              +

              Features

              +
                +
              • Quote index names in metadata CQL generation (PYTHON-616)

              • +
              • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

              • +
              • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

              • +
              • Added cql types to result set (PYTHON-648)

              • +
              • Add __len__ to BatchStatement (PYTHON-650)

              • +
              • Duration Type for Cassandra (PYTHON-655)

              • +
              • Send flags with PREPARE message in v5 (PYTHON-684)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

              • +
              • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

              • +
              • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

              • +
              • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

              • +
              • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

              • +
              • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

              • +
              • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

              • +
              • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

              • +
              • Make client timestamps strictly monotonic (PYTHON-676)

              • +
              • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

              • +
              +
              +
              +

              Other

              +
                +
              • Create a cqlengine doc section explaining None semantics (PYTHON-623)

              • +
              • Resolve warnings in documentation generation (PYTHON-645)

              • +
              • Cython dependency (PYTHON-686)

              • +
              • Drop Support for Python 2.6 (PYTHON-690)

              • +
              +
              +
              +
              +

              3.7.1

              +

              October 26, 2016

              +
              +

              Bug Fixes

              +
                +
              • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

              • +
              +
              +
              +
              +

              3.7.0

              +

              September 13, 2016

              +
              +

              Features

              +
                +
              • Add v5 protocol failure map (PYTHON-619)

              • +
              • Don’t return from initial connect on first error (PYTHON-617)

              • +
              • Indicate failed column when deserialization fails (PYTHON-361)

              • +
              • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

              • +
              • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

              • +
              • EC2 Address Resolver (PYTHON-198)

              • +
              • Speculative query retries (PYTHON-218)

              • +
              • Expose paging state in API (PYTHON-200)

              • +
              • Don’t mark host down while one connection is active (PYTHON-498)

              • +
              • Query request size information (PYTHON-284)

              • +
              • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

              • +
              • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

              • +
              • Add beta version native protocol flag (PYTHON-614)

              • +
              • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Race when adding a pool while setting keyspace (PYTHON-628)

              • +
              • Update results_metadata when prepared statement is reprepared (PYTHON-621)

              • +
              • CQL Export for Thrift Tables (PYTHON-213)

              • +
              • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

              • +
              • cqlengine: columns are no longer hashable (PYTHON-618)

              • +
              • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

              • +
              +
              +
              +
              +

              3.6.0

              +

              August 1, 2016

              +
              +

              Features

              +
                +
              • Handle null values in NumpyProtocolHandler (PYTHON-553)

              • +
              • Collect greplin scales stats per cluster (PYTHON-561)

              • +
              • Update mock unit test dependency requirement (PYTHON-591)

              • +
              • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

              • +
              • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

              • +
              • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

              • +
              • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

              • +
              • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

              • +
              • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix geventreactor with SSL support (PYTHON-600)

              • +
              • Don’t downgrade protocol version if explicitly set (PYTHON-537)

              • +
              • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

              • +
              • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

              • +
              • Libev loop shutdown race (PYTHON-578)

              • +
              • Include aliases in DCT type string (PYTHON-579)

              • +
              • cqlengine: Comparison operators for Columns (PYTHON-595)

              • +
              • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

              • +
              • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

              • +
              • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

              • +
              • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

              • +
              • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

              • +
              • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

              • +
              +
              +
              +
              +

              3.5.0

              +

              June 27, 2016

              +
              +

              Features

              +
                +
              • Optional Execution Profiles for the core driver (PYTHON-569)

              • +
              • API to get the host metadata associated with the control connection node (PYTHON-583)

              • +
              • Expose CDC option in table metadata CQL (PYTHON-593)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Clean up Asyncore socket map when fork is detected (PYTHON-577)

              • +
              • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

              • +
              +
              +
              +
              +

              3.4.1

              +

              May 26, 2016

              +
              +

              Bug Fixes

              +
                +
              • Gevent connection closes on IO timeout (PYTHON-573)

              • +
              • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

              • +
              +
              +
              +
              +

              3.4.0

              +

              May 24, 2016

              +
              +

              Features

              +
                +
              • Include DSE version and workload in Host data (PYTHON-555)

              • +
              • Add a context manager to Cluster and Session (PYTHON-521)

              • +
              • Better Error Message for Unsupported Protocol Version (PYTHON-157)

              • +
              • Make the error message explicitly state when an error comes from the server (PYTHON-412)

              • +
              • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

              • +
              • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

              • +
              • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

              • +
              • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

              • +
              • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

              • +
              • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

              • +
              • Write docs around working with datetime and timezones (PYTHON-394)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • High CPU utilization when using asyncore event loop (PYTHON-239)

              • +
              • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

              • +
              • Make stress scripts Python 2.6 compatible (PYTHON-434)

              • +
              • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

              • +
              • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

              • +
              • Cluster and Session do not GC after leaving scope (PYTHON-135)

              • +
              • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

              • +
              • Reprepare on_up with many clients causes node overload (PYTHON-556)

              • +
              • None inserted into host map when control connection node is decommissioned (PYTHON-548)

              • +
              • weakref.ref does not accept keyword arguments (github #585)

              • +
              +
              +
              +
              +

              3.3.0

              +

              May 2, 2016

              +
              +

              Features

              +
                +
              • Add an AddressTranslator interface (PYTHON-69)

              • +
              • New Retry Policy Decision - try next host (PYTHON-285)

              • +
              • Don’t mark host down on timeout (PYTHON-286)

              • +
              • SSL hostname verification (PYTHON-296)

              • +
              • Add C* version to metadata or cluster objects (PYTHON-301)

              • +
              • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

              • +
              • Expose listen_address of node we get ring information from (PYTHON-332)

              • +
              • Use A-record with multiple IPs for contact points (PYTHON-415)

              • +
              • Custom consistency level for populating query traces (PYTHON-435)

              • +
              • Normalize Server Exception Types (PYTHON-443)

              • +
              • Propagate exception message when DDL schema agreement fails (PYTHON-444)

              • +
              • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

              • +
              • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

              • +
              • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

              • +
              • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

              • +
              • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

              • +
              • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

              • +
              +
              +
              +
              +

              3.2.2

              +

              April 19, 2016

              +
                +
              • Fix counter save-after-no-update (PYTHON-547)

              • +
              +
              +
              +

              3.2.1

              +

              April 13, 2016

              +
                +
              • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

              • +
              +
              +
              +

              3.2.0

              +

              April 12, 2016

              +
              +

              Features

              +
                +
              • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

              • +
              • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

              • +
              • cqlengine: support non-equal conditions for LWT (PYTHON-528)

              • +
              • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

              • +
              • cqlengine: token-aware routing for mapper statements (PYTHON-535)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

              • +
              • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

              • +
              • comparing models with datetime fields fail #79 (PYTHON-273)

              • +
              • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

              • +
              • db_field is not always respected with UpdateStatement (PYTHON-530)

              • +
              • Sync_table fails on column.Set with secondary index (PYTHON-533)

              • +
              +
              +
              +
              +

              3.1.1

              +

              March 14, 2016

              +
              +

              Bug Fixes

              +
                +
              • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

              • +
              +
              +
              +
              +

              3.1.0

              +

              March 10, 2016

              +
              +

              Features

              +
                +
              • Pass name of server auth class to AuthProvider (PYTHON-454)

              • +
              • Surface schema agreed flag for DDL statements (PYTHON-458)

              • +
              • Automatically convert float and int to Decimal on serialization (PYTHON-468)

              • +
              • Eventlet Reactor IO improvement (PYTHON-495)

              • +
              • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

              • +
              • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

              • +
              • Add Session.default_serial_consistency_level (github #510)

              • +
              • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

              • +
              • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

              • +
              • cqlengine: Add DISTINCT query operator (PYTHON-266)

              • +
              • cqlengine: Tuple cqlengine api (PYTHON-306)

              • +
              • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

              • +
              • cqlengine: Allow nested container types (PYTHON-478)

              • +
              • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

              • +
              • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

              • +
              • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

              • +
              • Overflow when decoding large collections (cython) (PYTHON-459)

              • +
              • Timer heap comparison issue with Python 3 (github #466)

              • +
              • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

              • +
              • Decode error encountered when cython deserializing large map results (PYTHON-459)

              • +
              • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

              • +
              • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

              • +
              • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

              • +
              • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

              • +
              • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

              • +
              • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

              • +
              • cqlengine: db_field breaks UserType (PYTHON-346)

              • +
              • cqlengine: UDT badly quoted (PYTHON-347)

              • +
              • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

              • +
              • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

              • +
              • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

              • +
              • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

              • +
              • cqlengine: Better error for management functions when no connection set (PYTHON-451)

              • +
              • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

              • +
              • cqlengine: Fix inserting None for model save (PYTHON-475)

              • +
              • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

              • +
              • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

              • +
              • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

              • +
              +
              +
              +

              Other

              +
                +
              • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

              • +
              • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

              • +
              +
              +
              +
              +

              3.0.0

              +

              November 24, 2015

              +
              +

              Features

              +
                +
              • Support datetime.date objects as a DateType (PYTHON-212)

              • +
              • Add Cluster.update_view_metadata (PYTHON-407)

              • +
              • QueryTrace option to populate partial trace sessions (PYTHON-438)

              • +
              • Attach column names to ResultSet (PYTHON-439)

              • +
              • Change default consistency level to LOCAL_ONE

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

              • +
              • Evict UDTs from UserType cache on change (PYTHON-226)

              • +
              • Make sure query strings are always encoded UTF-8 (PYTHON-334)

              • +
              • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

              • +
              • UDT CQL encoding does not work for unicode values (PYTHON-353)

              • +
              • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

              • +
              • Cython integer overflow on decimal type deserialization (PYTHON-433)

              • +
              • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

              • +
              +
              +
              +
              +

              3.0.0rc1

              +

              November 9, 2015

              +
              +

              Features

              +
                +
              • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

              • +
              • Remove deprecated features (PYTHON-292)

              • +
              • Don’t assign trace data to Statements (PYTHON-318)

              • +
              • Normalize results return (PYTHON-368)

              • +
              • Process Materialized View Metadata/Events (PYTHON-371)

              • +
              • Remove blist as soft dependency (PYTHON-385)

              • +
              • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

              • +
              • Normalize CQL query/export in metadata model (PYTHON-405)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Implementation of named arguments bind is non-pythonic (PYTHON-178)

              • +
              • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

              • +
              • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

              • +
              • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

              • +
              • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

              • +
              +
              +
              +
              +

              2.7.2

              +

              September 14, 2015

              +
              +

              Bug Fixes

              +
                +
              • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

              • +
              • Remove futures dep. for Python 3 (PYTHON-393)

              • +
              • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

              • +
              • Unit test runtime issues (PYTHON-397,398)

              • +
              +
              +
              +
              +

              2.7.1

              +

              August 25, 2015

              +
              +

              Bug Fixes

              +
                +
              • Explicitly include extension source files in Manifest

              • +
              +
              +
              +
              +

              2.7.0

              +

              August 25, 2015

              +

              Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

              +
              +

              Features

              +
                +
              • General Performance Improvements for Throughput (PYTHON-283)

              • +
              • Improve synchronous request performance with Timers (PYTHON-108)

              • +
              • Enable C Extensions for PyPy Runtime (PYTHON-357)

              • +
              • Refactor SerDes functionality for pluggable interface (PYTHON-313)

              • +
              • Cython SerDes Extension (PYTHON-377)

              • +
              • Accept iterators/generators for execute_concurrent() (PYTHON-123)

              • +
              • cythonize existing modules (PYTHON-342)

              • +
              • Pure Python murmur3 implementation (PYTHON-363)

              • +
              • Make driver tolerant of inconsistent metadata (PYTHON-370)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

              • +
              • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

              • +
              • Blocking connect does not use connect_timeout (PYTHON-381)

              • +
              • Properly protect partition key in CQL export (PYTHON-375)

              • +
              • Trigger error callbacks on timeout (PYTHON-294)

              • +
              +
              +
              +
              +

              2.6.0

              +

              July 20, 2015

              +
              +

              Bug Fixes

              +
                +
              • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

              • +
              +
              +
              +
              +

              2.6.0c2

              +

              June 24, 2015

              +
              +

              Features

              +
                +
              • Automatic Protocol Version Downgrade (PYTHON-240)

              • +
              • cqlengine Python 2.6 compatibility (PYTHON-288)

              • +
              • Double-dollar string quote UDF body (PYTHON-345)

              • +
              • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Avoid stall while connecting to mixed version cluster (PYTHON-303)

              • +
              • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

              • +
              • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

              • +
              • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

              • +
              • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

              • +
              +
              +
              +
              +

              2.6.0c1

              +

              June 4, 2015

              +

              This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

              +
              +

              Features

              +
                +
              • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

              • +
              • Configuration option for connection timeout (PYTHON-206)

              • +
              • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

              • +
              • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

              • +
              • Implement new request failure messages in protocol v4+ (PYTHON-238)

              • +
              • Metadata model now maps index meta by index name (PYTHON-241)

              • +
              • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

              • +
              • cqle: add Double column type and remove Float overload (PYTHON-246)

              • +
              • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

              • +
              • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

              • +
              • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

              • +
              • Save trace id even when trace complete times out (PYTHON-302)

              • +
              • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

              • +
              • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

              • +
              • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

              • +
              • Expose CQL keywords in API (PYTHON-324)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • IPv6 address support on Windows (PYTHON-20)

              • +
              • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

              • +
              • cqle: Quote keywords properly in table management functions (PYTHON-244)

              • +
              • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

              • +
              • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

              • +
              • Make protocol read_inet work for Windows (PYTHON-309)

              • +
              • cqle: Correct encoding for nested types (PYTHON-311)

              • +
              • Update list of CQL keywords used quoting identifiers (PYTHON-319)

              • +
              • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

              • +
              • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

              • +
              +
              +
              +
              +

              2.5.1

              +

              April 23, 2015

              +
              +

              Bug Fixes

              +
                +
              • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

              • +
              • Fix race condition in node/token rebuild (PYTHON-298)

              • +
              • Set and send serial consistency parameter (PYTHON-299)

              • +
              +
              +
              +
              +

              2.5.0

              +

              March 30, 2015

              +
              +

              Features

              +
                +
              • Integrated cqlengine object mapping package

              • +
              • Utility functions for converting timeuuids and datetime (PYTHON-99)

              • +
              • Schema metadata fetch window randomized, config options added (PYTHON-202)

              • +
              • Support for new Date and Time Cassandra types (PYTHON-190)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

              • +
              • Thread exception during GIL cleanup (PYTHON-229)

              • +
              • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

              • +
              • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

              • +
              • Support reading CompositeType data (PYTHON-234)

              • +
              • Preserve float precision in CQL encoding (PYTHON-243)

              • +
              +
              +
              +
              +

              2.1.4

              +

              January 26, 2015

              +
              +

              Features

              +
                +
              • SaslAuthenticator for Kerberos support (PYTHON-109)

              • +
              • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

              • +
              • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

              • +
              • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

              • +
              • Add eventlet connection support (PYTHON-194)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Schema meta fix for complex thrift tables (PYTHON-191)

              • +
              • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

              • +
              • Resolve stream ID leak on set_keyspace (PYTHON-195)

              • +
              • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

              • +
              • Resolve stream id collision when using SASL auth (PYTHON-210)

              • +
              • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

              • +
              +
              +
              +
              +

              2.1.3

              +

              December 16, 2014

              +
              +

              Features

              +
                +
              • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

              • +
              • Avoid connecting to peer with incomplete metadata (PYTHON-163)

              • +
              • Add SSL support to gevent reactor (PYTHON-174)

              • +
              • Use control connection timeout in wait for schema agreement (PYTHON-175)

              • +
              • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

              • +
              • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Support large negative timestamps on Windows (PYTHON-119)

              • +
              • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

              • +
              • Retain table metadata following keyspace meta refresh (PYTHON-173)

              • +
              • Use a timeout when preparing a statement for all nodes (PYTHON-179)

              • +
              • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

              • +
              • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

              • +
              • Correct routing key encoding for composite keys (PYTHON-184)

              • +
              • Include compression option in schema export string when disabled (PYTHON-187)

              • +
              +
              +
              +
              +

              2.1.2

              +

              October 16, 2014

              +
              +

              Features

              +
                +
              • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

              • +
              • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

              • +
              • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

              • +
              • Handle Unauthorized message on schema_triggers query (PYTHON-155)

              • +
              • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

              • +
              • Support CUSTOM index metadata and string export (PYTHON-165)

              • +
              +
              +
              +
              +

              2.1.1

              +

              September 11, 2014

              +
              +

              Features

              +
                +
              • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

              • +
              • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

              • +
              • Keep timeout for paged results (PYTHON-150)

              • +
              +
              +
              +

              Other

              +
                +
              • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

              • +
              +
              +
              +
              +

              2.1.0

              +

              August 7, 2014

              +
              +

              Bug Fixes

              +
                +
              • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

              • +
              • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

              • +
              +
              +
              +
              +

              2.1.0c1

              +

              July 25, 2014

              +
              +

              Bug Fixes

              +
                +
              • Properly specify UDTs for columns in CREATE TABLE statements

              • +
              • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

              • +
              • Don’t ignore fetch_size arguments to Statement constructors (github-151)

              • +
              • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

              • +
              • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

              • +
              • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

              • +
              • Raise TypeError when a string is used for contact_points (github #164)

              • +
              • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

              • +
              +
              +
              +

              Other

              +
                +
              • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

              • +
              +
              +
              +
              +

              2.1.0b1

              +

              July 11, 2014

              +

              This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

              +
              +

              Features

              +
                +
              • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

              • +
              • Support for user-defined types (Cassandra 2.1+)

              • +
              • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

              • +
              • Protocol-level client-side timestamps (see Session.use_client_timestamp)

              • +
              • Overridable type encoding for non-prepared statements (see Session.encoders)

              • +
              • Configurable serial consistency levels for batch statements

              • +
              • Use io.BytesIO for reduced CPU consumption (github #143)

              • +
              • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

              • +
              • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

              • +
              • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

              • +
              • Don’t share prepared statement lock across Cluster instances

              • +
              • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

              • +
              • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

              • +
              • Properly defunct connections after protocol errors

              • +
              • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

              • +
              • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

              • +
              • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

              • +
              • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

              • +
              • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

              • +
              • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

              • +
              • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

              • +
              +
              +
              +
              +

              2.0.2

              +

              June 10, 2014

              +
              +

              Bug Fixes

              +
                +
              • Add six to requirements.txt

              • +
              • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

              • +
              • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

              • +
              • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

              • +
              • Add python-six to debian dependencies, move python-blist to recommends

              • +
              • Fix memory leak when libev connections are created and +destroyed (github #93)

              • +
              • Ensure token map is rebuilt when hosts are removed from the cluster

              • +
              +
              +
              +
              +

              2.0.1

              +

              May 28, 2014

              +
              +

              Bug Fixes

              +
                +
              • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

              • +
              +
              +
              +
              +

              2.0.0

              +

              May 28, 2014

              +
              +

              Features

              +
                +
              • Make libev C extension Python3-compatible (PYTHON-70)

              • +
              • Support v2 protocol authentication (PYTHON-73, github #125)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix murmur3 C extension compilation under Python3.4 (github #124)

              • +
              +
              +
              +

              Merged From 1.x

              +
              +

              Features

              +
                +
              • Add Session.default_consistency_level (PYTHON-14)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

              • +
              • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

              • +
              • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

              • +
              • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

              • +
              • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

              • +
              • Avoid rebuilding token metadata when cluster topology has not +actually changed

              • +
              • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

              • +
              +
              +
              +

              Other

              +
                +
              • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

              • +
              +
              +
              +
              +
              +

              2.0.0b1

              +

              May 6, 2014

              +
              +

              Upgrading from 1.x

              +

              Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

              +

              If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

              +
              +

              cluster = Cluster(…, protocol_version=1)

              +
              +
              +
              +

              Features

              +
                +
              • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

              • +
              • Support for Python 3.3 and 3.4

              • +
              • Allow a default query timeout to be set per-Session

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

              • +
              +
              +
              +

              Deprecations

              +

              The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

              +
                +
              • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

              • +
              • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

              • +
              • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

              • +
              • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

              • +
              +

              Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

              +
              +
              +
              +

              1.1.2

              +

              May 8, 2014

              +
              +

              Features

              +
                +
              • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

              • +
              • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

              • +
              • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

              • +
              • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

              • +
              • Handle exhausted ReconnectionPolicy schedule correctly

              • +
              +
              +
              +

              Other

              +
                +
              • Don’t log at ERROR when a connection is closed during the startup +communications

              • +
              • Mke scales, blist optional dependencies

              • +
              +
              +
              +
              +

              1.1.1

              +

              April 16, 2014

              +
              +

              Bug Fixes

              +
                +
              • Fix unconditional import of nose in setup.py (github #111)

              • +
              +
              +
              +
              +

              1.1.0

              +

              April 16, 2014

              +
              +

              Features

              +
                +
              • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

              • +
              • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

              • +
              • Add debian packaging (github issue #101)

              • +
              • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

              • +
              • Lowercase boolean literals when generating schemas

              • +
              • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

              • +
              • Don’t reconnect the control connection every time Cluster.connect() is +called

              • +
              • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

              • +
              • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

              • +
              • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

              • +
              • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

              • +
              • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

              • +
              +
              +
              +

              Other

              +
                +
              • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

              • +
              • Better error message when libevwrapper is not found

              • +
              • Only try to import scales when metrics are enabled (github issue #92)

              • +
              • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

              • +
              • Issue warning log when schema versions do not match

              • +
              +
              +
              +
              +

              1.0.2

              +

              March 4, 2014

              +
              +

              Bug Fixes

              +
                +
              • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

              • +
              • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

              • +
              • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

              • +
              • Handle latest table options when parsing the schema and generating +CREATE statements.

              • +
              • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

              • +
              +
              +
              +

              Other

              +
                +
              • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

              • +
              • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

              • +
              • More consistent type checking for query parameters

              • +
              • Add option to a return special object for empty string values for non-string +columns

              • +
              +
              +
              +
              +

              1.0.1

              +

              Feb 19, 2014

              +
              +

              Bug Fixes

              +
                +
              • Include table indexes in KeyspaceMetadata.export_as_string()

              • +
              • Fix broken token awareness on ByteOrderedPartitioner

              • +
              • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

              • +
              • Handle “custom” types (such as the replaced DateType) correctly

              • +
              • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

              • +
              • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

              • +
              • Handle data that is already utf8-encoded for UTF8Type values

              • +
              • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

              • +
              • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

              • +
              +
              +
              +

              Other

              +
                +
              • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

              • +
              • Add details about errors and the last queried host to OperationTimedOut

              • +
              +
              +
              +
              +

              1.0.0 Final

              +

              Jan 29, 2014

              +
              +

              Bug Fixes

              +
                +
              • Prevent leak of Scheduler thread (even with proper shutdown)

              • +
              • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

              • +
              • Hold strong reference to prepared statement while executing it to avoid +garbage collection

              • +
              • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

              • +
              • Fix bad handling of nodes that have been removed from the cluster

              • +
              • Properly escape string types within cql collections

              • +
              • Handle setting the same keyspace twice in a row

              • +
              • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

              • +
              • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

              • +
              • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

              • +
              • Fix endless hanging of some requests when using the libev reactor

              • +
              • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

              • +
              • Generators map to CQL lists, not key sequences

              • +
              • Always defunct connections when an internal operation fails

              • +
              • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

              • +
              • Avoid potential double-erroring of callbacks when a connection +becomes defunct

              • +
              +
              +
              +

              Features

              +
                +
              • Add default query timeout to Session

              • +
              • Add timeout parameter to Session.execute()

              • +
              • Add WhiteListRoundRobinPolicy as a load balancing policy option

              • +
              • Support for consistency level LOCAL_ONE

              • +
              • Make the backoff for fetching traces exponentially increasing and +configurable

              • +
              +
              +
              +

              Other

              +
                +
              • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

              • +
              • Add encoder mapping for OrderedDict

              • +
              • Use timeouts on all control connection queries

              • +
              • Benchmark improvements, including command line options and eay +multithreading support

              • +
              • Reduced lock contention when using the asyncore reactor

              • +
              • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

              • +
              • Add requirements.txt and test-requirements.txt

              • +
              • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

              • +
              +
              +
              +
              +

              1.0.0b7

              +

              Nov 12, 2013

              +

              This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

              +
              +

              Features

              +
                +
              • Add timeout kwarg to ResponseFuture.result()

              • +
              • Create connection pools to all hosts in parallel when initializing +new Sesssions.

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Properly set exception on ResponseFuture when a query fails +against all hosts

              • +
              • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

              • +
              • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

              • +
              • Better error messages for failed Session.prepare() opertaions

              • +
              • Prepare new statements against all hosts in parallel (formerly +sequential)

              • +
              • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

              • +
              • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

              • +
              • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

              • +
              • Throttle trashing of underutilized connections to avoid trashing newly +created connections

              • +
              • Fix race condition which could result in trashed connections being closed +before the last operations had completed

              • +
              • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

              • +
              • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

              • +
              • Correctly handle large messages through libev

              • +
              • Add timeout to schema agreement check queries

              • +
              • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

              • +
              +
              +
              +

              Other

              +
                +
              • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

              • +
              • Better debug logging around connection management

              • +
              • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

              • +
              +
              +
              +
              +

              1.0.0b6

              +

              Oct 22, 2013

              +
              +

              Bug Fixes

              +
                +
              • Use lazy string formatting when logging

              • +
              • Avoid several deadlock scenarios, especially when nodes go down

              • +
              • Avoid trashing newly created connections due to insufficient traffic

              • +
              • Gracefully handle un-handled Exceptions when erroring callbacks

              • +
              +
              +
              +

              Other

              +
                +
              • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

              • +
              +
              +
              +
              +

              1.0.0b5

              +

              Oct 10, 2013

              +
              +

              Features

              +
                +
              • SSL support

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Avoid KeyError when building replica map for NetworkTopologyStrategy

              • +
              • Work around python bug which causes deadlock when a thread imports +the utf8 module

              • +
              • Handle no blist library, which is not compatible with pypy

              • +
              • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

              • +
              +
              +
              +

              Other

              +
                +
              • Switch packaging from Distribute to setuptools, improved C extension +support

              • +
              • Use PEP 386 compliant beta and post-release versions

              • +
              +
              +
              +
              +

              1.0.0-beta4

              +

              Sep 24, 2013

              +
              +

              Features

              +
                +
              • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

              • +
              • Add cql_version kwarg to Cluster.__init__

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

              • +
              • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

              • +
              +
              +
              +
              +

              1.0.0-beta3

              +

              Sep 20, 2013

              +
              +

              Features

              +
                +
              • Support for LZ4 compression (Cassandra 2.0+)

              • +
              • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

              • +
              +
              +
              +

              Bug Fixes

              +
                +
              • Fix libev include path for CentOS

              • +
              • Fix varint packing of the value 0

              • +
              • Correctly pack unicode values

              • +
              • Don’t attempt to return failed connections to the pool when a final result +is set

              • +
              • Fix bad iteration of connection credentials

              • +
              • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

              • +
              • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

              • +
              • Boolean constants shouldn’t be surrounded by single quotes

              • +
              • Avoid a potential loss of precision on float constants due to string +formatting

              • +
              • Actually utilize non-standard ports set on Cluster objects

              • +
              • Fix export of schema as a set of CQL queries

              • +
              +
              +
              +

              Other

              +
                +
              • Use cStringIO for connection buffer for better performance

              • +
              • Add __repr__ method for Statement classes

              • +
              • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

              • +
              • Make all tests compatible with Python 2.6

              • +
              • Add 1s timeout for opening new connections

              • +
              +
              +
              +
              +

              1.0.0-beta2

              +

              Aug 19, 2013

              +
              +

              Bug Fixes

              +
                +
              • Fix pip packaging

              • +
              +
              +
              +
              +

              1.0.0-beta

              +

              Aug 16, 2013

              +

              Initial release

              +
              +
              + + +
              + + + + + +
              + + +
              +
              +

              +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

              +
              +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/CNAME b/3.26.4-scylla/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/3.26.4-scylla/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/3.26.4-scylla/_sources/CHANGELOG.rst.txt b/3.26.4-scylla/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/3.26.4-scylla/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/3.26.4-scylla/_sources/api/cassandra.rst.txt b/3.26.4-scylla/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/auth.rst.txt b/3.26.4-scylla/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/cluster.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..a9a9d378a4 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_kwargs=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/3.26.4-scylla/_sources/api/cassandra/concurrent.rst.txt b/3.26.4-scylla/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/3.26.4-scylla/_sources/api/cassandra/connection.rst.txt b/3.26.4-scylla/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/3.26.4-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/3.26.4-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/3.26.4-scylla/_sources/api/cassandra/cqlengine/management.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/3.26.4-scylla/_sources/api/cassandra/cqlengine/models.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/3.26.4-scylla/_sources/api/cassandra/cqlengine/query.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/3.26.4-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt b/3.26.4-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..a9b41cbdc2 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,133 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + :noindex: + +.. autoclass:: GraphOptions + :noindex: + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + :noindex: + +.. autoclass:: Result + :members: + :noindex: + +.. autoclass:: Vertex + :members: + :noindex: + +.. autoclass:: VertexProperty + :members: + :noindex: + +.. autoclass:: Edge + :members: + :noindex: + +.. autoclass:: Path + :members: + :noindex: + +.. autoclass:: T + :members: + :noindex: + +.. autoclass:: GraphSON1Serializer + :members: + :noindex: + +.. autoclass:: GraphSON1Deserializer + :noindex: + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + :noindex: diff --git a/3.26.4-scylla/_sources/api/cassandra/decoder.rst.txt b/3.26.4-scylla/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/3.26.4-scylla/_sources/api/cassandra/encoder.rst.txt b/3.26.4-scylla/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/3.26.4-scylla/_sources/api/cassandra/graph.rst.txt b/3.26.4-scylla/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt b/3.26.4-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt b/3.26.4-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt b/3.26.4-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/io/geventreactor.rst.txt b/3.26.4-scylla/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/io/libevreactor.rst.txt b/3.26.4-scylla/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/3.26.4-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt b/3.26.4-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/3.26.4-scylla/_sources/api/cassandra/metadata.rst.txt b/3.26.4-scylla/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..7c1280bcf7 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,93 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: ReplicationFactor + :members: + :exclude-members: create + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/3.26.4-scylla/_sources/api/cassandra/metrics.rst.txt b/3.26.4-scylla/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/policies.rst.txt b/3.26.4-scylla/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/pool.rst.txt b/3.26.4-scylla/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/3.26.4-scylla/_sources/api/cassandra/protocol.rst.txt b/3.26.4-scylla/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/3.26.4-scylla/_sources/api/cassandra/query.rst.txt b/3.26.4-scylla/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/3.26.4-scylla/_sources/api/cassandra/timestamps.rst.txt b/3.26.4-scylla/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/3.26.4-scylla/_sources/api/cassandra/util.rst.txt b/3.26.4-scylla/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/3.26.4-scylla/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/3.26.4-scylla/_sources/api/index.rst.txt b/3.26.4-scylla/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/3.26.4-scylla/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/3.26.4-scylla/_sources/cqlengine/batches.rst.txt b/3.26.4-scylla/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/3.26.4-scylla/_sources/cqlengine/connections.rst.txt b/3.26.4-scylla/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/3.26.4-scylla/_sources/cqlengine/faq.rst.txt b/3.26.4-scylla/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/3.26.4-scylla/_sources/cqlengine/models.rst.txt b/3.26.4-scylla/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/3.26.4-scylla/_sources/cqlengine/queryset.rst.txt b/3.26.4-scylla/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/3.26.4-scylla/_sources/cqlengine/third-party.rst.txt b/3.26.4-scylla/_sources/cqlengine/third-party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/third-party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/3.26.4-scylla/_sources/cqlengine/upgrade-guide.rst.txt b/3.26.4-scylla/_sources/cqlengine/upgrade-guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/3.26.4-scylla/_sources/cqlengine/upgrade-guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/3.26.4-scylla/_sources/dates-and-times.rst.txt b/3.26.4-scylla/_sources/dates-and-times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/3.26.4-scylla/_sources/dates-and-times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/3.26.4-scylla/_sources/execution-profiles.rst.txt b/3.26.4-scylla/_sources/execution-profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/3.26.4-scylla/_sources/execution-profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/3.26.4-scylla/_sources/faq.rst.txt b/3.26.4-scylla/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/3.26.4-scylla/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/3.26.4-scylla/_sources/getting-started.rst.txt b/3.26.4-scylla/_sources/getting-started.rst.txt new file mode 100644 index 0000000000..59a2acbd04 --- /dev/null +++ b/3.26.4-scylla/_sources/getting-started.rst.txt @@ -0,0 +1,479 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to a Cluster +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +First, make sure you have the Cassandra driver properly :doc:`installed `. + +Connecting to Cassandra ++++++++++++++++++++++++ +The simplest way to create a :class:`~.Cluster` is like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +Session Keyspace +---------------- +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Execution Profiles +------------------ +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +--------------------------------- +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +---------------- +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +-------------------- +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +---------------------------------------------------- +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +--------------------- + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/3.26.4-scylla/_sources/index.rst.txt b/3.26.4-scylla/_sources/index.rst.txt new file mode 100644 index 0000000000..c21d293b6f --- /dev/null +++ b/3.26.4-scylla/_sources/index.rst.txt @@ -0,0 +1,107 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting-started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla-specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution-profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object-mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query-paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user-defined-types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates-and-times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla-cloud` + Connect to ScyllaDB Cloud + +:doc:`scylla-cloud-serverless` + Connect to ScyllaDB Cloud Serverless + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting-started + scylla-specific + upgrading + execution-profiles + performance + query-paging + lwt + security + user-defined-types + object-mapper + dates-and-times + scylla-cloud + scylla-cloud-serverless + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. diff --git a/3.26.4-scylla/_sources/installation.rst.txt b/3.26.4-scylla/_sources/installation.rst.txt new file mode 100644 index 0000000000..4996a02c1b --- /dev/null +++ b/3.26.4-scylla/_sources/installation.rst.txt @@ -0,0 +1,234 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/3.26.4-scylla/_sources/lwt.rst.txt b/3.26.4-scylla/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/3.26.4-scylla/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/3.26.4-scylla/_sources/object-mapper.rst.txt b/3.26.4-scylla/_sources/object-mapper.rst.txt new file mode 100644 index 0000000000..421be246ac --- /dev/null +++ b/3.26.4-scylla/_sources/object-mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade-guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third-party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade-guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third-party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/3.26.4-scylla/_sources/performance.rst.txt b/3.26.4-scylla/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/3.26.4-scylla/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/3.26.4-scylla/_sources/query-paging.rst.txt b/3.26.4-scylla/_sources/query-paging.rst.txt new file mode 100644 index 0000000000..23ee2c1129 --- /dev/null +++ b/3.26.4-scylla/_sources/query-paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_state'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/3.26.4-scylla/_sources/scylla-cloud-serverless.rst.txt b/3.26.4-scylla/_sources/scylla-cloud-serverless.rst.txt new file mode 100644 index 0000000000..4e0bafd1b8 --- /dev/null +++ b/3.26.4-scylla/_sources/scylla-cloud-serverless.rst.txt @@ -0,0 +1,49 @@ +ScyllaDB Cloud Serverless +------------------------- + +With ScyllaDB Cloud, you can deploy `serverless databases `_. +The Python driver allows you to connect to a serverless database by utilizing the connection bundle you can download via the **Connect>Python** tab in the Cloud application. +The connection bundle is a YAML file with connection and credential information for your cluster. + +Connecting to a ScyllaDB Cloud serverless database is very similar to a standard connection to a ScyllaDB database. + +Here’s a short program that connects to a ScyllaDB Cloud serverless database and prints metadata about the cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy + + PATH_TO_BUNDLE_YAML = '/file/downloaded/from/cloud/connect-bundle.yaml' + + + def get_cluster(): + profile = ExecutionProfile( + load_balancing_policy=TokenAwarePolicy( + DCAwareRoundRobinPolicy(local_dc='us-east-1') + ) + ) + + return Cluster( + execution_profiles={EXEC_PROFILE_DEFAULT: profile}, + scylla_cloud=PATH_TO_BUNDLE_YAML, + ) + + + print('Connecting to cluster') + cluster = get_cluster() + session = cluster.connect() + + print('Connected to cluster', cluster.metadata.cluster_name) + + print('Getting metadata') + for host in cluster.metadata.all_hosts(): + print('Datacenter: {}; Host: {}; Rack: {}'.format( + host.datacenter, host.address, host.rack) + ) + + cluster.shutdown() + +By providing the ``scylla_cloud`` parameter to the :class:`~.Cluster` constructor, +the driver can set up the connection based on the endpoint and credential information +stored in your downloaded ScyllaDB Cloud Serverless connection bundle. \ No newline at end of file diff --git a/3.26.4-scylla/_sources/scylla-cloud.rst.txt b/3.26.4-scylla/_sources/scylla-cloud.rst.txt new file mode 100644 index 0000000000..b5eb6df798 --- /dev/null +++ b/3.26.4-scylla/_sources/scylla-cloud.rst.txt @@ -0,0 +1,5 @@ +ScyllaDB Cloud +-------------- + +To connect to a `ScyllaDB Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/3.26.4-scylla/_sources/scylla-specific.rst.txt b/3.26.4-scylla/_sources/scylla-specific.rst.txt new file mode 100644 index 0000000000..f830235088 --- /dev/null +++ b/3.26.4-scylla/_sources/scylla-specific.rst.txt @@ -0,0 +1,111 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +See the configuration of ``native_shard_aware_transport_port`` and ``native_shard_aware_transport_port_ssl`` on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``shard_aware_options`` + + Setting it to ``dict(disable=True)`` would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections + + Other option is to configure scylla by setting ``enable_shard_aware_drivers: false`` on scylla.yaml. + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(shard_aware_options=dict(disable=True)) + session = cluster.connect() + + assert not cluster.is_shard_aware(), "Shard aware should be disabled" + + # or just disable the shard aware port logic + cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True)) + session = cluster.connect() + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Error Types +-------------------- + +* ``SCYLLA_RATE_LIMIT_ERROR`` Error + + The ScyllaDB 5.1 introduced a feature called per-partition rate limiting. In case the (user defined) per-partition rate limit is exceeded, the database will start returning a Scylla-specific type of error: RateLimitReached. + +.. code:: python + + from cassandra import RateLimitReached + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} + """) + + session.execute("USE keyspace1") + session.execute(""" + CREATE TABLE tbl (pk int PRIMARY KEY, v int) + WITH per_partition_rate_limit = {'max_writes_per_second': 1} + """) + + prepared = session.prepare(""" + INSERT INTO tbl (pk, v) VALUES (?, ?) + """) + + try: + for _ in range(1000): + self.session.execute(prepared.bind((123, 456))) + except RateLimitReached: + raise diff --git a/3.26.4-scylla/_sources/security.rst.txt b/3.26.4-scylla/_sources/security.rst.txt new file mode 100644 index 0000000000..c30189562f --- /dev/null +++ b/3.26.4-scylla/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS + + ssl_context = SSLContext(PROTOCOL_TLS) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_2_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLS`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLS, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLS, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/3.26.4-scylla/_sources/upgrading.rst.txt b/3.26.4-scylla/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..bc963e6722 --- /dev/null +++ b/3.26.4-scylla/_sources/upgrading.rst.txt @@ -0,0 +1,380 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +--------------------------- +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +-------------------------------------------------------- +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +------------------------------------------------ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/3.26.4-scylla/_sources/user-defined-types.rst.txt b/3.26.4-scylla/_sources/user-defined-types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/3.26.4-scylla/_sources/user-defined-types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
              )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
              )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
              )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/3.26.4-scylla/_static/basic.css b/3.26.4-scylla/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/3.26.4-scylla/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/3.26.4-scylla/_static/check-solid.svg b/3.26.4-scylla/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/3.26.4-scylla/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.26.4-scylla/_static/clipboard.min.js b/3.26.4-scylla/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/3.26.4-scylla/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/3.26.4-scylla/_static/copybutton.css b/3.26.4-scylla/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/3.26.4-scylla/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

              Short

              + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/3.26.4-scylla/_static/copybutton.js b/3.26.4-scylla/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/3.26.4-scylla/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/3.26.4-scylla/_static/copybutton_funcs.js b/3.26.4-scylla/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/3.26.4-scylla/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/3.26.4-scylla/_static/css/main.css b/3.26.4-scylla/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/3.26.4-scylla/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/3.26.4-scylla/_static/doctools.js b/3.26.4-scylla/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/3.26.4-scylla/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/3.26.4-scylla/_static/documentation_options.js b/3.26.4-scylla/_static/documentation_options.js new file mode 100644 index 0000000000..52b149be9b --- /dev/null +++ b/3.26.4-scylla/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.26.4', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/3.26.4-scylla/_static/file.png b/3.26.4-scylla/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/3.26.4-scylla/_static/file.png differ diff --git a/3.26.4-scylla/_static/img/banner-background.svg b/3.26.4-scylla/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/3.26.4-scylla/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/favicon-228x228.png b/3.26.4-scylla/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/3.26.4-scylla/_static/img/favicon-228x228.png differ diff --git a/3.26.4-scylla/_static/img/favicon-32x32.png b/3.26.4-scylla/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/3.26.4-scylla/_static/img/favicon-32x32.png differ diff --git a/3.26.4-scylla/_static/img/favicon.ico b/3.26.4-scylla/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/3.26.4-scylla/_static/img/favicon.ico differ diff --git a/3.26.4-scylla/_static/img/icons/icon-about-team.svg b/3.26.4-scylla/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/3.26.4-scylla/_static/img/icons/icon-about-us-m.svg b/3.26.4-scylla/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-about-us.svg b/3.26.4-scylla/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-alternator.svg b/3.26.4-scylla/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-apps.svg b/3.26.4-scylla/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-architecture.svg b/3.26.4-scylla/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/3.26.4-scylla/_static/img/icons/icon-benchmarks.svg b/3.26.4-scylla/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/3.26.4-scylla/_static/img/icons/icon-blog.svg b/3.26.4-scylla/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/3.26.4-scylla/_static/img/icons/icon-careers.svg b/3.26.4-scylla/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/3.26.4-scylla/_static/img/icons/icon-chevron-left.svg b/3.26.4-scylla/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-chevron-right.svg b/3.26.4-scylla/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-circe.svg b/3.26.4-scylla/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-clock.svg b/3.26.4-scylla/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-close.svg b/3.26.4-scylla/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-cloud-docs.svg b/3.26.4-scylla/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-cloud.svg b/3.26.4-scylla/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-comparison.svg b/3.26.4-scylla/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/3.26.4-scylla/_static/img/icons/icon-contact-us.svg b/3.26.4-scylla/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/3.26.4-scylla/_static/img/icons/icon-developers-blog.svg b/3.26.4-scylla/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/3.26.4-scylla/_static/img/icons/icon-docs.svg b/3.26.4-scylla/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/3.26.4-scylla/_static/img/icons/icon-enterprise-m.svg b/3.26.4-scylla/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-enterprise.svg b/3.26.4-scylla/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-events.svg b/3.26.4-scylla/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/3.26.4-scylla/_static/img/icons/icon-exclamation.svg b/3.26.4-scylla/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-expand.svg b/3.26.4-scylla/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-forum.svg b/3.26.4-scylla/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-getting-started.svg b/3.26.4-scylla/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-glossary.svg b/3.26.4-scylla/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-home.svg b/3.26.4-scylla/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-infoworld.svg b/3.26.4-scylla/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/3.26.4-scylla/_static/img/icons/icon-integrations.svg b/3.26.4-scylla/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-knowledge-base.svg b/3.26.4-scylla/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-less.svg b/3.26.4-scylla/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-live-test.svg b/3.26.4-scylla/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/3.26.4-scylla/_static/img/icons/icon-mail-list.svg b/3.26.4-scylla/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-manager.svg b/3.26.4-scylla/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/3.26.4-scylla/_static/img/icons/icon-memory-management.svg b/3.26.4-scylla/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/3.26.4-scylla/_static/img/icons/icon-modeling.svg b/3.26.4-scylla/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-monitoring.svg b/3.26.4-scylla/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/3.26.4-scylla/_static/img/icons/icon-networking.svg b/3.26.4-scylla/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/3.26.4-scylla/_static/img/icons/icon-news.svg b/3.26.4-scylla/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/3.26.4-scylla/_static/img/icons/icon-newsletter.svg b/3.26.4-scylla/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/3.26.4-scylla/_static/img/icons/icon-nsql-guides.svg b/3.26.4-scylla/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/3.26.4-scylla/_static/img/icons/icon-open-source.svg b/3.26.4-scylla/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/3.26.4-scylla/_static/img/icons/icon-operator.svg b/3.26.4-scylla/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-overview.svg b/3.26.4-scylla/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/3.26.4-scylla/_static/img/icons/icon-partners.svg b/3.26.4-scylla/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/3.26.4-scylla/_static/img/icons/icon-plus.svg b/3.26.4-scylla/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-pricing.svg b/3.26.4-scylla/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/3.26.4-scylla/_static/img/icons/icon-release-notes.svg b/3.26.4-scylla/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/3.26.4-scylla/_static/img/icons/icon-resource-center.svg b/3.26.4-scylla/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/3.26.4-scylla/_static/img/icons/icon-roadmap.svg b/3.26.4-scylla/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/3.26.4-scylla/_static/img/icons/icon-search.svg b/3.26.4-scylla/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-slack.svg b/3.26.4-scylla/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-stack-overflow.svg b/3.26.4-scylla/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-summit.svg b/3.26.4-scylla/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/icons/icon-support.svg b/3.26.4-scylla/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/3.26.4-scylla/_static/img/icons/icon-tech-talks.svg b/3.26.4-scylla/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/3.26.4-scylla/_static/img/icons/icon-testing.svg b/3.26.4-scylla/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/3.26.4-scylla/_static/img/icons/icon-thumbs-down.svg b/3.26.4-scylla/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-thumbs-up.svg b/3.26.4-scylla/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/3.26.4-scylla/_static/img/icons/icon-tip.svg b/3.26.4-scylla/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-training.svg b/3.26.4-scylla/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/3.26.4-scylla/_static/img/icons/icon-triangle-down.svg b/3.26.4-scylla/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-university.svg b/3.26.4-scylla/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/3.26.4-scylla/_static/img/icons/icon-users-blog.svg b/3.26.4-scylla/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/3.26.4-scylla/_static/img/icons/icon-warning.svg b/3.26.4-scylla/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/icons/icon-webinars.svg b/3.26.4-scylla/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/3.26.4-scylla/_static/img/icons/icon-whitepapers.svg b/3.26.4-scylla/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/3.26.4-scylla/_static/img/icons/icon-workshop.svg b/3.26.4-scylla/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/3.26.4-scylla/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/3.26.4-scylla/_static/img/logo-docs.svg b/3.26.4-scylla/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/3.26.4-scylla/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/logo-scylla-horizontal-RGB.svg b/3.26.4-scylla/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/3.26.4-scylla/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3.26.4-scylla/_static/img/mascots/404.jpg b/3.26.4-scylla/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/404.jpg differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-3monsters.png b/3.26.4-scylla/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-3monsters.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-advisor-crystal.png b/3.26.4-scylla/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-alternator.svg b/3.26.4-scylla/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/3.26.4-scylla/_static/img/mascots/scylla-cloud.svg b/3.26.4-scylla/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/3.26.4-scylla/_static/img/mascots/scylla-computer-3-monsters.png b/3.26.4-scylla/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-computer-headset.png b/3.26.4-scylla/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-computer-headset.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-cup-number-one.png b/3.26.4-scylla/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-docs.svg b/3.26.4-scylla/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/3.26.4-scylla/_static/img/mascots/scylla-drivers.svg b/3.26.4-scylla/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/3.26.4-scylla/_static/img/mascots/scylla-enterprise.svg b/3.26.4-scylla/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/3.26.4-scylla/_static/img/mascots/scylla-forklift-boxes.png b/3.26.4-scylla/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-forklift-migration.png b/3.26.4-scylla/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-gear.png b/3.26.4-scylla/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-gear.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-hardhat.png b/3.26.4-scylla/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-hardhat.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-headband.png b/3.26.4-scylla/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-headband.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-headset.png b/3.26.4-scylla/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-headset.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-hearts.png b/3.26.4-scylla/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-hearts.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-looking-down.png b/3.26.4-scylla/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-looking-down.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-looking-up.png b/3.26.4-scylla/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-looking-up.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png b/3.26.4-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-magnifying-glass.png b/3.26.4-scylla/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-manager.svg b/3.26.4-scylla/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/3.26.4-scylla/_static/img/mascots/scylla-monitor.svg b/3.26.4-scylla/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/3.26.4-scylla/_static/img/mascots/scylla-movement-fast.png b/3.26.4-scylla/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-movement-fast.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-movement.png b/3.26.4-scylla/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-movement.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-onpremise.png b/3.26.4-scylla/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-onpremise.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-opensource.svg b/3.26.4-scylla/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/3.26.4-scylla/_static/img/mascots/scylla-operator.svg b/3.26.4-scylla/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/3.26.4-scylla/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/3.26.4-scylla/_static/img/mascots/scylla-plugin.png b/3.26.4-scylla/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-plugin.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-release-mascot.png b/3.26.4-scylla/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-release-mascot.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-repair.png b/3.26.4-scylla/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-repair.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-server.png b/3.26.4-scylla/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-server.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-sleeping.png b/3.26.4-scylla/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-sleeping.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-tall-measure.png b/3.26.4-scylla/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-tall-measure.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-university.png b/3.26.4-scylla/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-university.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-weights.png b/3.26.4-scylla/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-weights.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-window-cleaning.png b/3.26.4-scylla/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-with-computer-2.png b/3.26.4-scylla/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-with-computer.png b/3.26.4-scylla/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-with-computer.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-with-linux.png b/3.26.4-scylla/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-with-linux.png differ diff --git a/3.26.4-scylla/_static/img/mascots/scylla-writting.png b/3.26.4-scylla/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/3.26.4-scylla/_static/img/mascots/scylla-writting.png differ diff --git a/3.26.4-scylla/_static/img/menu.svg b/3.26.4-scylla/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/3.26.4-scylla/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/3.26.4-scylla/_static/js/main.bundle.js b/3.26.4-scylla/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/3.26.4-scylla/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
            • Back
            • ',backButtonPosition:"top",wrapper:"
              ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                "],col:[2,"","
                "],tr:[2,"","
                "],td:[3,"","
                "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra - Exceptions and Enums

                +
                +
                +cassandra.__version_info__
                +

                The version of the driver in a tuple format

                +
                + +
                +
                +cassandra.__version__
                +

                The version of the driver in a string format

                +
                + +
                +
                +class cassandra.ConsistencyLevel
                +

                Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

                +
                +
                +ANY = 0
                +

                Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

                +
                + +
                +
                +ONE = 1
                +

                Only one replica needs to respond to consider the operation a success

                +
                + +
                +
                +TWO = 2
                +

                Two replicas must respond to consider the operation a success

                +
                + +
                +
                +THREE = 3
                +

                Three replicas must respond to consider the operation a success

                +
                + +
                +
                +QUORUM = 4
                +

                ceil(RF/2) + 1 replicas must respond to consider the operation a success

                +
                + +
                +
                +ALL = 5
                +

                All replicas must respond to consider the operation a success

                +
                + +
                +
                +LOCAL_QUORUM = 6
                +

                Requires a quorum of replicas in the local datacenter

                +
                + +
                +
                +EACH_QUORUM = 7
                +

                Requires a quorum of replicas in each datacenter

                +
                + +
                +
                +SERIAL = 8
                +

                For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

                +
                + +
                +
                +LOCAL_SERIAL = 9
                +

                Like SERIAL, but only requires consensus +among replicas in the local datacenter.

                +
                + +
                +
                +LOCAL_ONE = 10
                +

                Sends a request only to replicas in the local datacenter and waits for +one response.

                +
                + +
                + +
                +
                +class cassandra.ProtocolVersion
                +

                Defines native protocol versions supported by this driver.

                +
                +
                +V1 = 1
                +

                v1, supported in Cassandra 1.2–>2.2

                +
                + +
                +
                +V2 = 2
                +

                v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

                +
                + +
                +
                +V3 = 3
                +

                v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

                +
                + +
                +
                +V4 = 4
                +

                v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

                +
                + +
                +
                +V5 = 5
                +

                v5, in beta from 3.x+. Finalised in 4.0-beta5

                +
                + +
                +
                +V6 = 6
                +

                v6, in beta from 4.0-beta5

                +
                + +
                +
                +DSE_V1 = 65
                +

                DSE private protocol v1, supported in DSE 5.1+

                +
                + +
                +
                +DSE_V2 = 66
                +

                DSE private protocol v2, supported in DSE 6.0+

                +
                + +
                +
                +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
                +

                A tuple of all supported protocol versions

                +
                + +
                +
                +BETA_VERSIONS = (6,)
                +

                A tuple of all beta protocol versions

                +
                + +
                +
                +MIN_SUPPORTED = 1
                +

                Minimum protocol version supported by this driver.

                +
                + +
                +
                +MAX_SUPPORTED = 66
                +

                Maximum protocol version supported by this driver.

                +
                + +
                +
                +classmethod get_lower_supported(previous_version)
                +

                Return the lower supported protocol version. Beta versions are omitted.

                +
                + +
                + +
                +
                +class cassandra.UserFunctionDescriptor(name, argument_types)
                +

                Describes a User function by name and argument signature

                +
                +
                +name = None
                +

                name of the function

                +
                + +
                +
                +argument_types = None
                +

                Ordered list of CQL argument type names comprising the type signature

                +
                + +
                +
                +property signature
                +

                function signature string in the form ‘name([type0[,type1[…]]])’

                +

                can be used to uniquely identify overloaded function names within a keyspace

                +
                + +
                + +
                +
                +class cassandra.UserAggregateDescriptor(name, argument_types)
                +

                Describes a User aggregate function by name and argument signature

                +
                +
                +name = None
                +

                name of the aggregate

                +
                + +
                +
                +argument_types = None
                +

                Ordered list of CQL argument type names comprising the type signature

                +
                + +
                +
                +property signature
                +

                function signature string in the form ‘name([type0[,type1[…]]])’

                +

                can be used to uniquely identify overloaded function names within a keyspace

                +
                + +
                + +
                +
                +exception cassandra.DriverException
                +

                Base for all exceptions explicitly raised by the driver.

                +
                + +
                +
                +exception cassandra.RequestExecutionException
                +

                Base for request execution exceptions returned from the server.

                +
                + +
                +
                +exception cassandra.Unavailable
                +

                There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

                +
                +
                +consistency = None
                +

                The requested ConsistencyLevel

                +
                + +
                +
                +required_replicas = None
                +

                The number of replicas that needed to be live to complete the operation

                +
                + +
                +
                +alive_replicas = None
                +

                The number of replicas that were actually alive

                +
                + +
                + +
                +
                +exception cassandra.Timeout
                +

                Replicas failed to respond to the coordinator node before timing out.

                +
                +
                +consistency = None
                +

                The requested ConsistencyLevel

                +
                + +
                +
                +required_responses = None
                +

                The number of required replica responses

                +
                + +
                +
                +received_responses = None
                +

                The number of replicas that responded before the coordinator timed out +the operation

                +
                + +
                + +
                +
                +exception cassandra.ReadTimeout
                +

                A subclass of Timeout for read operations.

                +

                This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

                +
                +
                +data_retrieved = None
                +

                A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

                +
                + +
                + +
                +
                +exception cassandra.WriteTimeout
                +

                A subclass of Timeout for write operations.

                +

                This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

                +
                +
                +write_type = None
                +

                The type of write operation, enum on WriteType

                +
                + +
                + +
                +
                +exception cassandra.CoordinationFailure
                +

                Replicas sent a failure to the coordinator.

                +
                +
                +consistency = None
                +

                The requested ConsistencyLevel

                +
                + +
                +
                +required_responses = None
                +

                The number of required replica responses

                +
                + +
                +
                +received_responses = None
                +

                The number of replicas that responded before the coordinator timed out +the operation

                +
                + +
                +
                +failures = None
                +

                The number of replicas that sent a failure message

                +
                + +
                +
                +error_code_map = None
                +

                A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

                +
                + +
                + +
                +
                +exception cassandra.ReadFailure
                +

                A subclass of CoordinationFailure for read operations.

                +

                This indicates that the replicas sent a failure message to the coordinator.

                +
                +
                +data_retrieved = None
                +

                A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

                +
                + +
                + +
                +
                +exception cassandra.WriteFailure
                +

                A subclass of CoordinationFailure for write operations.

                +

                This indicates that the replicas sent a failure message to the coordinator.

                +
                +
                +write_type = None
                +

                The type of write operation, enum on WriteType

                +
                + +
                + +
                +
                +exception cassandra.FunctionFailure
                +

                User Defined Function failed during execution

                +
                +
                +keyspace = None
                +

                Keyspace of the function

                +
                + +
                +
                +function = None
                +

                Name of the function

                +
                + +
                +
                +arg_types = None
                +

                List of argument type names of the function

                +
                + +
                + +
                +
                +exception cassandra.RequestValidationException
                +

                Server request validation failed

                +
                + +
                +
                +exception cassandra.ConfigurationException
                +

                Server indicated request errro due to current configuration

                +
                + +
                +
                +exception cassandra.AlreadyExists
                +

                An attempt was made to create a keyspace or table that already exists.

                +
                +
                +keyspace = None
                +

                The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

                +
                + +
                +
                +table = None
                +

                The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

                +
                + +
                + +
                +
                +exception cassandra.InvalidRequest
                +

                A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

                +
                + +
                +
                +exception cassandra.Unauthorized
                +

                The current user is not authorized to perform the requested operation.

                +
                + +
                +
                +exception cassandra.AuthenticationFailed
                +

                Failed to authenticate.

                +
                + +
                +
                +exception cassandra.OperationTimedOut
                +

                The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

                +
                +
                +errors = None
                +

                A dict of errors keyed by the Host against which they occurred.

                +
                + +
                +
                +last_host = None
                +

                The last Host this operation was attempted against.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/auth.html b/3.26.4-scylla/api/cassandra/auth.html new file mode 100644 index 0000000000..bdfa04862b --- /dev/null +++ b/3.26.4-scylla/api/cassandra/auth.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.auth - Authentication

                +
                +
                +class cassandra.auth.AuthProvider
                +

                An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

                +
                +

                New in version 2.0.0.

                +
                +
                +
                +new_authenticator(host)
                +

                Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                +
                + +
                + +
                +
                +class cassandra.auth.Authenticator
                +

                An abstract class that handles SASL authentication with Cassandra servers.

                +

                Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

                +

                1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

                +

                2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

                +

                3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

                +

                The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

                +
                +

                New in version 2.0.0.

                +
                +
                +
                +server_authenticator_class = None
                +

                Set during the connection AUTHENTICATE phase

                +
                + +
                +
                +initial_response()
                +

                Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

                +
                + +
                +
                +evaluate_challenge(challenge)
                +

                Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                +
                + +
                +
                +on_authentication_success(token)
                +

                Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

                +
                + +
                + +
                +
                +class cassandra.auth.PlainTextAuthProvider(username, password)
                +

                An AuthProvider that works with Cassandra’s PasswordAuthenticator.

                +

                Example usage:

                +
                from cassandra.cluster import Cluster
                +from cassandra.auth import PlainTextAuthProvider
                +
                +auth_provider = PlainTextAuthProvider(
                +        username='cassandra', password='cassandra')
                +cluster = Cluster(auth_provider=auth_provider)
                +
                +
                +
                +

                New in version 2.0.0.

                +
                +
                +
                +new_authenticator(host)
                +

                Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                +
                + +
                + +
                +
                +class cassandra.auth.PlainTextAuthenticator(username, password)
                +
                +
                +evaluate_challenge(challenge)
                +

                Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                +
                + +
                + +
                +
                +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
                +

                An AuthProvider supporting general SASL auth mechanisms

                +

                Suitable for GSSAPI or other SASL mechanisms

                +

                Example usage:

                +
                from cassandra.cluster import Cluster
                +from cassandra.auth import SaslAuthProvider
                +
                +sasl_kwargs = {'service': 'something',
                +               'mechanism': 'GSSAPI',
                +               'qops': 'auth'.split(',')}
                +auth_provider = SaslAuthProvider(**sasl_kwargs)
                +cluster = Cluster(auth_provider=auth_provider)
                +
                +
                +
                +

                New in version 2.1.4.

                +
                +
                +
                +new_authenticator(host)
                +

                Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                +
                + +
                + +
                +
                +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
                +

                A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

                +
                +

                New in version 2.1.4.

                +
                +
                +
                +initial_response()
                +

                Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

                +
                + +
                +
                +evaluate_challenge(challenge)
                +

                Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cluster.html b/3.26.4-scylla/api/cassandra/cluster.html new file mode 100644 index 0000000000..fbfe520ec7 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cluster.html @@ -0,0 +1,1895 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cluster - Clusters and Sessions

                +
                +
                +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
                +

                The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

                +

                Example usage:

                +
                >>> from cassandra.cluster import Cluster
                +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
                +>>> session = cluster.connect()
                +>>> session.execute("CREATE KEYSPACE ...")
                +>>> ...
                +>>> cluster.shutdown()
                +
                +
                +

                Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

                +

                executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

                +

                Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

                +
                +
                +contact_points = ['127.0.0.1']
                +
                + +
                +
                +port = 9042
                +
                + +
                +
                +cql_version = None
                +
                + +
                +
                +protocol_version = 66
                +
                + +
                +
                +compression = True
                +
                + +
                +
                +auth_provider
                +

                When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

                +

                When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

                +

                When not using authentication, this should be left as None.

                +
                + +
                +
                +load_balancing_policy
                +

                An instance of policies.LoadBalancingPolicy or +one of its subclasses.

                +
                +

                Changed in version 2.6.0.

                +
                +

                Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

                +

                Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

                +
                + +
                +
                +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
                +
                + +
                +
                +default_retry_policy = <cassandra.policies.RetryPolicy object>
                +

                A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

                +
                + +
                +
                +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
                +
                + +
                +
                +address_translator = <cassandra.policies.IdentityTranslator object>
                +
                + +
                +
                +metrics_enabled = False
                +
                + +
                +
                +metrics = None
                +
                + +
                +
                +ssl_context = None
                +
                + +
                +
                +ssl_options = None
                +
                + +
                +
                +sockopts = None
                +
                + +
                +
                +max_schema_agreement_wait = 10
                +
                + +
                +
                +metadata = None
                +
                + +
                +
                +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
                +
                + +
                +
                +control_connection_timeout = 2.0
                +
                + +
                +
                +idle_heartbeat_interval = 30
                +
                + +
                +
                +idle_heartbeat_timeout = 30
                +
                + +
                +
                +schema_event_refresh_window = 2
                +
                + +
                +
                +topology_event_refresh_window = 10
                +
                + +
                +
                +status_event_refresh_window = 2
                +
                + +
                +
                +prepare_on_all_hosts = True
                +
                + +
                +
                +reprepare_on_up = True
                +
                + +
                +
                +connect_timeout = 5
                +
                + +
                +
                +schema_metadata_enabled = True
                +

                Flag indicating whether internal schema metadata is updated.

                +

                When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

                +
                + +
                +
                +token_metadata_enabled = True
                +

                Flag indicating whether internal token metadata is updated.

                +

                When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

                +
                + +
                +
                +timestamp_generator = None
                +
                + +
                +
                +endpoint_factory = None
                +
                + +
                +
                +cloud = None
                +
                + +
                +
                +connect(keyspace=None, wait_for_all_pools=False)
                +

                Creates and returns a new Session object.

                +

                If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

                +

                wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

                +
                + +
                +
                +shutdown()
                +

                Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

                +

                Once shutdown, a Cluster should not be used for any purpose.

                +
                + +
                +
                +register_user_type(keyspace, user_type, klass)
                +

                Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

                +

                keyspace is the name of the keyspace that the UDT is defined in.

                +

                user_type is the string name of the UDT to register the mapping +for.

                +

                klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

                +

                This method should only be called after the type has been created +within Cassandra.

                +

                Example:

                +
                cluster = Cluster(protocol_version=3)
                +session = cluster.connect()
                +session.set_keyspace('mykeyspace')
                +session.execute("CREATE TYPE address (street text, zipcode int)")
                +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
                +
                +# create a class to map to the "address" UDT
                +class Address(object):
                +
                +    def __init__(self, street, zipcode):
                +        self.street = street
                +        self.zipcode = zipcode
                +
                +cluster.register_user_type('mykeyspace', 'address', Address)
                +
                +# insert a row using an instance of Address
                +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
                +                (0, Address("123 Main St.", 78723)))
                +
                +# results will include Address instances
                +results = session.execute("SELECT * FROM users")
                +row = results[0]
                +print row.id, row.location.street, row.location.zipcode
                +
                +
                +
                + +
                +
                +register_listener(listener)
                +

                Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

                +
                + +
                +
                +unregister_listener(listener)
                +

                Removes a registered listener.

                +
                + +
                +
                +add_execution_profile(name, profile, pool_wait_timeout=5)
                +

                Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

                +

                Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

                +

                Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

                +
                + +
                +
                +set_max_requests_per_connection(host_distance, max_requests)
                +

                Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

                +

                Pertains to connection pool management in protocol versions {1,2}.

                +
                + +
                +
                +get_max_requests_per_connection(host_distance)
                +
                + +
                +
                +set_min_requests_per_connection(host_distance, min_requests)
                +

                Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

                +

                Pertains to connection pool management in protocol versions {1,2}.

                +
                + +
                +
                +get_min_requests_per_connection(host_distance)
                +
                + +
                +
                +get_core_connections_per_host(host_distance)
                +

                Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                +

                This property is ignored if protocol_version is +3 or higher.

                +
                + +
                +
                +set_core_connections_per_host(host_distance, core_connections)
                +

                Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                +

                Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

                +

                If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

                +
                + +
                +
                +get_max_connections_per_host(host_distance)
                +

                Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

                +

                This property is ignored if protocol_version is +3 or higher.

                +
                + +
                +
                +set_max_connections_per_host(host_distance, max_connections)
                +

                Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                +

                If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

                +
                + +
                +
                +get_control_connection_host()
                +

                Returns the control connection host metadata.

                +
                + +
                +
                +refresh_schema_metadata(max_schema_agreement_wait=None)
                +

                Synchronously refresh all schema metadata.

                +

                By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

                +

                Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

                +

                Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

                +

                An Exception is raised if schema refresh fails for any reason.

                +
                + +
                +
                +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
                +

                Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

                +

                See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                +
                + +
                +
                +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
                +

                Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

                +

                See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                +
                + +
                +
                +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
                +

                Synchronously refresh user defined type metadata.

                +

                See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                +
                + +
                +
                +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
                +

                Synchronously refresh user defined function metadata.

                +

                function is a cassandra.UserFunctionDescriptor.

                +

                See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                +
                + +
                +
                +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
                +

                Synchronously refresh user defined aggregate metadata.

                +

                aggregate is a cassandra.UserAggregateDescriptor.

                +

                See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                +
                + +
                +
                +refresh_nodes(force_token_rebuild=False)
                +

                Synchronously refresh the node list and token metadata

                +

                force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

                +

                An Exception is raised if node refresh fails for any reason.

                +
                + +
                +
                +set_meta_refresh_enabled(enabled)
                +

                Deprecated: set schema_metadata_enabled token_metadata_enabled instead

                +

                Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

                +

                Disabling this is useful to minimize refreshes during multiple changes.

                +

                Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

                +
                + +
                + +
                +
                +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
                +
                +
                +consistency_level = LOCAL_ONE
                +
                + +
                +
                +static row_factory(colnames, rows)
                +

                Returns each row as a namedtuple. +This is the default row factory.

                +

                Example:

                +
                >>> from cassandra.query import named_tuple_factory
                +>>> session = cluster.connect('mykeyspace')
                +>>> session.row_factory = named_tuple_factory
                +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                +>>> user = rows[0]
                +
                +>>> # you can access field by their name:
                +>>> print "name: %s, age: %d" % (user.name, user.age)
                +name: Bob, age: 42
                +
                +>>> # or you can access fields by their position (like a tuple)
                +>>> name, age = user
                +>>> print "name: %s, age: %d" % (name, age)
                +name: Bob, age: 42
                +>>> name = user[0]
                +>>> age = user[1]
                +>>> print "name: %s, age: %d" % (name, age)
                +name: Bob, age: 42
                +
                +
                +
                +

                Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                +
                +
                + +
                + +
                +
                +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
                +

                Default execution profile for graph execution.

                +

                See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

                +

                In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

                +
                + +
                +
                +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
                +

                Execution profile with timeout and load balancing appropriate for graph analytics queries.

                +

                See also GraphExecutionPolicy.

                +

                In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

                +

                Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

                +
                + +
                +
                +cassandra.cluster.EXEC_PROFILE_DEFAULT
                +

                The base class of the class hierarchy.

                +

                When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                +
                + +
                +
                +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
                +

                The base class of the class hierarchy.

                +

                When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                +
                + +
                +
                +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
                +

                The base class of the class hierarchy.

                +

                When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                +
                + +
                +
                +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
                +

                The base class of the class hierarchy.

                +

                When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                +
                + +
                +
                +class cassandra.cluster.Session
                +

                A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

                +

                Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

                +

                Example usage:

                +
                >>> session = cluster.connect()
                +>>> session.set_keyspace("mykeyspace")
                +>>> session.execute("SELECT * FROM mycf")
                +
                +
                +
                +
                +default_timeout = 10.0
                +

                A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

                +

                Setting this to None will cause no timeouts to be set by default.

                +

                Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

                +
                +

                New in version 2.0.0.

                +
                +
                + +
                +
                +default_consistency_level = LOCAL_ONE
                +

                Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

                +
                +

                New in version 1.2.0.

                +
                +
                +

                Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

                +
                +
                + +
                +
                +default_serial_consistency_level = None
                +

                The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

                +

                Only valid for protocol_version >= 2.

                +
                + +
                +
                +row_factory = <function named_tuple_factory>
                +

                The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

                + +
                + +
                +
                +default_fetch_size = 5000
                +
                + +
                +
                +use_client_timestamp = True
                +
                + +
                +
                +timestamp_generator = None
                +
                + +
                +
                +encoder = None
                +
                + +
                +
                +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
                +
                + +
                +
                +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
                +

                Execute the given query and synchronously wait for the response.

                +

                If an error is encountered while executing the query, an Exception +will be raised.

                +

                query may be a query string or an instance of cassandra.query.Statement.

                +

                parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

                +

                timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

                +

                If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

                +

                custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

                +

                execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

                +

                paging_state is an optional paging state, reused from a previous ResultSet.

                +

                host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

                +

                execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

                +
                + +
                +
                +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
                +

                Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

                +

                See Session.execute() for parameter definitions.

                +

                Example usage:

                +
                >>> session = cluster.connect()
                +>>> future = session.execute_async("SELECT * FROM mycf")
                +
                +>>> def log_results(results):
                +...     for row in results:
                +...         log.info("Results: %s", row)
                +
                +>>> def log_error(exc):
                +>>>     log.error("Operation failed: %s", exc)
                +
                +>>> future.add_callbacks(log_results, log_error)
                +
                +
                +

                Async execution with blocking wait for results:

                +
                >>> future = session.execute_async("SELECT * FROM mycf")
                +>>> # do other stuff...
                +
                +>>> try:
                +...     results = future.result()
                +... except Exception:
                +...     log.exception("Operation failed:")
                +
                +
                +
                + +
                +
                +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
                +

                Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

                +

                parameters is dict of named parameters to bind. The values must be +JSON-serializable.

                +

                execution_profile: Selects an execution profile for the request.

                +

                execute_as the user that will be used on the server to execute the request.

                +
                + +
                +
                +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
                +

                Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

                +
                + +
                +
                +prepare(statement)
                +

                Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

                +
                >>> session = cluster.connect("mykeyspace")
                +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
                +>>> prepared = session.prepare(query)
                +>>> session.execute(prepared, (user.id, user.name, user.age))
                +
                +
                +

                Or you may bind values to the prepared statement ahead of time:

                +
                >>> prepared = session.prepare(query)
                +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
                +>>> session.execute(bound_stmt)
                +
                +
                +

                Of course, prepared statements may (and should) be reused:

                +
                >>> prepared = session.prepare(query)
                +>>> for user in users:
                +...     bound = prepared.bind((user.id, user.name, user.age))
                +...     session.execute(bound)
                +
                +
                +

                Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

                +
                >>> analyticskeyspace_prepared = session.prepare(
                +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
                +...     keyspace="analyticskeyspace")  # note the different keyspace
                +
                +
                +

                Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

                +

                custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

                +
                + +
                +
                +shutdown()
                +

                Close all connections. Session instances should not be used +for any purpose after being shutdown.

                +
                + +
                +
                +set_keyspace(keyspace)
                +

                Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

                +
                + +
                +
                +get_execution_profile(name)
                +

                Returns the execution profile associated with the provided name.

                +
                +
                Parameters:
                +

                name – The name (or key) of the execution profile.

                +
                +
                +
                + +
                +
                +execution_profile_clone_update(ep, **kwargs)
                +

                Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

                +

                This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

                +
                + +
                +
                +add_request_init_listener(fn, *args, **kwargs)
                +

                Adds a callback with arguments to be called when any request is created.

                +

                It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

                +

                response_future is the ResponseFuture for the request.

                +

                Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

                +

                See this example in the +source tree for an example.

                +
                + +
                +
                +remove_request_init_listener(fn, *args, **kwargs)
                +

                Removes a callback and arguments from the list.

                +

                See Session.add_request_init_listener().

                +
                + +
                + +
                +
                +class cassandra.cluster.ResponseFuture
                +

                An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

                +
                +
                There are two ways for results to be delivered:
                +
                +
                +
                +
                +query = None
                +
                + +
                +
                +result()
                +

                Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

                +

                Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

                +

                Example usage:

                +
                >>> future = session.execute_async("SELECT * FROM mycf")
                +>>> # do other stuff...
                +
                +>>> try:
                +...     rows = future.result()
                +...     for row in rows:
                +...         ... # process results
                +... except Exception:
                +...     log.exception("Operation failed:")
                +
                +
                +
                + +
                +
                +get_query_trace()
                +

                Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

                +

                Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

                +

                If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

                +

                query_cl is the consistency level used to poll the trace tables.

                +
                + +
                +
                +get_all_query_traces()
                +

                Fetches and returns the query traces for all query pages, if tracing was enabled.

                +

                See note in get_query_trace() regarding possible exceptions.

                +
                + +
                +
                +custom_payload
                +

                The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

                +

                Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

                +
                +
                Returns:
                +

                Custom Payloads.

                +
                +
                +
                + +
                +
                +is_schema_agreed = True
                +
                + +
                +
                +has_more_pages
                +

                Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

                +
                +

                New in version 2.0.0.

                +
                +
                + +
                +
                +warnings
                +

                Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

                +

                Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

                +

                Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

                +
                + +
                +
                +start_fetching_next_page()
                +

                If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

                +

                This should only be called after the first page has been returned.

                +
                +

                New in version 2.0.0.

                +
                +
                + +
                +
                +add_callback(fn, *args, **kwargs)
                +

                Attaches a callback function to be called when the final results arrive.

                +

                By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

                +

                If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

                +

                If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

                +

                Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

                +

                Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

                +

                Usage example:

                +
                >>> session = cluster.connect("mykeyspace")
                +
                +>>> def handle_results(rows, start_time, should_log=False):
                +...     if should_log:
                +...         log.info("Total time: %f", time.time() - start_time)
                +...     ...
                +
                +>>> future = session.execute_async("SELECT * FROM users")
                +>>> future.add_callback(handle_results, time.time(), should_log=True)
                +
                +
                +
                + +
                +
                +add_errback(fn, *args, **kwargs)
                +

                Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

                +
                + +
                +
                +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_kwargs=None)
                +

                A convenient combination of add_callback() and +add_errback().

                +

                Example usage:

                +
                >>> session = cluster.connect()
                +>>> query = "SELECT * FROM mycf"
                +>>> future = session.execute_async(query)
                +
                +>>> def log_results(results, level='debug'):
                +...     for row in results:
                +...         log.log(level, "Result: %s", row)
                +
                +>>> def log_error(exc, query):
                +...     log.error("Query '%s' failed: %s", query, exc)
                +
                +>>> future.add_callbacks(
                +...     callback=log_results, callback_kwargs={'level': 'info'},
                +...     errback=log_error, errback_args=(query,))
                +
                +
                +
                + +
                + +
                +
                +class cassandra.cluster.ResultSet
                +

                An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

                +

                You can treat this as a normal iterator over rows:

                +
                >>> from cassandra.query import SimpleStatement
                +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
                +>>> for user_row in session.execute(statement):
                +...     process_user(user_row)
                +
                +
                +

                Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

                +
                +
                +all()
                +

                Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

                +

                This function is not recommended for queries that return a large number of elements.

                +
                + +
                +
                +property current_rows
                +

                The list of current page rows. May be empty if the result was empty, +or this is the last page.

                +
                + +
                +
                +fetch_next_page()
                +

                Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

                +
                + +
                +
                +get_all_query_traces(max_wait_sec_per=None)
                +

                Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

                +
                + +
                +
                +get_query_trace(max_wait_sec=None)
                +

                Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

                +
                + +
                +
                +property has_more_pages
                +

                True if the last response indicated more pages; False otherwise

                +
                + +
                +
                +one()
                +

                Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

                +
                + +
                +
                +property paging_state
                +

                Server paging state of the query. Can be None if the query was not paged.

                +

                The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

                +
                + +
                +
                +property was_applied
                +

                For LWT results, returns whether the transaction was applied.

                +

                Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

                +

                Only valid when one of the of the internal row factories is in use.

                +
                + +
                + +
                +
                +exception cassandra.cluster.QueryExhausted
                +

                Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

                +
                +

                New in version 2.0.0.

                +
                +
                + +
                +
                +exception cassandra.cluster.NoHostAvailable
                +

                Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

                +
                + +
                +
                +exception cassandra.cluster.UserTypeDoesNotExist
                +

                An attempt was made to use a user-defined type that does not exist.

                +
                +

                New in version 2.1.0.

                +
                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/concurrent.html b/3.26.4-scylla/api/cassandra/concurrent.html new file mode 100644 index 0000000000..99218af78c --- /dev/null +++ b/3.26.4-scylla/api/cassandra/concurrent.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.concurrent - Utilities for Concurrent Statement Execution

                +
                +
                +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
                +

                Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

                +

                The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

                +

                If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

                +

                results_generator controls how the results are returned.

                +
                  +
                • If False, the results are returned only after all requests have completed.

                • +
                • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

                • +
                +

                execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

                +

                A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

                +

                Example usage:

                +
                select_statement = session.prepare("SELECT * FROM users WHERE id=?")
                +
                +statements_and_params = []
                +for user_id in user_ids:
                +    params = (user_id, )
                +    statements_and_params.append((select_statement, params))
                +
                +results = execute_concurrent(
                +    session, statements_and_params, raise_on_first_error=False)
                +
                +for (success, result) in results:
                +    if not success:
                +        handle_error(result)  # result will be an Exception
                +    else:
                +        process_user(result[0])  # result will be a list of rows
                +
                +
                +

                Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

                +
                + +
                +
                +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
                +

                Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

                +

                Example usage:

                +
                statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
                +parameters = [(x,) for x in range(1000)]
                +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
                +
                +
                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/connection.html b/3.26.4-scylla/api/cassandra/connection.html new file mode 100644 index 0000000000..ca400eef1c --- /dev/null +++ b/3.26.4-scylla/api/cassandra/connection.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.connection - Low Level Connection Info

                +
                +
                +exception cassandra.connection.ConnectionException
                +

                An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

                +
                + +
                +
                +exception cassandra.connection.ConnectionShutdown
                +

                Raised when a connection has been marked as defunct or has been closed.

                +
                + +
                +
                +exception cassandra.connection.ConnectionBusy
                +

                An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

                +
                + +
                +
                +exception cassandra.connection.ProtocolError
                +

                Communication did not match the protocol that this driver expects.

                +
                + +
                +
                +class cassandra.connection.EndPoint
                +

                Represents the information to connect to a cassandra node.

                +
                +
                +property address
                +

                The IP address of the node. This is the RPC address the driver uses when connecting to the node

                +
                + +
                +
                +property port
                +

                The port of the node.

                +
                + +
                +
                +resolve()
                +

                Resolve the endpoint to an address/port. This is called +only on socket connection.

                +
                + +
                +
                +property socket_family
                +

                The socket family of the endpoint.

                +
                + +
                +
                +property ssl_options
                +

                SSL options specific to this endpoint.

                +
                + +
                + +
                +
                +class cassandra.connection.EndPointFactory
                +
                +
                +configure(cluster)
                +

                This is called by the cluster during its initialization.

                +
                + +
                +
                +create(row)
                +

                Create an EndPoint from a system.peers row.

                +
                + +
                + +
                +
                +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
                +

                SNI Proxy EndPoint implementation.

                +
                + +
                +
                +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
                +
                + +
                +
                +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
                +

                Unix Socket EndPoint implementation.

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cqlengine/columns.html b/3.26.4-scylla/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..feb91ae0c8 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cqlengine/columns.html @@ -0,0 +1,975 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cqlengine.columns - Column types for object mapping models

                +
                +

                Columns

                +

                Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

                +

                Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

                +

                Each column on your model definitions needs to be an instance of a Column class.

                +
                +
                +class cassandra.cqlengine.columns.Column(**kwargs)
                +
                +
                +primary_key = False
                +

                bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

                +
                + +
                +
                +partition_key = False
                +

                indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

                +
                + +
                +
                +index = False
                +

                bool flag, indicates an index should be created for this column

                +
                + +
                +
                +custom_index = False
                +

                bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

                +
                + +
                +
                +db_field = None
                +

                the fieldname this field will map to in the database

                +
                + +
                +
                +default = None
                +

                the default value, can be a value or a callable (no args)

                +
                + +
                +
                +required = False
                +

                boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

                +
                + +
                +
                +clustering_order = None
                +

                only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

                +
                + +
                +
                +discriminator_column = False
                +

                boolean, if set to True, this column will be used for discriminating records +of inherited models.

                +

                Should only be set on a column of an abstract model being used for inheritance.

                +

                There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

                +
                + +
                +
                +static = False
                +

                boolean, if set to True, this is a static column, with a single value per partition

                +
                + +
                + +
                +
                +

                Column Types

                +

                Columns of all types are initialized by passing Column attributes to the constructor by keyword.

                +
                +
                +class cassandra.cqlengine.columns.Ascii(**kwargs)
                +

                Stores a US-ASCII character string

                +
                +
                Parameters:
                +
                  +
                • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

                • +
                • max_length (int) – Sets the maximum length of this string, for validation purposes.

                • +
                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.columns.BigInt(**kwargs)
                +

                Stores a 64-bit signed integer value

                +
                + +
                +
                +class cassandra.cqlengine.columns.Blob(**kwargs)
                +

                Stores a raw binary value

                +
                + +
                +
                +cassandra.cqlengine.columns.Bytes
                +

                alias of Blob

                +
                + +
                +
                +class cassandra.cqlengine.columns.Boolean(**kwargs)
                +

                Stores a boolean True or False value

                +
                + +
                +
                +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
                +

                Stores a counter that can be incremented and decremented

                +
                + +
                +
                +class cassandra.cqlengine.columns.Date(**kwargs)
                +

                Stores a simple date, with no time-of-day

                +
                +

                Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

                +
                +

                requires C* 2.2+ and protocol v4+

                +
                + +
                +
                +class cassandra.cqlengine.columns.DateTime(**kwargs)
                +

                Stores a datetime value

                +
                +
                +truncate_microseconds = False
                +

                Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

                +
                DateTime.truncate_microseconds = True
                +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
                +
                +
                +

                Defaults to False to preserve legacy behavior. May change in the future.

                +
                + +
                + +
                +
                +class cassandra.cqlengine.columns.Decimal(**kwargs)
                +

                Stores a variable precision decimal value

                +
                + +
                +
                +class cassandra.cqlengine.columns.Double(**kwargs)
                +

                Stores a double-precision floating-point value

                +
                + +
                +
                +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
                +

                Stores a single-precision floating-point value

                +
                + +
                +
                +class cassandra.cqlengine.columns.Integer(**kwargs)
                +

                Stores a 32-bit signed integer value

                +
                + +
                +
                +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
                +

                Stores a list of ordered values

                +

                http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

                +
                +
                Parameters:
                +

                value_type – a column class indicating the types of the value

                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
                +

                Stores a key -> value map (dictionary)

                +

                https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

                +
                +
                Parameters:
                +
                  +
                • key_type – a column class indicating the types of the key

                • +
                • value_type – a column class indicating the types of the value

                • +
                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
                +

                Stores a set of unordered, unique values

                +

                http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

                +
                +
                Parameters:
                +
                  +
                • value_type – a column class indicating the types of the value

                • +
                • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

                • +
                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.columns.SmallInt(**kwargs)
                +

                Stores a 16-bit signed integer value

                +
                +

                New in version 2.6.0.

                +
                +

                requires C* 2.2+ and protocol v4+

                +
                + +
                +
                +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
                +

                Stores a UTF-8 encoded string

                +
                +
                Parameters:
                +
                  +
                • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

                • +
                • max_length (int) – Sets the maximum length of this string, for validation purposes.

                • +
                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.columns.Time(**kwargs)
                +

                Stores a timezone-naive time-of-day, with nanosecond precision

                +
                +

                New in version 2.6.0.

                +
                +

                requires C* 2.2+ and protocol v4+

                +
                + +
                +
                +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
                +

                UUID containing timestamp

                +
                + +
                +
                +class cassandra.cqlengine.columns.TinyInt(**kwargs)
                +

                Stores an 8-bit signed integer value

                +
                +

                New in version 2.6.0.

                +
                +

                requires C* 2.2+ and protocol v4+

                +
                + +
                +
                +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
                +

                User Defined Type column

                +

                http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

                +

                These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

                +

                Please see User Defined Types for examples and discussion.

                +
                +
                Parameters:
                +

                user_type (type) – specifies the UserType model of the column

                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.columns.UUID(**kwargs)
                +

                Stores a type 1 or 4 UUID

                +
                + +
                +
                +class cassandra.cqlengine.columns.VarInt(**kwargs)
                +

                Stores an arbitrary-precision integer

                +
                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cqlengine/connection.html b/3.26.4-scylla/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..52ea7dc04f --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cqlengine/connection.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cqlengine.connection - Connection management for cqlengine

                +
                +
                +cassandra.cqlengine.connection.default()
                +

                Configures the default connection to localhost, using the driver defaults +(except for row_factory)

                +
                + +
                +
                +cassandra.cqlengine.connection.set_session(s)
                +

                Configures the default connection with a preexisting cassandra.cluster.Session

                +

                Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

                +
                + +
                +
                +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
                +

                Setup a the driver connection used by the mapper

                +
                +
                Parameters:
                +
                  +
                • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

                • +
                • default_keyspace (str) – The default keyspace to use

                • +
                • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

                • +
                • lazy_connect (bool) – True if should not connect until first use

                • +
                • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

                • +
                • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

                • +
                +
                +
                +
                + +
                +
                +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
                +

                Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

                +
                +
                Parameters:
                +
                  +
                • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

                • +
                • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

                • +
                • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

                • +
                • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

                • +
                • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

                • +
                • default (bool) – If True, set the new connection as the cqlengine +default

                • +
                • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

                • +
                +
                +
                +
                + +
                +
                +cassandra.cqlengine.connection.unregister_connection(name)
                +
                + +
                +
                +cassandra.cqlengine.connection.set_default_connection(name)
                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cqlengine/management.html b/3.26.4-scylla/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..32637e42f8 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cqlengine/management.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cqlengine.management - Schema management for cqlengine

                +

                A collection of functions for managing keyspace and table schema.

                +
                +
                +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
                +

                Creates a keyspace with SimpleStrategy for replica placement

                +

                If the keyspace already exists, it will not be modified.

                +

                This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                +

                There are plans to guard schema-modifying functions with an environment-driven conditional.

                +
                +
                Parameters:
                +
                  +
                • name (str) – name of keyspace to create

                • +
                • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

                • +
                • durable_writes (bool) – Write log is bypassed if set to False

                • +
                • connections (list) – List of connection names

                • +
                +
                +
                +
                + +
                +
                +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
                +

                Creates a keyspace with NetworkTopologyStrategy for replica placement

                +

                If the keyspace already exists, it will not be modified.

                +

                This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                +

                There are plans to guard schema-modifying functions with an environment-driven conditional.

                +
                +
                Parameters:
                +
                  +
                • name (str) – name of keyspace to create

                • +
                • dc_replication_map (dict) – map of dc_names: replication_factor

                • +
                • durable_writes (bool) – Write log is bypassed if set to False

                • +
                • connections (list) – List of connection names

                • +
                +
                +
                +
                + +
                +
                +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
                +

                Drops a keyspace, if it exists.

                +

                There are plans to guard schema-modifying functions with an environment-driven conditional.

                +

                This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                +
                +
                Parameters:
                +
                  +
                • name (str) – name of keyspace to drop

                • +
                • connections (list) – List of connection names

                • +
                +
                +
                +
                + +
                +
                +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
                +

                Inspects the model and creates / updates the corresponding table and columns.

                +

                If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

                +

                If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

                +

                Any User Defined Types used in the table are implicitly synchronized.

                +

                This function can only add fields that are not part of the primary key.

                +

                Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

                +

                This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                +

                There are plans to guard schema-modifying functions with an environment-driven conditional.

                +
                + +
                +
                +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
                +

                Inspects the type_model and creates / updates the corresponding type.

                +

                Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

                +

                This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                +

                There are plans to guard schema-modifying functions with an environment-driven conditional.

                +
                + +
                +
                +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
                +

                Drops the table indicated by the model, if it exists.

                +

                If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

                +

                If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

                +

                This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                +

                There are plans to guard schema-modifying functions with an environment-driven conditional.

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cqlengine/models.html b/3.26.4-scylla/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..c82ccefb83 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cqlengine/models.html @@ -0,0 +1,955 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cqlengine.models - Table models for object mapping

                +
                +

                Model

                +
                +
                +class cassandra.cqlengine.models.Model(\*\*kwargs)
                +

                The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

                +
                class Person(Model):
                +    id = columns.UUID(primary_key=True)
                +    first_name  = columns.Text()
                +    last_name = columns.Text()
                +
                +person = Person(first_name='Blake', last_name='Eggleston')
                +person.first_name  #returns 'Blake'
                +person.last_name  #returns 'Eggleston'
                +
                +
                +

                Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

                +
                +
                +__abstract__ = False
                +

                Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

                +
                + +
                +
                +__table_name__ = None
                +

                Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

                +
                + +
                +
                +__table_name_case_sensitive__ = False
                +

                Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

                +
                + +
                +
                +__keyspace__ = None
                +

                Sets the name of the keyspace used by this model.

                +
                + +
                +
                +__connection__ = None
                +

                Sets the name of the default connection used by this model.

                +
                + +
                +
                +__default_ttl__ = None
                +

                Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

                +
                + +
                +
                +__discriminator_value__ = None
                +

                Optional Specifies a value for the discriminator column when using model inheritance.

                +

                See Model Inheritance for usage examples.

                +
                + +

                Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

                +

                When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

                +

                Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

                +

                See the list of supported table properties for more information.

                +
                +
                +__options__
                +

                For example:

                +
                class User(Model):
                +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
                +                                  'sstable_size_in_mb': '64',
                +                                  'tombstone_threshold': '.2'},
                +                   'comment': 'User data stored here'}
                +
                +    user_id = columns.UUID(primary_key=True)
                +    name = columns.Text()
                +
                +
                +

                or :

                +
                class TimeData(Model):
                +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
                +                                  'bucket_low': '.3',
                +                                  'bucket_high': '2',
                +                                  'min_threshold': '2',
                +                                  'max_threshold': '64',
                +                                  'tombstone_compaction_interval': '86400'},
                +                   'gc_grace_seconds': '0'}
                +
                +
                +
                + +
                +
                +__compute_routing_key__ = True
                +

                Optional Setting False disables computing the routing key for TokenAwareRouting

                +
                + +

                The base methods allow creating, storing, and querying modeled objects.

                +
                +
                +classmethod create(**kwargs)
                +

                Create an instance of this model in the database.

                +

                Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

                +

                Returns the instance.

                +
                + +
                +
                +if_not_exists()
                +

                Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

                +

                If the insertion isn’t applied, a LWTException is raised.

                +
                try:
                +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
                +except LWTException as e:
                +    # handle failure case
                +    print e.existing  # dict containing LWT result fields
                +
                +
                +

                This method is supported on Cassandra 2.0 or later.

                +
                + +
                +
                +if_exists()
                +

                Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

                +

                If the update or delete isn’t applied, a LWTException is raised.

                +
                try:
                +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
                +except LWTException as e:
                +    # handle failure case
                +    pass
                +
                +
                +

                This method is supported on Cassandra 2.0 or later.

                +
                + +
                +
                +save()
                +

                Saves an object to the database.

                +
                #create a person instance
                +person = Person(first_name='Kimberly', last_name='Eggleston')
                +#saves it to Cassandra
                +person.save()
                +
                +
                +
                + +
                +
                +update(**values)
                +

                Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

                +

                It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

                +
                + +
                +
                +iff(**values)
                +

                Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

                +

                If the insertion isn’t applied, a LWTException is raised.

                +
                t = TestTransactionModel(text='some text', count=5)
                +try:
                +     t.iff(count=5).update('other text')
                +except LWTException as e:
                +    # handle failure case
                +    print e.existing # existing object
                +
                +
                +
                + +
                +
                +classmethod get(*args, **kwargs)
                +

                Returns a single object based on the passed filter constraints.

                +

                This is a pass-through to the model objects().:method:~cqlengine.queries.get.

                +
                + +
                +
                +classmethod filter(*args, **kwargs)
                +

                Returns a queryset based on filter parameters.

                +

                This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

                +
                + +
                +
                +classmethod all()
                +

                Returns a queryset representing all stored objects

                +

                This is a pass-through to the model objects().all()

                +
                + +
                +
                +delete()
                +

                Deletes the object from the database

                +
                + +
                +
                +batch(batch_object)
                +

                Sets the batch object to run instance updates and inserts queries with.

                +

                See Batch Queries for usage examples

                +
                + +
                +
                +timeout(timeout)
                +

                Sets a timeout for use in save(), update(), and delete() +operations

                +
                + +
                +
                +timestamp(timedelta_or_datetime)
                +

                Sets the timestamp for the query

                +
                + +
                +
                +ttl(ttl_in_sec)
                +

                Sets the ttl values to run instance updates and inserts queries with.

                +
                + +
                +
                +using(connection=None)
                +

                Change the context on the fly of the model instance (keyspace, connection)

                +
                + +
                +
                +classmethod column_family_name(include_keyspace=True)
                +

                Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

                +
                + +

                Models also support dict-like access:

                +
                +
                +len(m)
                +

                Returns the number of columns defined in the model

                +
                + +
                +
                +m[col_name]()
                +

                Returns the value of column col_name

                +
                + +
                +
                +m[col_name] = value
                +

                Set m[col_name] to value

                +
                + +
                +
                +keys()
                +

                Returns a list of column IDs.

                +
                + +
                +
                +values()
                +

                Returns list of column values.

                +
                + +
                +
                +items()
                +

                Returns a list of column ID/value tuples.

                +
                + +
                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cqlengine/query.html b/3.26.4-scylla/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..a496aa3543 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cqlengine/query.html @@ -0,0 +1,1051 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cqlengine.query - Query and filter model objects

                +
                +

                QuerySet

                +

                QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

                +
                +
                +class cassandra.cqlengine.query.ModelQuerySet(model)
                +
                +
                +all()
                +

                Returns a queryset matching all rows

                +
                for user in User.objects().all():
                +    print(user)
                +
                +
                +
                + +
                +
                +batch(batch_obj)
                +

                Set a batch object to run the query on.

                +

                Note: running a select query with a batch object will raise an exception

                +
                + +
                +
                +consistency(consistency)
                +

                Sets the consistency level for the operation. See ConsistencyLevel.

                +
                for user in User.objects(id=3).consistency(CL.ONE):
                +    print(user)
                +
                +
                +
                + +
                +
                +count()
                +

                Returns the number of rows matched by this query.

                +

                Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

                +
                + +
                +
                +len(queryset)
                +

                Returns the number of rows matched by this query. This function uses count() internally.

                +

                Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

                +
                + +
                +
                +distinct(distinct_fields=None)
                +

                Returns the DISTINCT rows matched by this query.

                +

                distinct_fields default to the partition key fields if not specified.

                +

                Note: distinct_fields must be a partition key or a static column

                +
                class Automobile(Model):
                +    manufacturer = columns.Text(partition_key=True)
                +    year = columns.Integer(primary_key=True)
                +    model = columns.Text(primary_key=True)
                +    price = columns.Decimal()
                +
                +sync_table(Automobile)
                +
                +# create rows
                +
                +Automobile.objects.distinct()
                +
                +# or
                +
                +Automobile.objects.distinct(['manufacturer'])
                +
                +
                +
                + +
                +
                +filter(*args, **kwargs)
                +

                Adds WHERE arguments to the queryset, returning a new queryset

                +

                See Retrieving objects with filters

                +

                Returns a QuerySet filtered on the keyword arguments

                +
                + +
                +
                +get(*args, **kwargs)
                +

                Returns a single instance matching this query, optionally with additional filter kwargs.

                +

                See Retrieving objects with filters

                +

                Returns a single object matching the QuerySet.

                +
                user = User.get(id=1)
                +
                +
                +

                If no objects are matched, a DoesNotExist exception is raised.

                +

                If more than one object is found, a MultipleObjectsReturned exception is raised.

                +
                + +
                +
                +limit(v)
                +

                Limits the number of results returned by Cassandra. Use 0 or None to disable.

                +

                Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

                +
                # Fetch 100 users
                +for user in User.objects().limit(100):
                +    print(user)
                +
                +# Fetch all users
                +for user in User.objects().limit(None):
                +    print(user)
                +
                +
                +
                + +
                +
                +fetch_size(v)
                +

                Sets the number of rows that are fetched at a time.

                +

                Note that driver’s default fetch size is 5000.

                +
                for user in User.objects().fetch_size(500):
                +    print(user)
                +
                +
                +
                + +
                +
                +if_not_exists()
                +

                Check the existence of an object before insertion.

                +

                If the insertion isn’t applied, a LWTException is raised.

                +
                + +
                +
                +if_exists()
                +

                Check the existence of an object before an update or delete.

                +

                If the update or delete isn’t applied, a LWTException is raised.

                +
                + +
                +
                +order_by(*colnames)
                +

                Sets the column(s) to be used for ordering

                +

                Default order is ascending, prepend a ‘-’ to any column name for descending

                +

                Note: column names must be a clustering key

                +
                from uuid import uuid1,uuid4
                +
                +class Comment(Model):
                +    photo_id = UUID(primary_key=True)
                +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
                +    comment = Text()
                +
                +sync_table(Comment)
                +
                +u = uuid4()
                +for x in range(5):
                +    Comment.create(photo_id=u, comment="test %d" % x)
                +
                +print("Normal")
                +for comment in Comment.objects(photo_id=u):
                +    print comment.comment_id
                +
                +print("Reversed")
                +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
                +    print comment.comment_id
                +
                +
                +
                + +
                +
                +allow_filtering()
                +

                Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

                +
                + +
                +
                +only(fields)
                +

                Load only these fields for the returned query

                +
                + +
                +
                +defer(fields)
                +

                Don’t load these fields for the returned query

                +
                + +
                +
                +timestamp(timestamp)
                +

                Allows for custom timestamps to be saved with the record.

                +
                + +
                +
                +ttl(ttl)
                +

                Sets the ttl (in seconds) for modified data.

                +

                Note that running a select query with a ttl value will raise an exception

                +
                + +
                +
                +using(keyspace=None, connection=None)
                +

                Change the context on-the-fly of the Model class (keyspace, connection)

                +
                + +
                +
                +update(**values)
                +

                Performs an update on the row selected by the queryset. Include values to update in the +update like so:

                +
                Model.objects(key=n).update(value='x')
                +
                +
                +

                Passing in updates for columns which are not part of the model will raise a ValidationError.

                +

                Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

                +

                For example:

                +
                class User(Model):
                +    id = Integer(primary_key=True)
                +    name = Text()
                +
                +setup(["localhost"], "test")
                +sync_table(User)
                +
                +u = User.create(id=1, name="jon")
                +
                +User.objects(id=1).update(name="Steve")
                +
                +# sets name to null
                +User.objects(id=1).update(name=None)
                +
                +
                +

                Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

                +

                Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

                +

                Given the model below, here are the operations that can be performed on the different container columns:

                +
                class Row(Model):
                +    row_id      = columns.Integer(primary_key=True)
                +    set_column  = columns.Set(Integer)
                +    list_column = columns.List(Integer)
                +    map_column  = columns.Map(Integer, Integer)
                +
                +
                +

                Set

                +
                  +
                • add: adds the elements of the given set to the column

                • +
                • remove: removes the elements of the given set to the column

                • +
                +
                # add elements to a set
                +Row.objects(row_id=5).update(set_column__add={6})
                +
                +# remove elements to a set
                +Row.objects(row_id=5).update(set_column__remove={4})
                +
                +
                +

                List

                +
                  +
                • append: appends the elements of the given list to the end of the column

                • +
                • prepend: prepends the elements of the given list to the beginning of the column

                • +
                +
                # append items to a list
                +Row.objects(row_id=5).update(list_column__append=[6, 7])
                +
                +# prepend items to a list
                +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
                +
                +
                +

                Map

                +
                  +
                • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

                • +
                +
                # add items to a map
                +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
                +
                +# remove items from a map
                +Row.objects(row_id=5).update(map_column__remove={1, 2})
                +
                +
                +
                + +
                + +
                +
                +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
                +

                Handles the batching of queries

                +

                http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

                +

                See Batch Queries for more details.

                +
                +
                Parameters:
                +
                  +
                • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

                • +
                • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

                • +
                • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

                • +
                • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

                • +
                • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

                • +
                • connection (str) – Connection name to use for the batch execution

                • +
                +
                +
                +
                +
                +add_query(query)
                +
                + +
                +
                +execute()
                +
                + +
                +
                +add_callback(fn, *args, **kwargs)
                +

                Add a function and arguments to be passed to it to be executed after the batch executes.

                +

                A batch can support multiple callbacks.

                +

                Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

                +
                +
                Parameters:
                +
                  +
                • fn (callable) – Callable object

                • +
                • *args – Positional arguments to be passed to the callback at the time of execution

                • +
                • **kwargs – Named arguments to be passed to the callback at the time of execution

                • +
                +
                +
                +
                + +
                + +
                +
                +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
                +

                A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

                +
                +
                Parameters:
                +
                  +
                • *args – One or more models. A model should be a class type, not an instance.

                • +
                • **kwargs – (optional) Context parameters: can be keyspace or connection

                • +
                +
                +
                +

                For example:

                +
                with ContextQuery(Automobile, keyspace='test2') as A:
                +    A.objects.create(manufacturer='honda', year=2008, model='civic')
                +    print len(A.objects.all())  # 1 result
                +
                +with ContextQuery(Automobile, keyspace='test4') as A:
                +    print len(A.objects.all())  # 0 result
                +
                +# Multiple models
                +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
                +    print len(A.objects.all())
                +    print len(A2.objects.all())
                +
                +
                +
                + +
                +
                +class cassandra.cqlengine.query.DoesNotExist
                +
                + +
                +
                +class cassandra.cqlengine.query.MultipleObjectsReturned
                +
                + +
                +
                +class cassandra.cqlengine.query.LWTException(existing)
                +

                Lightweight conditional exception.

                +

                This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

                +
                +
                Parameters:
                +

                existing – The current state of the data which prevented the write.

                +
                +
                +
                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/cqlengine/usertype.html b/3.26.4-scylla/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..a4e0ec7f12 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.cqlengine.usertype - Model classes for User Defined Types

                +
                +

                UserType

                +
                +
                +class cassandra.cqlengine.usertype.UserType(**values)
                +

                This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

                +
                # connect with default keyspace ...
                +
                +from cassandra.cqlengine.columns import Text, Integer
                +from cassandra.cqlengine.usertype import UserType
                +
                +class address(UserType):
                +    street = Text()
                +    zipcode = Integer()
                +
                +from cassandra.cqlengine import management
                +management.sync_type(address)
                +
                +
                +

                Please see User Defined Types for a complete example and discussion.

                +
                +
                +__type_name__ = None
                +

                Optional. Sets the name of the CQL type for this type.

                +

                If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

                +
                + +
                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/datastax/graph/fluent/index.html b/3.26.4-scylla/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..b8a7181d9c --- /dev/null +++ b/3.26.4-scylla/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.datastax.graph.fluent

                +
                +
                +class cassandra.datastax.graph.fluent.DseGraph
                +

                Dse Graph utility class for GraphTraversal construction and execution.

                +
                +
                +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
                +

                Graph query language, Default is ‘bytecode-json’ (GraphSON).

                +
                + +
                +
                +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
                +

                Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

                +
                +
                Parameters:
                +
                  +
                • graph_name – The graph name

                • +
                • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

                • +
                +
                +
                +
                + +
                +
                +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
                +

                From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

                +
                +
                Parameters:
                +
                  +
                • traversal – The GraphTraversal object

                • +
                • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

                • +
                • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

                • +
                +
                +
                +
                + +
                +
                +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
                +

                Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

                +
                +
                Parameters:
                +
                  +
                • session – (Optional) A DSE session

                • +
                • graph_name – (Optional) DSE Graph name

                • +
                • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

                • +
                • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

                • +
                +
                +
                +
                from cassandra.cluster import Cluster
                +from cassandra.datastax.graph.fluent import DseGraph
                +
                +c = Cluster()
                +session = c.connect()
                +
                +g = DseGraph.traversal_source(session, 'my_graph')
                +print g.V().valueMap().toList()
                +
                +
                +
                + +
                +
                +static batch(session=None, execution_profile=None)
                +

                Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
                +

                A Tinkerpop RemoteConnection to execute traversal queries on DSE.

                +
                +
                Parameters:
                +
                  +
                • session – A DSE session

                • +
                • graph_name – (Optional) DSE Graph name.

                • +
                • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

                • +
                +
                +
                +
                + +
                +
                +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
                +

                Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

                +
                +
                Currently supported:
                  +
                • bulk results

                • +
                +
                +
                +
                + +
                +
                +cassandra.datastax.graph.fluent.graph_traversal_row_factory
                +

                alias of _GremlinGraphSON2RowFactory

                +
                + +
                +
                +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
                +

                alias of _DseGraphSON2RowFactory

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/datastax/graph/fluent/predicates.html b/3.26.4-scylla/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..6479c2918b --- /dev/null +++ b/3.26.4-scylla/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.datastax.graph.fluent.predicates

                +
                +
                +class cassandra.datastax.graph.fluent.predicates.Search
                +
                +
                +static token(value)
                +

                Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

                +
                + +
                +
                +static token_prefix(value)
                +

                Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

                +
                + +
                +
                +static token_regex(value)
                +

                Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

                +
                + +
                +
                +static prefix(value)
                +

                Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

                +
                + +
                +
                +static regex(value)
                +

                Search for this regular expression inside the text property targeted. +:param value: the value to look for.

                +
                + +
                +
                +static fuzzy(value, distance)
                +

                Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

                +
                + +
                +
                +static token_fuzzy(value, distance)
                +

                Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

                +
                + +
                +
                +static phrase(value, proximity)
                +

                Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.fluent.predicates.CqlCollection
                +
                +
                +static contains(value)
                +

                Search for a value inside a cql list/set column. +:param value: the value to look for.

                +
                + +
                +
                +static contains_value(value)
                +

                Search for a map value. +:param value: the value to look for.

                +
                + +
                +
                +static contains_key(value)
                +

                Search for a map key. +:param value: the value to look for.

                +
                + +
                +
                +static entry_eq(value)
                +

                Search for a map entry. +:param value: the value to look for.

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.fluent.predicates.Geo
                +
                +
                +static inside(value, units=1)
                +

                Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/datastax/graph/fluent/query.html b/3.26.4-scylla/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..c6907b04a8 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.datastax.graph.fluent.query

                +
                +
                +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
                +

                A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

                +

                If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

                +
                +
                Parameters:
                +
                  +
                • session – (Optional) A DSE session

                • +
                • execution_profile – (Optional) The execution profile to use for the batch execution

                • +
                +
                +
                +
                +
                +add(traversal)
                +

                Add a traversal to the batch.

                +
                +
                Parameters:
                +

                traversal – A gremlin GraphTraversal

                +
                +
                +
                + +
                +
                +add_all(traversals)
                +

                Adds a sequence of traversals to the batch.

                +
                +
                Parameters:
                +

                traversals – A sequence of gremlin GraphTraversal

                +
                +
                +
                + +
                +
                +execute()
                +

                Execute the traversal batch if bounded to a DSE Session.

                +
                + +
                +
                +as_graph_statement(graph_protocol=b'graphson-2.0')
                +

                Return the traversal batch as GraphStatement.

                +
                +
                Parameters:
                +

                graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

                +
                +
                +
                + +
                +
                +clear()
                +

                Clear a traversal batch for reuse.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/datastax/graph/index.html b/3.26.4-scylla/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..6a8130eddd --- /dev/null +++ b/3.26.4-scylla/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1056 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.datastax.graph - Graph Statements, Options, and Row Factories

                +
                +
                +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
                +

                returns the JSON string value of graph results

                +
                + +
                +
                +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
                +

                Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

                +
                + +
                +
                +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
                +

                Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

                +
                + +
                +
                +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
                +

                Row factory to deserialize GraphSON2 results.

                +
                + +
                +
                +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
                +

                Row factory to deserialize GraphSON3 results.

                +
                + +
                +
                +cassandra.datastax.graph.to_int(value)
                +

                Wraps a value to be explicitly serialized as a graphson Int.

                +
                + +
                +
                +cassandra.datastax.graph.to_bigint(value)
                +

                Wraps a value to be explicitly serialized as a graphson Bigint.

                +
                + +
                +
                +cassandra.datastax.graph.to_smallint(value)
                +

                Wraps a value to be explicitly serialized as a graphson Smallint.

                +
                + +
                +
                +cassandra.datastax.graph.to_float(value)
                +

                Wraps a value to be explicitly serialized as a graphson Float.

                +
                + +
                +
                +cassandra.datastax.graph.to_double(value)
                +

                Wraps a value to be explicitly serialized as a graphson Double.

                +
                + +
                +
                +class cassandra.datastax.graph.GraphProtocol
                +
                +
                +GRAPHSON_1_0 = b'graphson-1.0'
                +

                GraphSON1

                +
                + +
                +
                +GRAPHSON_2_0 = b'graphson-2.0'
                +

                GraphSON2

                +
                + +
                +
                +GRAPHSON_3_0 = b'graphson-3.0'
                +

                GraphSON3

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.GraphOptions(**kwargs)
                +

                Options for DSE Graph Query handler.

                +
                +
                +graph_name
                +

                name of the targeted graph.

                +
                + +
                +
                +graph_source
                +

                choose the graph traversal source, configured on the server side.

                +
                + +
                +
                +graph_language
                +

                the language used in the queries (default “gremlin-groovy”)

                +
                + +
                +
                +graph_read_consistency_level
                +

                read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

                +
                + +
                +
                +graph_write_consistency_level
                +

                write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

                +
                + +
                +
                +is_default_source
                +
                + +
                +
                +is_analytics_source
                +

                True if graph_source is set to the server-defined analytics traversal source (‘a’)

                +
                + +
                +
                +is_graph_source
                +

                True if graph_source is set to the server-defined graph traversal source (‘g’)

                +
                + +
                +
                +set_source_default()
                +

                Sets graph_source to the server-defined default traversal source (‘default’)

                +
                + +
                +
                +set_source_analytics()
                +

                Sets graph_source to the server-defined analytic traversal source (‘a’)

                +
                + +
                +
                +set_source_graph()
                +

                Sets graph_source to the server-defined graph traversal source (‘g’)

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                +

                Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

                +

                query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                +

                See Statement attributes for a description of the other parameters.

                +
                + +
                +
                +class cassandra.datastax.graph.Result(value)
                +

                Represents deserialized graph results. +Property and item getters are provided for convenience.

                +
                +
                +value = None
                +

                Deserialized value from the result

                +
                + +
                +
                +as_vertex()
                +

                Return a Vertex parsed from this result

                +

                Raises TypeError if parsing fails (i.e. the result structure is not valid).

                +
                + +
                +
                +as_edge()
                +

                Return a Edge parsed from this result

                +

                Raises TypeError if parsing fails (i.e. the result structure is not valid).

                +
                + +
                +
                +as_path()
                +

                Return a Path parsed from this result

                +

                Raises TypeError if parsing fails (i.e. the result structure is not valid).

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.Vertex(id, label, type, properties)
                +

                Represents a Vertex element from a graph query.

                +

                Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

                +
                + +
                +
                +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
                +

                Vertex properties have a top-level value and an optional dict of properties.

                +
                +
                +label = None
                +

                label of the property

                +
                + +
                +
                +value = None
                +

                Value of the property

                +
                + +
                +
                +properties = None
                +

                dict of properties attached to the property

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
                +

                Represents an Edge element from a graph query.

                +

                Attributes match initializer parameters.

                +
                + +
                +
                +class cassandra.datastax.graph.Path(labels, objects)
                +

                Represents a graph path.

                +

                Labels list is taken verbatim from the results.

                +

                Objects are either Result or Vertex/Edge for recognized types

                +
                +
                +labels = None
                +

                List of labels in the path

                +
                + +
                +
                +objects = None
                +

                List of objects in the path

                +
                + +
                + +
                +
                +class cassandra.datastax.graph.T(name, val)
                +

                Represents a collection of tokens for more concise Traversal definitions.

                +
                +
                +id = T.id
                +
                + +
                +
                +key = T.key
                +
                + +
                +
                +label = T.label
                +
                + +
                +
                +value = T.value
                +
                + +
                + +
                +
                +class cassandra.datastax.graph.GraphSON1Serializer
                +

                Serialize python objects to graphson types.

                +
                + +
                +
                +class cassandra.datastax.graph.GraphSON1Deserializer
                +

                Deserialize graphson1 types to python objects.

                +
                +
                +classmethod deserialize_date(value)
                +
                + +
                +
                +classmethod deserialize_timestamp(value)
                +
                + +
                +
                +classmethod deserialize_time(value)
                +
                + +
                +
                +classmethod deserialize_duration(value)
                +
                + +
                +
                +classmethod deserialize_int(value)
                +
                + +
                +
                +classmethod deserialize_bigint(value)
                +
                + +
                +
                +classmethod deserialize_double(value)
                +
                + +
                +
                +classmethod deserialize_float(value)
                +
                + +
                +
                +classmethod deserialize_uuid(value)
                +
                + +
                +
                +classmethod deserialize_blob(value)
                +
                + +
                +
                +classmethod deserialize_decimal(value)
                +
                + +
                +
                +classmethod deserialize_point(value)
                +
                + +
                +
                +classmethod deserialize_linestring(value)
                +
                + +
                +
                +classmethod deserialize_polygon(value)
                +
                + +
                + +
                +
                +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
                +

                GraphSON2 Reader that parse json and deserialize to python objects.

                +
                +
                Parameters:
                +

                extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                +
                +
                +
                +
                +read(json_data)
                +

                Read and deserialize json_data.

                +
                + +
                +
                +deserialize(obj)
                +

                Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/decoder.html b/3.26.4-scylla/api/cassandra/decoder.html new file mode 100644 index 0000000000..dc95f63926 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/decoder.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.decoder - Data Return Formats

                +
                +
                +cassandra.decoder.tuple_factory()
                +

                Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

                +
                + +
                +
                +cassandra.decoder.named_tuple_factory()
                +

                Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

                +
                + +
                +
                +cassandra.decoder.dict_factory()
                +

                Deprecated in 2.0.0. Use cassandra.query.dict_factory()

                +
                + +
                +
                +cassandra.decoder.ordered_dict_factory()
                +

                Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/encoder.html b/3.26.4-scylla/api/cassandra/encoder.html new file mode 100644 index 0000000000..d75690978e --- /dev/null +++ b/3.26.4-scylla/api/cassandra/encoder.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.encoder - Encoders for non-prepared Statements

                +
                +
                +class cassandra.encoder.Encoder
                +

                A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

                +
                +
                +mapping = None
                +

                A map of python types to encoder functions.

                +
                + +
                +
                +cql_encode_none()
                +

                Converts None to the string ‘NULL’.

                +
                + +
                +
                +cql_encode_object()
                +

                Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

                +
                + +
                +
                +cql_encode_all_types()
                +

                Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

                +
                + +
                +
                +cql_encode_sequence()
                +

                Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

                +
                + +
                +
                +cql_encode_str()
                +

                Escapes quotes in str objects.

                +
                + +
                +
                +cql_encode_unicode()
                +

                Converts unicode objects to UTF-8 encoded strings with quote escaping.

                +
                + +
                +
                +cql_encode_bytes()
                +

                Converts strings, buffers, and bytearrays into CQL blob literals.

                +
                + +
                +
                +cql_encode_datetime()
                +

                Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

                +
                + +
                +
                +cql_encode_date()
                +

                Converts a datetime.date object to a string with format +YYYY-MM-DD.

                +
                + +
                +
                +cql_encode_map_collection()
                +

                Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

                +
                + +
                +
                +cql_encode_list_collection()
                +

                Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

                +
                + +
                +
                +cql_encode_set_collection()
                +

                Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

                +
                + +
                +
                +cql_encode_tuple()
                +

                Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/graph.html b/3.26.4-scylla/api/cassandra/graph.html new file mode 100644 index 0000000000..a345ff1933 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/graph.html @@ -0,0 +1,1089 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.graph - Graph Statements, Options, and Row Factories

                +
                +

                Note

                +

                This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

                +
                +
                +
                +cassandra.graph.single_object_row_factory(column_names, rows)
                +

                returns the JSON string value of graph results

                +
                + +
                +
                +cassandra.graph.graph_result_row_factory(column_names, rows)
                +

                Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

                +
                + +
                +
                +cassandra.graph.graph_object_row_factory(column_names, rows)
                +

                Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

                +
                + +
                +
                +cassandra.graph.graph_graphson2_row_factory(cluster)
                +

                Row factory to deserialize GraphSON2 results.

                +
                + +
                +
                +cassandra.graph.graph_graphson3_row_factory(cluster)
                +

                Row factory to deserialize GraphSON3 results.

                +
                + +
                +
                +cassandra.graph.to_int(value)
                +

                Wraps a value to be explicitly serialized as a graphson Int.

                +
                + +
                +
                +cassandra.graph.to_bigint(value)
                +

                Wraps a value to be explicitly serialized as a graphson Bigint.

                +
                + +
                +
                +cassandra.graph.to_smallint(value)
                +

                Wraps a value to be explicitly serialized as a graphson Smallint.

                +
                + +
                +
                +cassandra.graph.to_float(value)
                +

                Wraps a value to be explicitly serialized as a graphson Float.

                +
                + +
                +
                +cassandra.graph.to_double(value)
                +

                Wraps a value to be explicitly serialized as a graphson Double.

                +
                + +
                +
                +class cassandra.graph.GraphProtocol
                +
                +
                +GRAPHSON_1_0 = b'graphson-1.0'
                +

                GraphSON1

                +
                + +
                +
                +GRAPHSON_2_0 = b'graphson-2.0'
                +

                GraphSON2

                +
                + +
                +
                +GRAPHSON_3_0 = b'graphson-3.0'
                +

                GraphSON3

                +
                + +
                + +
                +
                +class cassandra.graph.GraphOptions(**kwargs)
                +

                Options for DSE Graph Query handler.

                +
                +
                +graph_name
                +

                name of the targeted graph.

                +
                + +
                +
                +graph_source
                +

                choose the graph traversal source, configured on the server side.

                +
                + +
                +
                +graph_language
                +

                the language used in the queries (default “gremlin-groovy”)

                +
                + +
                +
                +graph_read_consistency_level
                +

                read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

                +
                + +
                +
                +graph_write_consistency_level
                +

                write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

                +
                + +
                +
                +is_default_source
                +
                + +
                +
                +is_analytics_source
                +

                True if graph_source is set to the server-defined analytics traversal source (‘a’)

                +
                + +
                +
                +is_graph_source
                +

                True if graph_source is set to the server-defined graph traversal source (‘g’)

                +
                + +
                +
                +set_source_default()
                +

                Sets graph_source to the server-defined default traversal source (‘default’)

                +
                + +
                +
                +set_source_analytics()
                +

                Sets graph_source to the server-defined analytic traversal source (‘a’)

                +
                + +
                +
                +set_source_graph()
                +

                Sets graph_source to the server-defined graph traversal source (‘g’)

                +
                + +
                + +
                +
                +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                +

                Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

                +

                query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                +

                See Statement attributes for a description of the other parameters.

                +
                + +
                +
                +class cassandra.graph.Result(value)
                +

                Represents deserialized graph results. +Property and item getters are provided for convenience.

                +
                +
                +value = None
                +

                Deserialized value from the result

                +
                + +
                +
                +as_vertex()
                +

                Return a Vertex parsed from this result

                +

                Raises TypeError if parsing fails (i.e. the result structure is not valid).

                +
                + +
                +
                +as_edge()
                +

                Return a Edge parsed from this result

                +

                Raises TypeError if parsing fails (i.e. the result structure is not valid).

                +
                + +
                +
                +as_path()
                +

                Return a Path parsed from this result

                +

                Raises TypeError if parsing fails (i.e. the result structure is not valid).

                +
                + +
                + +
                +
                +class cassandra.graph.Vertex(id, label, type, properties)
                +

                Represents a Vertex element from a graph query.

                +

                Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

                +
                + +
                +
                +class cassandra.graph.VertexProperty(label, value, properties=None)
                +

                Vertex properties have a top-level value and an optional dict of properties.

                +
                +
                +label = None
                +

                label of the property

                +
                + +
                +
                +value = None
                +

                Value of the property

                +
                + +
                +
                +properties = None
                +

                dict of properties attached to the property

                +
                + +
                + +
                +
                +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
                +

                Represents an Edge element from a graph query.

                +

                Attributes match initializer parameters.

                +
                + +
                +
                +class cassandra.graph.Path(labels, objects)
                +

                Represents a graph path.

                +

                Labels list is taken verbatim from the results.

                +

                Objects are either Result or Vertex/Edge for recognized types

                +
                +
                +labels = None
                +

                List of labels in the path

                +
                + +
                +
                +objects = None
                +

                List of objects in the path

                +
                + +
                + +
                +
                +class cassandra.graph.GraphSON1Serializer
                +

                Serialize python objects to graphson types.

                +
                + +
                +
                +class cassandra.graph.GraphSON1Deserializer
                +

                Deserialize graphson1 types to python objects.

                +
                +
                +classmethod deserialize_date(value)
                +
                + +
                +
                +classmethod deserialize_timestamp(value)
                +
                + +
                +
                +classmethod deserialize_time(value)
                +
                + +
                +
                +classmethod deserialize_duration(value)
                +
                + +
                +
                +classmethod deserialize_int(value)
                +
                + +
                +
                +classmethod deserialize_bigint(value)
                +
                + +
                +
                +classmethod deserialize_double(value)
                +
                + +
                +
                +classmethod deserialize_float(value)
                +
                + +
                +
                +classmethod deserialize_uuid(value)
                +
                + +
                +
                +classmethod deserialize_blob(value)
                +
                + +
                +
                +classmethod deserialize_decimal(value)
                +
                + +
                +
                +classmethod deserialize_point(value)
                +
                + +
                +
                +classmethod deserialize_linestring(value)
                +
                + +
                +
                +classmethod deserialize_polygon(value)
                +
                + +
                + +
                +
                +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
                +

                GraphSON2 Reader that parse json and deserialize to python objects.

                +
                +
                Parameters:
                +

                extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                +
                +
                +
                +
                +read(json_data)
                +

                Read and deserialize json_data.

                +
                + +
                +
                +deserialize(obj)
                +

                Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

                +
                + +
                + +
                +
                +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
                +

                GraphSON3 Reader that parse json and deserialize to python objects.

                +
                +
                Parameters:
                +
                  +
                • context – A dict of the context, mostly used as context for udt deserialization.

                • +
                • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                • +
                +
                +
                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/io/asyncioreactor.html b/3.26.4-scylla/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..f04e4b9cf3 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,647 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.io.asyncioreactor - asyncio Event Loop

                +
                +
                +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
                +

                An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

                +

                Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

                +
                +
                +classmethod initialize_reactor()
                +

                Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/io/asyncorereactor.html b/3.26.4-scylla/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..ae9d2bc5de --- /dev/null +++ b/3.26.4-scylla/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.io.asyncorereactor - asyncore Event Loop

                +
                +
                +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
                +

                An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

                +
                +
                +classmethod initialize_reactor()
                +

                Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                +
                + +
                +
                +classmethod handle_fork()
                +

                Called after a forking. This should cleanup any remaining reactor state +from the parent process.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/io/eventletreactor.html b/3.26.4-scylla/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..de33184fc6 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/io/eventletreactor.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.io.eventletreactor - eventlet-compatible Connection

                +
                +
                +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
                +

                An implementation of Connection that utilizes eventlet.

                +

                This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

                +
                +
                +classmethod initialize_reactor()
                +

                Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                +
                + +
                +
                +classmethod service_timeouts()
                +

                cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/io/geventreactor.html b/3.26.4-scylla/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..fef9317c9e --- /dev/null +++ b/3.26.4-scylla/api/cassandra/io/geventreactor.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.io.geventreactor - gevent-compatible Event Loop

                +
                +
                +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
                +

                An implementation of Connection that utilizes gevent.

                +

                This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

                +
                +
                +classmethod initialize_reactor()
                +

                Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/io/libevreactor.html b/3.26.4-scylla/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..5d24a62ec6 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/io/libevreactor.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.io.libevreactor - libev Event Loop

                +
                +
                +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
                +

                An implementation of Connection that uses libev for its event loop.

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/io/twistedreactor.html b/3.26.4-scylla/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..6741ed04cf --- /dev/null +++ b/3.26.4-scylla/api/cassandra/io/twistedreactor.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.io.twistedreactor - Twisted Event Loop

                +
                +
                +class cassandra.io.twistedreactor.TwistedConnection
                +

                An implementation of Connection that uses +Twisted’s reactor as its event loop.

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/metadata.html b/3.26.4-scylla/api/cassandra/metadata.html new file mode 100644 index 0000000000..cbee344cc0 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/metadata.html @@ -0,0 +1,1095 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.metadata - Schema and Ring Topology

                +
                +
                +cassandra.metadata.cql_keywords
                +

                set() -> new empty set object +set(iterable) -> new set object

                +

                Build an unordered collection of unique elements.

                +
                + +
                +
                +cassandra.metadata.cql_keywords_unreserved
                +

                set() -> new empty set object +set(iterable) -> new set object

                +

                Build an unordered collection of unique elements.

                +
                + +
                +
                +cassandra.metadata.cql_keywords_reserved
                +

                set() -> new empty set object +set(iterable) -> new set object

                +

                Build an unordered collection of unique elements.

                +
                + +
                +
                +class cassandra.metadata.Metadata
                +

                Holds a representation of the cluster schema and topology.

                +
                +
                +add_or_return_host(host)
                +

                Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

                +
                + +
                +
                +all_hosts()
                +

                Returns a list of all known Host instances in the cluster.

                +
                + +
                +
                +export_schema_as_string()
                +

                Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

                +
                + +
                +
                +get_host(endpoint_or_address, port=None)
                +

                Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

                +
                + +
                +
                +get_host_by_host_id(host_id)
                +

                Same as get_host() but use host_id for lookup.

                +
                + +
                +
                +get_replicas(keyspace, key)
                +

                Returns a list of Host instances that are replicas for a given +partition key.

                +
                + +
                + +
                +

                Schemas

                +
                +
                +class cassandra.metadata.KeyspaceMetadata
                +

                A representation of the schema for a single keyspace.

                +
                +
                +as_cql_query()
                +

                Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

                +
                + +
                +
                +export_as_string()
                +

                Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

                +
                + +
                + +
                +
                +class cassandra.metadata.UserType
                +

                A user defined type, as created by CREATE TYPE statements.

                +

                User-defined types were introduced in Cassandra 2.1.

                +
                +

                New in version 2.1.0.

                +
                +
                +
                +as_cql_query(formatted=False)
                +

                Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                +
                + +
                + +
                +
                +class cassandra.metadata.Function
                +

                A user defined function, as created by CREATE FUNCTION statements.

                +

                User-defined functions were introduced in Cassandra 2.2

                +
                +

                New in version 2.6.0.

                +
                +
                +
                +as_cql_query(formatted=False)
                +

                Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                +
                + +
                + +
                +
                +class cassandra.metadata.Aggregate
                +

                A user defined aggregate function, as created by CREATE AGGREGATE statements.

                +

                Aggregate functions were introduced in Cassandra 2.2

                +
                +

                New in version 2.6.0.

                +
                +
                +
                +as_cql_query(formatted=False)
                +

                Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                +
                + +
                + +
                +
                +class cassandra.metadata.TableMetadata
                +

                A representation of the schema for a single table.

                +
                +
                +as_cql_query(formatted=False)
                +

                Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

                +
                + +
                +
                +export_as_string()
                +

                Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

                +
                + +
                +
                +property is_cql_compatible
                +

                A boolean indicating if this table can be represented as CQL in export

                +
                + +
                +
                +property primary_key
                +

                A list of ColumnMetadata representing the components of +the primary key for this table.

                +
                + +
                + +
                +
                +class cassandra.metadata.TableMetadataV3
                +

                For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

                +
                +
                +property is_cql_compatible
                +

                A boolean indicating if this table can be represented as CQL in export

                +
                + +
                + +
                +
                +class cassandra.metadata.TableMetadataDSE68
                +
                +
                +as_cql_query(formatted=False)
                +

                Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

                +
                + +
                + +
                +
                +class cassandra.metadata.ColumnMetadata
                +

                A representation of a single column in a table.

                +
                + +
                +
                +class cassandra.metadata.IndexMetadata
                +

                A representation of a secondary index on a column.

                +
                +
                +as_cql_query()
                +

                Returns a CQL query that can be used to recreate this index.

                +
                + +
                +
                +export_as_string()
                +

                Returns a CQL query string that can be used to recreate this index.

                +
                + +
                + +
                +
                +class cassandra.metadata.MaterializedViewMetadata
                +

                A representation of a materialized view on a table

                +
                +
                +as_cql_query(formatted=False)
                +

                Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                +
                + +
                + +
                +
                +class cassandra.metadata.VertexMetadata
                +

                A representation of a vertex on a table

                +
                + +
                +
                +class cassandra.metadata.EdgeMetadata
                +

                A representation of an edge on a table

                +
                + +
                +
                +

                Tokens and Ring Topology

                +
                +
                +class cassandra.metadata.TokenMap
                +

                Information about the layout of the ring.

                +
                +
                +get_replicas(keyspace, token)
                +

                Get a set of Host instances representing all of the +replica nodes for a given Token.

                +
                + +
                + +
                +
                +class cassandra.metadata.Token
                +

                Abstract class representing a token.

                +
                + +
                +
                +class cassandra.metadata.Murmur3Token(token)
                +

                A token for Murmur3Partitioner.

                +

                token is an int or string representing the token.

                +
                + +
                +
                +class cassandra.metadata.MD5Token(token)
                +

                A token for RandomPartitioner.

                +
                + +
                +
                +class cassandra.metadata.BytesToken(token)
                +

                A token for ByteOrderedPartitioner.

                +
                +
                +classmethod from_string(token_string)
                +

                token_string should be the string representation from the server.

                +
                + +
                + +
                +
                +cassandra.metadata.ReplicationStrategy
                +

                alias of _ReplicationStrategy

                +
                + +
                +
                +class cassandra.metadata.ReplicationFactor(all_replicas, transient_replicas=None)
                +

                Represent the replication factor of a keyspace.

                +
                + +
                +
                +class cassandra.metadata.SimpleStrategy(options_map)
                +
                +
                +export_for_schema()
                +

                Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                +
                + +
                +
                +property replication_factor
                +

                The replication factor for this keyspace.

                +

                For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

                +
                + +
                + +
                +
                +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
                +
                +
                +export_for_schema()
                +

                Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                +
                + +
                + +
                +
                +class cassandra.metadata.LocalStrategy(options_map)
                +
                +
                +export_for_schema()
                +

                Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                +
                + +
                + +
                +
                +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
                +

                Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

                +

                If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

                +

                Example usage:

                +
                >>> result = group_keys_by_replica(
                +...     session, "system", "peers",
                +...     (("127.0.0.1", ), ("127.0.0.2", )))
                +
                +
                +
                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/metrics.html b/3.26.4-scylla/api/cassandra/metrics.html new file mode 100644 index 0000000000..7521182f64 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/metrics.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.metrics - Performance Metrics

                +
                +
                +class cassandra.metrics.Metrics
                +

                A collection of timers and counters for various performance metrics.

                +

                Timer metrics are represented as floating point seconds.

                +
                +
                +request_timer = None
                +

                A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

                +
                  +
                • count - number of requests that have been timed

                • +
                • min - min latency

                • +
                • max - max latency

                • +
                • mean - mean latency

                • +
                • stddev - standard deviation for latencies

                • +
                • median - median latency

                • +
                • 75percentile - 75th percentile latencies

                • +
                • 95percentile - 95th percentile latencies

                • +
                • 98percentile - 98th percentile latencies

                • +
                • 99percentile - 99th percentile latencies

                • +
                • 999percentile - 99.9th percentile latencies

                • +
                +
                + +
                +
                +connection_errors = None
                +

                A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

                +
                + +
                +
                +write_timeouts = None
                +

                A greplin.scales.IntStat count of write requests that resulted +in a timeout.

                +
                + +
                +
                +read_timeouts = None
                +

                A greplin.scales.IntStat count of read requests that resulted +in a timeout.

                +
                + +
                +
                +unavailables = None
                +

                A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

                +
                + +
                +
                +other_errors = None
                +

                A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

                +
                + +
                +
                +retries = None
                +

                A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

                +
                + +
                +
                +ignores = None
                +

                A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

                +
                + +
                +
                +known_hosts = None
                +

                A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

                +
                + +
                +
                +connected_to = None
                +

                A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

                +
                + +
                +
                +open_connections = None
                +

                A greplin.scales.IntStat count of the number connections +the driver currently has open.

                +
                + +
                +
                +get_stats()
                +

                Returns the metrics for the registered cluster instance.

                +
                + +
                +
                +set_stats_name(stats_name)
                +

                Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/policies.html b/3.26.4-scylla/api/cassandra/policies.html new file mode 100644 index 0000000000..5a913e2a0b --- /dev/null +++ b/3.26.4-scylla/api/cassandra/policies.html @@ -0,0 +1,1871 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.policies - Load balancing and Failure Handling Policies

                +
                +

                Load Balancing

                +
                +
                +class cassandra.policies.HostDistance
                +

                A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

                +
                +
                +IGNORED = -1
                +

                A node with this distance should never be queried or have +connections opened to it.

                +
                + +
                +
                +LOCAL = 0
                +

                Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

                +

                This distance is typically used for nodes within the same +datacenter as the client.

                +
                + +
                +
                +REMOTE = 1
                +

                Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

                +

                This distance is typically used for nodes outside of the +datacenter that the client is running in.

                +
                + +
                + +
                +
                +class cassandra.policies.LoadBalancingPolicy
                +

                Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

                +

                In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

                +

                You may also use subclasses of LoadBalancingPolicy for +custom behavior.

                +
                +
                +distance(host)
                +

                Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                +
                + +
                +
                +populate(cluster, hosts)
                +

                This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                +
                + +
                +
                +make_query_plan(working_keyspace=None, query=None)
                +

                Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                +

                Note that the query argument may be None when preparing +statements.

                +

                working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                +
                + +
                +
                +check_supported()
                +

                This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

                +
                + +
                + +
                +
                +class cassandra.policies.RoundRobinPolicy
                +

                A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

                +
                +
                +populate(cluster, hosts)
                +

                This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                +
                + +
                +
                +distance(host)
                +

                Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                +
                + +
                +
                +make_query_plan(working_keyspace=None, query=None)
                +

                Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                +

                Note that the query argument may be None when preparing +statements.

                +

                working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                +
                + +
                +
                +on_up(host)
                +

                Called when a node is marked up.

                +
                + +
                +
                +on_down(host)
                +

                Called when a node is marked down.

                +
                + +
                +
                +on_add(host)
                +

                Called when a node is added to the cluster. The newly added node +should be considered up.

                +
                + +
                +
                +on_remove(host)
                +

                Called when a node is removed from the cluster.

                +
                + +
                + +
                +
                +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
                +

                Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

                +

                The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

                +

                used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

                +
                +
                +populate(cluster, hosts)
                +

                This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                +
                + +
                +
                +distance(host)
                +

                Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                +
                + +
                +
                +make_query_plan(working_keyspace=None, query=None)
                +

                Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                +

                Note that the query argument may be None when preparing +statements.

                +

                working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                +
                + +
                +
                +on_up(host)
                +

                Called when a node is marked up.

                +
                + +
                +
                +on_down(host)
                +

                Called when a node is marked down.

                +
                + +
                +
                +on_add(host)
                +

                Called when a node is added to the cluster. The newly added node +should be considered up.

                +
                + +
                +
                +on_remove(host)
                +

                Called when a node is removed from the cluster.

                +
                + +
                + +
                +
                +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
                +

                A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

                +

                This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

                +

                The hosts parameter should be a sequence of hosts to permit +connections to.

                +
                +
                +populate(cluster, hosts)
                +

                This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                +
                + +
                +
                +distance(host)
                +

                Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                +
                + +
                +
                +on_up(host)
                +

                Called when a node is marked up.

                +
                + +
                +
                +on_add(host)
                +

                Called when a node is added to the cluster. The newly added node +should be considered up.

                +
                + +
                + +
                +
                +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
                +

                A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

                +

                This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

                +

                If no routing_key is set on the query, the child +policy’s query plan will be used as is.

                +
                +
                +shuffle_replicas = False
                +

                Yield local replicas in a random order.

                +
                + +
                +
                +populate(cluster, hosts)
                +

                This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                +
                + +
                +
                +check_supported()
                +

                This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

                +
                + +
                +
                +distance(*args, **kwargs)
                +

                Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                +
                + +
                +
                +make_query_plan(working_keyspace=None, query=None)
                +

                Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                +

                Note that the query argument may be None when preparing +statements.

                +

                working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                +
                + +
                +
                +on_up(*args, **kwargs)
                +

                Called when a node is marked up.

                +
                + +
                +
                +on_down(*args, **kwargs)
                +

                Called when a node is marked down.

                +
                + +
                +
                +on_add(*args, **kwargs)
                +

                Called when a node is added to the cluster. The newly added node +should be considered up.

                +
                + +
                +
                +on_remove(*args, **kwargs)
                +

                Called when a node is removed from the cluster.

                +
                + +
                + +
                +
                +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
                +

                A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

                +

                This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

                +
                def address_is_ignored(host):
                +    return host.address in [ignored_address0, ignored_address1]
                +
                +blacklist_filter_policy = HostFilterPolicy(
                +    child_policy=RoundRobinPolicy(),
                +    predicate=address_is_ignored
                +)
                +
                +cluster = Cluster(
                +    primary_host,
                +    load_balancing_policy=blacklist_filter_policy,
                +)
                +
                +
                +

                See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

                +

                Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

                +
                +
                Parameters:
                +
                  +
                • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

                • +
                • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

                • +
                +
                +
                +
                +
                +predicate(host)
                +

                A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

                +

                This is a read-only value set in __init__, implemented as a +property.

                +
                + +
                +
                +distance(host)
                +

                Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

                +
                + +
                +
                +make_query_plan(working_keyspace=None, query=None)
                +

                Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

                +

                Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

                +
                + +
                + +
                +
                +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
                +

                A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

                +

                If no host is set on the query, the child policy’s query plan will be used as is.

                +
                +
                +populate(cluster, hosts)
                +

                This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                +
                + +
                +
                +make_query_plan(working_keyspace=None, query=None)
                +

                Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                +

                Note that the query argument may be None when preparing +statements.

                +

                working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                +
                + +
                + +
                +
                +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
                +

                Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

                +
                + +
                +
                +

                Translating Server Node Addresses

                +
                +
                +class cassandra.policies.AddressTranslator
                +

                Interface for translating cluster-defined endpoints.

                +

                The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

                +

                Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

                +
                +
                +translate(addr)
                +

                Accepts the node ip address, and returns a translated address to be used connecting to this node.

                +
                + +
                + +
                +
                +class cassandra.policies.IdentityTranslator
                +

                Returns the endpoint with no translation

                +
                +
                +translate(addr)
                +

                Accepts the node ip address, and returns a translated address to be used connecting to this node.

                +
                + +
                + +
                +
                +class cassandra.policies.EC2MultiRegionTranslator
                +

                Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

                +
                +
                +translate(addr)
                +

                Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

                +
                + +
                + +
                +
                +

                Marking Hosts Up or Down

                +
                +
                +class cassandra.policies.ConvictionPolicy(host)
                +

                A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

                +

                If custom behavior is needed, this class may be subclassed.

                +

                host is an instance of Host.

                +
                +
                +add_failure(connection_exc)
                +

                Implementations should return True if the host should be +convicted, False otherwise.

                +
                + +
                +
                +reset()
                +

                Implementations should clear out any convictions or state regarding +the host.

                +
                + +
                + +
                +
                +class cassandra.policies.SimpleConvictionPolicy(host)
                +

                The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

                +

                host is an instance of Host.

                +
                +
                +add_failure(connection_exc)
                +

                Implementations should return True if the host should be +convicted, False otherwise.

                +
                + +
                +
                +reset()
                +

                Implementations should clear out any convictions or state regarding +the host.

                +
                + +
                + +
                +
                +

                Reconnecting to Dead Hosts

                +
                +
                +class cassandra.policies.ReconnectionPolicy
                +

                This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

                +

                If custom behavior is needed, this class may be subclassed.

                +
                +
                +new_schedule()
                +

                This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                +
                + +
                + +
                +
                +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
                +

                A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

                +

                delay should be a floating point number of seconds to wait inbetween +each attempt.

                +

                max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

                +
                +
                +new_schedule()
                +

                This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                +
                + +
                + +
                +
                +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
                +

                A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

                +

                A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

                +

                base_delay and max_delay should be in floating point units of +seconds.

                +

                max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

                +
                +
                +new_schedule()
                +

                This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                +
                + +
                + +
                +
                +

                Retrying Failed Operations

                +
                +
                +class cassandra.policies.WriteType
                +

                For usage with RetryPolicy, this describe a type +of write operation.

                +
                +
                +SIMPLE = 0
                +

                A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

                +
                + +
                +
                +BATCH = 1
                +

                A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

                +
                + +
                +
                +UNLOGGED_BATCH = 2
                +

                A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

                +
                + +
                +
                +COUNTER = 3
                +

                A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

                +
                + +
                +
                +BATCH_LOG = 4
                +

                The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

                +
                + +
                +
                +CAS = 5
                +

                A lighweight-transaction write, such as “DELETE … IF EXISTS”.

                +
                + +
                +
                +VIEW = 6
                +

                This WriteType is only seen in results for requests that were unable to +complete MV operations.

                +
                + +
                +
                +CDC = 7
                +

                This WriteType is only seen in results for requests that were unable to +complete CDC operations.

                +
                + +
                + +
                +
                +class cassandra.policies.RetryPolicy
                +

                A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

                +

                To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

                +

                To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

                +

                If custom behavior is needed for retrying certain operations, +this class may be subclassed.

                +
                +
                +RETRY = 0
                +

                This should be returned from the below methods if the operation +should be retried on the same connection.

                +
                + +
                +
                +RETHROW = 1
                +

                This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

                +
                + +
                +
                +IGNORE = 2
                +

                This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

                +
                + +
                +
                +RETRY_NEXT_HOST = 3
                +

                This should be returned from the below methods if the operation +should be retried on another connection.

                +
                + +
                +
                +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
                +

                This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                +
                + +
                +
                +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
                +

                This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                write_type is one of the WriteType enums describing the +type of write operation.

                +

                The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                +
                + +
                +
                +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
                +

                This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                +

                query is the Statement that failed.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                +
                + +
                +
                +on_request_error(query, consistency, error, retry_num)
                +

                This is called when an unexpected error happens. This can be in the +following situations:

                +
                  +
                • On a connection error

                • +
                • On server errors: overloaded, isBootstrapping, serverError, etc.

                • +
                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                error the instance of the exception.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                The default, it triggers a retry on the next host in the query plan +with the same consistency level.

                +
                + +
                + +
                +
                +class cassandra.policies.FallthroughRetryPolicy
                +

                A retry policy that never retries and always propagates failures to +the application.

                +
                +
                +on_read_timeout(*args, **kwargs)
                +

                This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                +
                + +
                +
                +on_write_timeout(*args, **kwargs)
                +

                This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                write_type is one of the WriteType enums describing the +type of write operation.

                +

                The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                +
                + +
                +
                +on_unavailable(*args, **kwargs)
                +

                This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                +

                query is the Statement that failed.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                +
                + +
                +
                +on_request_error(*args, **kwargs)
                +

                This is called when an unexpected error happens. This can be in the +following situations:

                +
                  +
                • On a connection error

                • +
                • On server errors: overloaded, isBootstrapping, serverError, etc.

                • +
                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                error the instance of the exception.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                The default, it triggers a retry on the next host in the query plan +with the same consistency level.

                +
                + +
                + +
                +
                +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
                +

                Deprecated: This retry policy will be removed in the next major release.

                +

                A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

                +

                BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

                +

                This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

                +
                  +
                • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

                • +
                • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

                • +
                • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

                • +
                +

                The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

                +
                  +
                • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

                • +
                • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

                • +
                +

                In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

                +
                +
                +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
                +

                This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                +
                + +
                +
                +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
                +

                This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                +

                query is the Statement that timed out.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                write_type is one of the WriteType enums describing the +type of write operation.

                +

                The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                +
                + +
                +
                +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
                +

                This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                +

                query is the Statement that failed.

                +

                consistency is the ConsistencyLevel that the operation was +attempted at.

                +

                required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                +

                retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                +

                By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                +
                + +
                + +
                +
                +

                Retrying Idempotent Operations

                +
                +
                +class cassandra.policies.SpeculativeExecutionPolicy
                +

                Interface for specifying speculative execution plans

                +
                +
                +new_plan(keyspace, statement)
                +

                Returns

                +
                +
                Parameters:
                +
                  +
                • keyspace

                • +
                • statement

                • +
                +
                +
                Returns:
                +

                +
                +
                +
                + +
                + +
                +
                +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
                +

                A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

                +
                +
                +new_plan(keyspace, statement)
                +

                Returns

                +
                +
                Parameters:
                +
                  +
                • keyspace

                • +
                • statement

                • +
                +
                +
                Returns:
                +

                +
                +
                +
                + +
                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/pool.html b/3.26.4-scylla/api/cassandra/pool.html new file mode 100644 index 0000000000..fd3b66cf67 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/pool.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.pool - Hosts and Connection Pools

                +

                Connection pooling and host management.

                +
                +
                +class cassandra.pool.Host
                +

                Represents a single Cassandra node.

                +
                +
                +property address
                +

                The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

                +
                + +
                +
                +property datacenter
                +

                The datacenter the node is in.

                +
                + +
                +
                +property rack
                +

                The rack the node is in.

                +
                + +
                + +
                +
                +exception cassandra.pool.NoConnectionsAvailable
                +

                All existing connections to a given host are busy, or there are +no open connections.

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/protocol.html b/3.26.4-scylla/api/cassandra/protocol.html new file mode 100644 index 0000000000..76f0de60c1 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/protocol.html @@ -0,0 +1,723 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.protocol - Protocol Features

                +
                +

                Custom Payloads

                +

                Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

                +

                By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

                +

                See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

                +
                +
                +class cassandra.protocol._ProtocolHandler
                +

                _ProtocolHander handles encoding and decoding messages.

                +

                This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

                +

                Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

                +
                +
                +message_types_by_opcode = {default mapping}
                +
                + +
                +
                +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
                +

                Encodes a message using the specified frame parameters, and compressor

                +
                +
                Parameters:
                +
                  +
                • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

                • +
                • stream_id – protocol stream id for the frame header

                • +
                • protocol_version – version for the frame header, and used encoding contents

                • +
                • compressor – optional compression function to be used on the body

                • +
                +
                +
                +
                + +
                +
                +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
                +

                Decodes a native protocol message body

                +
                +
                Parameters:
                +
                  +
                • protocol_version – version to use decoding contents

                • +
                • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

                • +
                • stream_id – native protocol stream id from the frame header

                • +
                • flags – native protocol flags bitmap from the header

                • +
                • opcode – native protocol opcode from the header

                • +
                • body – frame body

                • +
                • decompressor – optional decompression function to inflate the body

                • +
                +
                +
                Returns:
                +

                a message decoded from the body and frame attributes

                +
                +
                +
                + +
                + +
                +
                +

                Faster Deserialization

                +

                When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

                +
                from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
                +from cassandra.query import tuple_factory
                +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
                +s.row_factory = tuple_factory  #required for Numpy results
                +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
                +
                +
                +

                These protocol handlers comprise different parsers, and return results as described below:

                +
                  +
                • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

                • +
                • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

                • +
                • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

                • +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/query.html b/3.26.4-scylla/api/cassandra/query.html new file mode 100644 index 0000000000..b373c849f9 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/query.html @@ -0,0 +1,1030 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

                +
                +
                +cassandra.query.tuple_factory(colnames, rows)
                +

                Returns each row as a tuple

                +

                Example:

                +
                >>> from cassandra.query import tuple_factory
                +>>> session = cluster.connect('mykeyspace')
                +>>> session.row_factory = tuple_factory
                +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                +>>> print rows[0]
                +('Bob', 42)
                +
                +
                +
                +

                Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                +
                +
                + +
                +
                +cassandra.query.named_tuple_factory(colnames, rows)
                +

                Returns each row as a namedtuple. +This is the default row factory.

                +

                Example:

                +
                >>> from cassandra.query import named_tuple_factory
                +>>> session = cluster.connect('mykeyspace')
                +>>> session.row_factory = named_tuple_factory
                +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                +>>> user = rows[0]
                +
                +>>> # you can access field by their name:
                +>>> print "name: %s, age: %d" % (user.name, user.age)
                +name: Bob, age: 42
                +
                +>>> # or you can access fields by their position (like a tuple)
                +>>> name, age = user
                +>>> print "name: %s, age: %d" % (name, age)
                +name: Bob, age: 42
                +>>> name = user[0]
                +>>> age = user[1]
                +>>> print "name: %s, age: %d" % (name, age)
                +name: Bob, age: 42
                +
                +
                +
                +

                Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                +
                +
                + +
                +
                +cassandra.query.dict_factory(colnames, rows)
                +

                Returns each row as a dict.

                +

                Example:

                +
                >>> from cassandra.query import dict_factory
                +>>> session = cluster.connect('mykeyspace')
                +>>> session.row_factory = dict_factory
                +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                +>>> print rows[0]
                +{u'age': 42, u'name': u'Bob'}
                +
                +
                +
                +

                Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                +
                +
                + +
                +
                +cassandra.query.ordered_dict_factory(colnames, rows)
                +

                Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

                +
                +

                Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                +
                +
                + +
                +
                +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                +

                A simple, un-prepared query.

                +

                query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                +

                See Statement attributes for a description of the other parameters.

                +
                + +
                +
                +class cassandra.query.PreparedStatement
                +

                A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

                +

                A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

                +

                A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

                +
                +
                +bind(values)
                +

                Creates and returns a BoundStatement instance using values.

                +

                See BoundStatement.bind() for rules on input values.

                +
                + +
                + +
                +
                +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
                +

                A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

                +

                prepared_statement should be an instance of PreparedStatement.

                +

                See Statement attributes for a description of the other parameters.

                +
                +
                +bind(values)
                +

                Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

                +
                  +
                • a sequence, even if you are only binding one value, or

                • +
                • a dict that relates 1-to-1 between dict keys and columns

                • +
                +
                +

                Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

                +
                  +
                • short sequences will be extended to match bind parameters with UNSET_VALUE

                • +
                • names may be omitted from a dict with UNSET_VALUE implied.

                • +
                +
                +
                +

                Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

                +
                +
                + +
                +
                +property routing_key
                +

                The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

                +

                If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

                +
                + +
                + +
                +
                +class cassandra.query.Statement
                +

                An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

                +
                +
                +property routing_key
                +

                The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

                +

                If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

                +
                + +
                +
                +property serial_consistency_level
                +

                The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

                +

                The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

                +

                The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

                +

                Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

                +

                See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

                +
                +

                New in version 2.0.0.

                +
                +
                + +
                + +
                +
                +cassandra.query.UNSET_VALUE
                +

                The base class of the class hierarchy.

                +

                When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                +
                + +
                +
                +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
                +

                A protocol-level batch of operations which are applied atomically +by default.

                +
                +

                New in version 2.0.0.

                +
                +

                batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

                +

                retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

                +

                consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

                +

                custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

                +

                Example usage:

                +
                insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
                +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
                +
                +for (name, age) in users_to_insert:
                +    batch.add(insert_user, (name, age))
                +
                +session.execute(batch)
                +
                +
                +

                You can also mix different types of operations within a batch:

                +
                batch = BatchStatement()
                +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
                +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
                +session.execute(batch)
                +
                +
                +
                +

                New in version 2.0.0.

                +
                +
                +

                Changed in version 2.1.0: Added serial_consistency_level as a parameter

                +
                +
                +

                Changed in version 2.6.0: Added custom_payload as a parameter

                +
                +
                +
                +add(statement, parameters=None)
                +

                Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

                +

                Like with other statements, parameters must be a sequence, even +if there is only one item.

                +
                + +
                +
                +add_all(statements, parameters)
                +

                Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

                +
                + +
                +
                +clear()
                +

                This is a convenience method to clear a batch statement for reuse.

                +

                Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

                +
                + +
                +
                +serial_consistency_level = None
                +
                + +
                + +
                +
                +class cassandra.query.BatchType
                +

                A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

                +
                +

                New in version 2.0.0.

                +
                +
                +
                +LOGGED = BatchType.LOGGED
                +
                + +
                +
                +UNLOGGED = BatchType.UNLOGGED
                +
                + +
                +
                +COUNTER = BatchType.COUNTER
                +
                + +
                + +
                +
                +class cassandra.query.ValueSequence(iterable=(), /)
                +

                A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

                +

                This is typically needed when supplying a list of keys to select. +For example:

                +
                >>> my_user_ids = ('alice', 'bob', 'charles')
                +>>> query = "SELECT * FROM users WHERE user_id IN %s"
                +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
                +
                +
                +
                + +
                +
                +class cassandra.query.QueryTrace
                +

                A trace of the duration and events that occurred when executing +an operation.

                +
                +
                +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
                +

                Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

                +

                wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

                +

                query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

                +
                + +
                + +
                +
                +class cassandra.query.TraceEvent
                +

                Representation of a single event within a query trace.

                +
                + +
                +
                +exception cassandra.query.TraceUnavailable
                +

                Raised when complete trace details cannot be fetched from Cassandra.

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/timestamps.html b/3.26.4-scylla/api/cassandra/timestamps.html new file mode 100644 index 0000000000..82a359c02b --- /dev/null +++ b/3.26.4-scylla/api/cassandra/timestamps.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.timestamps - Timestamp Generation

                +
                +
                +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
                +

                An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

                +
                +

                New in version 3.8.0.

                +
                +
                +
                +warn_on_drift = True
                +

                If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

                +
                + +
                +
                +warning_threshold = 1
                +

                This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

                +
                + +
                +
                +warning_interval = 1
                +

                This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

                +
                + +
                +
                +_next_timestamp(now, last)
                +

                Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

                +
                +
                Parameters:
                +
                  +
                • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

                • +
                • last (int) – an integer representing the last timestamp returned by +this object

                • +
                +
                +
                +
                + +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/cassandra/util.html b/3.26.4-scylla/api/cassandra/util.html new file mode 100644 index 0000000000..ac76c55085 --- /dev/null +++ b/3.26.4-scylla/api/cassandra/util.html @@ -0,0 +1,1073 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                cassandra.util - Utilities

                +
                +
                +class cassandra.util.Date(value)
                +

                Idealized date: year, month, day

                +

                Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

                +

                Initializer value can be:

                +
                  +
                • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

                • +
                • datetime.date: built-in date

                • +
                • string_type: a string time of the form “yyyy-mm-dd”

                • +
                +
                +
                +date()
                +

                Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

                +

                ValueError is raised for Dates outside this range.

                +
                + +
                +
                +property seconds
                +

                Absolute seconds from epoch (can be negative)

                +
                + +
                + +
                +
                +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
                +

                DSE DateRange Type

                +
                +
                +lower_bound
                +

                DateRangeBound representing the lower bound of a bounded range.

                +
                + +
                +
                +upper_bound
                +

                DateRangeBound representing the upper bound of a bounded range.

                +
                + +
                +
                +value
                +

                DateRangeBound representing the value of a single-value range.

                +
                + +

                As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

                +
                +
                Parameters:
                +
                +
                +
                +
                + +
                +
                +class cassandra.util.DateRangeBound(value, precision)
                +

                Represents a single date value and its precision for DateRange.

                +
                +
                +milliseconds
                +

                Integer representing milliseconds since the UNIX epoch. May be negative.

                +
                + +
                +
                +precision
                +

                String representing the precision of a bound. Must be a valid +DateRangePrecision member.

                +
                + +

                DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

                +
                +
                Parameters:
                +
                  +
                • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

                • +
                • precision – a string representing precision

                • +
                +
                +
                +
                +
                +datetime()
                +

                Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

                +
                + +
                +
                +classmethod from_value(value)
                +

                Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

                +
                +
                Parameters:
                +

                value – a dictlike or iterable object

                +
                +
                +
                + +
                + +
                +
                +class cassandra.util.DateRangePrecision
                +

                An “enum” representing the valid values for DateRange.precision.

                +
                + +
                +
                +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
                +

                Represents a Distance geometry for DSE

                +
                +
                +static from_wkt(s)
                +

                Parse a Distance geometry from a wkt string and return a new Distance object.

                +
                + +
                + +
                +
                +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
                +

                Cassandra Duration Type

                +
                + +
                +
                +class cassandra.util.LineString(coords=())
                +

                Represents a linestring geometry for DSE

                +

                ‘coords`: a sequence of (x, y) coordinates of points in the linestring

                +
                +
                +static from_wkt(s)
                +

                Parse a LineString geometry from a wkt string and return a new LineString object.

                +
                + +
                + +
                +
                +class cassandra.util.OrderedMap(*args, **kwargs)
                +

                An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

                +
                >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
                +...                  ({'three': 3, 'four': 4}, 'value2')])
                +>>> list(od.keys())
                +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
                +>>> list(od.values())
                +['value', 'value2']
                +
                +
                +

                These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

                +
                CREATE TABLE example (
                +    ...
                +    value map<frozen<map<int, int>>, double>
                +    ...
                +)
                +
                +
                +

                This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

                +
                + +
                +
                +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
                +
                + +
                +
                +class cassandra.util.Point(x=nan, y=nan)
                +

                Represents a point geometry for DSE

                +
                +
                +static from_wkt(s)
                +

                Parse a Point geometry from a wkt string and return a new Point object.

                +
                + +
                + +
                +
                +class cassandra.util.Polygon(exterior=(), interiors=None)
                +

                Represents a polygon geometry for DSE

                +

                ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

                +
                +
                +static from_wkt(s)
                +

                Parse a Polygon geometry from a wkt string and return a new Polygon object.

                +
                + +
                + +
                +
                +class cassandra.util.SortedSet(iterable=())
                +

                A sorted set based on sorted list

                +

                A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

                +

                #Not implemented: update functions, inplace operators

                +
                + +
                +
                +class cassandra.util.Time(value)
                +

                Idealized time, independent of day.

                +

                Up to nanosecond resolution

                +

                Initializer value can be:

                +
                  +
                • integer_type: absolute nanoseconds in the day

                • +
                • datetime.time: built-in time

                • +
                • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

                • +
                +
                +
                +property hour
                +

                The hour component of this time (0-23)

                +
                + +
                +
                +property minute
                +

                The minute component of this time (0-59)

                +
                + +
                +
                +property nanosecond
                +

                The fractional seconds component of the time, in nanoseconds

                +
                + +
                +
                +property second
                +

                The second component of this time (0-59)

                +
                + +
                +
                +time()
                +

                Return a built-in datetime.time (nanosecond precision truncated to micros).

                +
                + +
                + +
                +
                +class cassandra.util.Version(version)
                +

                Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

                +

                TODO: when python2 support is removed, use packaging.version.

                +
                + +
                +
                +cassandra.util.datetime_from_timestamp(timestamp)
                +

                Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

                +
                +
                Parameters:
                +

                timestamp – a unix timestamp, in seconds

                +
                +
                +
                + +
                +
                +cassandra.util.datetime_from_uuid1(uuid_arg)
                +

                Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

                +
                +
                Parameters:
                +

                uuid_arg – a version 1 UUID

                +
                +
                +
                + +
                +
                +cassandra.util.max_uuid_from_time(timestamp)
                +

                Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

                +

                See uuid_from_time() for argument and return types.

                +
                + +
                +
                +cassandra.util.min_uuid_from_time(timestamp)
                +

                Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

                +

                See uuid_from_time() for argument and return types.

                +
                + +
                +
                +cassandra.util.ms_timestamp_from_datetime(dt)
                +

                Converts a datetime to a timestamp expressed in milliseconds.

                +
                +
                Parameters:
                +

                dt – a datetime.datetime

                +
                +
                +
                + +
                +
                +cassandra.util.sortedset
                +

                alias of SortedSet

                +
                + +
                +
                +cassandra.util.unix_time_from_uuid1(uuid_arg)
                +

                Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

                +
                +
                Parameters:
                +

                uuid_arg – a version 1 UUID

                +
                +
                +
                + +
                +
                +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
                +

                Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

                +

                Raises an OverflowError if the timestamp is out of range for +datetime.

                +
                +
                Parameters:
                +

                timestamp – timestamp, in milliseconds

                +
                +
                +
                + +
                +
                +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
                +

                Converts a datetime or timestamp to a type 1 uuid.UUID.

                +
                +
                Parameters:
                +
                  +
                • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

                • +
                • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

                • +
                • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

                • +
                +
                +
                Return type:
                +

                uuid.UUID

                +
                +
                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/api/index.html b/3.26.4-scylla/api/index.html new file mode 100644 index 0000000000..c121fabd4b --- /dev/null +++ b/3.26.4-scylla/api/index.html @@ -0,0 +1,863 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                API Documentation

                +
                +

                Core Driver

                +
                + +
                +
                +
                +

                Object Mapper

                + +
                +
                +

                DataStax Graph

                + +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/batches.html b/3.26.4-scylla/cqlengine/batches.html new file mode 100644 index 0000000000..02e2b8d22b --- /dev/null +++ b/3.26.4-scylla/cqlengine/batches.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + + + +
                +

                Batch Queries

                +

                cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

                +
                +

                Batch Query General Use Pattern

                +

                You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

                +
                from cassandra.cqlengine.query import BatchQuery
                +
                +#using a context manager
                +with BatchQuery() as b:
                +    now = datetime.now()
                +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
                +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
                +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
                +
                +# -- or --
                +
                +#manually
                +b = BatchQuery()
                +now = datetime.now()
                +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
                +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
                +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
                +b.execute()
                +
                +# updating in a batch
                +
                +b = BatchQuery()
                +em1.description = "new description"
                +em1.batch(b).save()
                +em2.description = "another new description"
                +em2.batch(b).save()
                +b.execute()
                +
                +# deleting in a batch
                +b = BatchQuery()
                +ExampleModel.objects(id=some_id).batch(b).delete()
                +ExampleModel.objects(id=some_id2).batch(b).delete()
                +b.execute()
                +
                +
                +

                Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

                +
                with BatchQuery(execute_on_exception=True) as b:
                +    LogEntry.batch(b).create(k=1, v=1)
                +    mystery_function() # exception thrown in here
                +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
                +
                +
                +

                If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

                +
                +
                +

                Batch Query Execution Callbacks

                +

                In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

                +

                Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

                +

                The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

                +
                def my_callback(*args, **kwargs):
                +    pass
                +
                +batch = BatchQuery()
                +
                +batch.add_callback(my_callback)
                +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
                +
                +# if you need reference to the batch within the callback,
                +# just trap it in the arguments to be passed to the callback:
                +batch.add_callback(my_callback, cqlengine_batch=batch)
                +
                +# once the batch executes...
                +batch.execute()
                +
                +# the effect of the above scheduled callbacks will be similar to
                +my_callback()
                +my_callback('positional arg', named_arg='named arg value')
                +my_callback(cqlengine_batch=batch)
                +
                +
                +

                Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

                +
                +

                Logged vs Unlogged Batches

                +

                By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

                +
                from cassandra.cqlengine.query import BatchType
                +with BatchQuery(batch_type=BatchType.Unlogged) as b:
                +    LogEntry.batch(b).create(k=1, v=1)
                +    LogEntry.batch(b).create(k=1, v=2)
                +
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/connections.html b/3.26.4-scylla/cqlengine/connections.html new file mode 100644 index 0000000000..213b10fe55 --- /dev/null +++ b/3.26.4-scylla/cqlengine/connections.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + + + +
                +

                Connections

                +

                Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

                +
                +

                Register a new connection

                +

                To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

                +
                from cassandra.cqlengine import connection
                +
                +connection.setup(['127.0.0.1')
                +connection.register_connection('cluster2', ['127.0.0.2'])
                +
                +
                +

                register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

                +
                from cassandra.cqlengine import connection
                +from cassandra.cluster import Cluster
                +
                +session = Cluster(['127.0.0.1']).connect()
                +connection.register_connection('cluster3', session=session)
                +
                +
                +
                +
                +

                Change the default connection

                +

                You can change the default cqlengine connection on registration:

                +
                from cassandra.cqlengine import connection
                +
                +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
                +
                +
                +

                or on the fly using set_default_connection()

                +
                connection.set_default_connection('cluster2')
                +
                +
                +
                +
                +

                Unregister a connection

                +

                You can unregister a connection using unregister_connection():

                +
                connection.unregister_connection('cluster2')
                +
                +
                +
                +
                +

                Management

                +

                When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

                +
                from cassandra.cqlengine import management
                +
                +keyspaces = ['ks1', 'ks2']
                +conns = ['cluster1', 'cluster2']
                +
                +# registers your connections
                +# ...
                +
                +# create all keyspaces on all connections
                +for ks in keyspaces:
                +    management.create_simple_keyspace(ks, connections=conns)
                +
                +# define your Automobile model
                +# ...
                +
                +# sync your models
                +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
                +
                +
                +
                +
                +

                Connection Selection

                +

                cqlengine will select the default connection, unless your specify a connection using one of the following methods.

                +
                +

                Default Model Connection

                +

                You can specify a default connection per model:

                +
                class Automobile(Model):
                +    __keyspace__ = 'test'
                +    __connection__ = 'cluster2'
                +    manufacturer = columns.Text(primary_key=True)
                +    year = columns.Integer(primary_key=True)
                +    model = columns.Text(primary_key=True)
                +
                +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
                +
                +
                +
                +
                +

                QuerySet and model instance

                +

                You can use the using() method to select a connection (or keyspace):

                +
                Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
                +q = Automobile.objects.filter(manufacturer='Tesla')
                +autos = q.using(keyspace='ks2', connection='cluster2').all()
                +
                +for auto in autos:
                +    auto.using(connection='cluster1').save()
                +
                +
                +
                +
                +

                Context Manager

                +

                You can use the ContextQuery as well to select a connection:

                +
                with ContextQuery(Automobile, connection='cluster1') as A:
                +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
                +
                +
                +
                +
                +

                BatchQuery

                +

                With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

                +
                with BatchQuery(connection='cluster1') as b:
                +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
                +
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/faq.html b/3.26.4-scylla/cqlengine/faq.html new file mode 100644 index 0000000000..8c8a322cc9 --- /dev/null +++ b/3.26.4-scylla/cqlengine/faq.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Frequently Asked Questions

                +
                +

                Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

                +

                The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

                +
                +
                +

                How to preserve ordering in batch query?

                +

                Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

                +
                  +
                • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

                • +
                • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

                • +
                • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

                • +
                +

                Below is an example to show this scenario.

                +
                class MyMode(Model):
                +    id    = columns.Integer(primary_key=True)
                +    count = columns.Integer()
                +    text  = columns.Text()
                +
                +with BatchQuery() as b:
                +   MyModel.batch(b).create(id=1, count=2, text='123')
                +   MyModel.batch(b).create(id=1, count=3, text='111')
                +
                +assert MyModel.objects(id=1).first().count == 3
                +assert MyModel.objects(id=1).first().text  == '123'
                +
                +
                +

                The largest value of count is 3, and the largest value of text would be ‘123’.

                +

                The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

                +
                with BatchQuery() as b:
                +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
                +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
                +
                +assert MyModel.objects(id=1).first().count == 3
                +assert MyModel.objects(id=1).first().text  == '111'
                +
                +
                +
                +
                +

                How can I delete individual values from a row?

                +

                When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

                +
                class MyModel(Model):
                +    id    = columns.Integer(primary_key=True)
                +    text  = columns.Text()
                +
                +m = MyModel.create(id=1, text='We can delete this with None')
                +assert MyModel.objects(id=1).first().text is not None
                +
                +m.update(text=None)
                +assert MyModel.objects(id=1).first().text is None
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/models.html b/3.26.4-scylla/cqlengine/models.html new file mode 100644 index 0000000000..730f3c7892 --- /dev/null +++ b/3.26.4-scylla/cqlengine/models.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + + + +
                +

                Models

                +

                A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

                +

                Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

                +

                Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

                +
                +

                Example Definitions

                +

                This example defines a Person table, with the columns first_name and last_name

                +
                from cassandra.cqlengine import columns
                +from cassandra.cqlengine.models import Model
                +
                + class Person(Model):
                +     id = columns.UUID(primary_key=True)
                +     first_name  = columns.Text()
                +     last_name = columns.Text()
                +
                +
                +

                The Person model would create this CQL table:

                +
                CREATE TABLE cqlengine.person (
                +    id uuid,
                +    first_name text,
                +    last_name text,
                +    PRIMARY KEY (id)
                +);
                +
                +
                +

                Here’s an example of a comment table created with clustering keys, in descending order:

                +
                from cassandra.cqlengine import columns
                +from cassandra.cqlengine.models import Model
                +
                +class Comment(Model):
                +    photo_id = columns.UUID(primary_key=True)
                +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
                +    comment = columns.Text()
                +
                +
                +

                The Comment model’s create table would look like the following:

                +
                CREATE TABLE comment (
                +  photo_id uuid,
                +  comment_id timeuuid,
                +  comment text,
                +  PRIMARY KEY (photo_id, comment_id)
                +) WITH CLUSTERING ORDER BY (comment_id DESC);
                +
                +
                +

                To sync the models to the database, you may do the following*:

                +
                from cassandra.cqlengine.management import sync_table
                +sync_table(Person)
                +sync_table(Comment)
                +
                +
                +

                *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

                +

                For examples on manipulating data and creating queries, see Making Queries

                +
                +
                +

                Manipulating model instances as dictionaries

                +

                Model instances can be accessed like dictionaries.

                +
                class Person(Model):
                +    first_name  = columns.Text()
                +    last_name = columns.Text()
                +
                +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
                +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
                +kevin['first_name']  # returns 'Kevin'
                +kevin.keys()  # returns ['first_name', 'last_name']
                +kevin.values()  # returns ['Kevin', 'Deldycke']
                +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
                +
                +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
                +
                +
                +
                +
                +

                Extending Model Validation

                +

                Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

                +

                However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

                +
                class Member(Model):
                +    person_id = UUID(primary_key=True)
                +    name = Text(required=True)
                +
                +    def validate(self):
                +        super(Member, self).validate()
                +        if self.name == 'jon':
                +            raise ValidationError('no jon\'s allowed')
                +
                +
                +

                Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

                +
                +
                +

                Model Inheritance

                +

                It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

                +

                For instance, suppose you want a table that stores rows of pets owned by an owner:

                +
                class Pet(Model):
                +    __table_name__ = 'pet'
                +    owner_id = UUID(primary_key=True)
                +    pet_id = UUID(primary_key=True)
                +    pet_type = Text(discriminator_column=True)
                +    name = Text()
                +
                +    def eat(self, food):
                +        pass
                +
                +    def sleep(self, time):
                +        pass
                +
                +class Cat(Pet):
                +    __discriminator_value__ = 'cat'
                +    cuteness = Float()
                +
                +    def tear_up_couch(self):
                +        pass
                +
                +class Dog(Pet):
                +    __discriminator_value__ = 'dog'
                +    fierceness = Float()
                +
                +    def bark_all_night(self):
                +        pass
                +
                +
                +

                After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

                +

                To setup a model structure with inheritance, follow these steps

                +
                  +
                1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

                2. +
                3. Create subclass models, and define a unique __discriminator_value__ value on each

                4. +
                5. Run sync_table on each of the sub tables

                6. +
                +

                About the discriminator value

                +

                The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

                +
                +
                +

                User Defined Types

                +

                cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

                +
                from cassandra.cqlengine.columns import *
                +from cassandra.cqlengine.models import Model
                +from cassandra.cqlengine.usertype import UserType
                +
                +class address(UserType):
                +    street = Text()
                +    zipcode = Integer()
                +
                +class users(Model):
                +    __keyspace__ = 'account'
                +    name = Text(primary_key=True)
                +    addr = UserDefinedType(address)
                +
                +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
                +user = users.objects(name="Joe")[0]
                +print user.name, user.addr
                +# Joe address(street=u'Easy St.', zipcode=99999)
                +
                +
                +

                UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

                +

                sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

                +

                Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

                +

                *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/queryset.html b/3.26.4-scylla/cqlengine/queryset.html new file mode 100644 index 0000000000..fa7be38eef --- /dev/null +++ b/3.26.4-scylla/cqlengine/queryset.html @@ -0,0 +1,987 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Making Queries

                +
                +

                Retrieving objects

                +

                Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

                +
                +

                Retrieving all objects

                +

                The simplest query you can make is to return all objects from a table.

                +

                This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

                +

                Using the Person example model, we would get all Person objects like this:

                +
                all_objects = Person.objects.all()
                +
                +
                +
                +
                +

                Retrieving objects with filters

                +

                Typically, you’ll want to query only a subset of the records in your database.

                +

                That can be accomplished with the QuerySet’s .filter(\*\*) method.

                +

                For example, given the model definition:

                +
                class Automobile(Model):
                +    manufacturer = columns.Text(primary_key=True)
                +    year = columns.Integer(primary_key=True)
                +    model = columns.Text()
                +    price = columns.Decimal()
                +    options = columns.Set(columns.Text)
                +
                +
                +

                …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +
                +
                +

                You can also use the more convenient syntax:

                +
                q = Automobile.objects(Automobile.manufacturer == 'Tesla')
                +
                +
                +

                We can then further filter our query with another call to .filter

                +
                q = q.filter(year=2012)
                +
                +
                +

                Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

                +
                +
                +
                +

                Accessing objects in a QuerySet

                +

                There are several methods for getting objects out of a queryset

                +
                  +
                • +
                  iterating over the queryset
                  for car in Automobile.objects.all():
                  +    #...do something to the car instance
                  +    pass
                  +
                  +
                  +
                  +
                  +
                • +
                • +
                  list index
                  q = Automobile.objects.all()
                  +q[0] #returns the first result
                  +q[1] #returns the second result
                  +
                  +
                  +
                  +

                  Note

                  +
                    +
                  • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

                  • +
                  • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                  • +
                  +
                  +
                  +
                  +
                • +
                • +
                  list slicing
                  q = Automobile.objects.all()
                  +q[1:] #returns all results except the first
                  +q[1:9] #returns a slice of the results
                  +
                  +
                  +
                  +

                  Note

                  +
                    +
                  • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

                  • +
                  • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                  • +
                  +
                  +
                  +
                  +
                • +
                • +
                  calling get() on the queryset
                  q = Automobile.objects.filter(manufacturer='Tesla')
                  +q = q.filter(year=2012)
                  +car = q.get()
                  +
                  +
                  +

                  this returns the object matching the queryset

                  +
                  +
                  +
                • +
                • +
                  calling first() on the queryset
                  q = Automobile.objects.filter(manufacturer='Tesla')
                  +q = q.filter(year=2012)
                  +car = q.first()
                  +
                  +
                  +

                  this returns the first value in the queryset

                  +
                  +
                  +
                • +
                +
                +
                +

                Filtering Operators

                +

                Equal To

                +

                The default filtering operator.

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year=2012)  #year == 2012
                +
                +
                +

                In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

                +

                in (__in)

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year__in=[2011, 2012])
                +
                +
                +

                > (__gt)

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year__gt=2010)  # year > 2010
                +
                +# or the nicer syntax
                +
                +q.filter(Automobile.year > 2010)
                +
                +
                +

                >= (__gte)

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year__gte=2010)  # year >= 2010
                +
                +# or the nicer syntax
                +
                +q.filter(Automobile.year >= 2010)
                +
                +
                +

                < (__lt)

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year__lt=2012)  # year < 2012
                +
                +# or...
                +
                +q.filter(Automobile.year < 2012)
                +
                +
                +

                <= (__lte)

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q = q.filter(year__lte=2012)  # year <= 2012
                +
                +q.filter(Automobile.year <= 2012)
                +
                +
                +

                CONTAINS (__contains)

                +

                The CONTAINS operator is available for all collection types (List, Set, Map).

                +
                q = Automobile.objects.filter(manufacturer='Tesla')
                +q.filter(options__contains='backup camera').allow_filtering()
                +
                +
                +

                Note that we need to use allow_filtering() since the options column has no secondary index.

                +

                LIKE (__like)

                +

                The LIKE operator is available for text columns that have a SASI secondary index.

                +
                q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
                +
                +
                +

                IS NOT NULL (IsNotNull(column_name))

                +

                The IS NOT NULL operator is not yet supported for C*.

                +
                q = Automobile.objects.filter(IsNotNull('model'))
                +
                +
                +

                Limitations:

                +
                  +
                • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

                • +
                • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

                • +
                +
                +
                +

                TimeUUID Functions

                +

                In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

                +
                +
                +class cqlengine.queryset.MinTimeUUID(datetime)
                +

                returns the minimum time uuid value possible for the given datetime

                +
                + +
                +
                +class cqlengine.queryset.MaxTimeUUID(datetime)
                +

                returns the maximum time uuid value possible for the given datetime

                +
                + +

                Example

                +
                class DataStream(Model):
                +    id      = columns.UUID(partition_key=True)
                +    time    = columns.TimeUUID(primary_key=True)
                +    data    = columns.Bytes()
                +
                +min_time = datetime(1982, 1, 1)
                +max_time = datetime(1982, 3, 9)
                +
                +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
                +
                +
                +
                +
                +

                Token Function

                +

                Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

                +

                See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

                +

                Example

                +
                class Items(Model):
                +    id      = columns.Text(primary_key=True)
                +    data    = columns.Bytes()
                +
                +query = Items.objects.all().limit(10)
                +
                +first_page = list(query);
                +last = first_page[-1]
                +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
                +
                +
                +
                +
                +

                QuerySets are immutable

                +

                When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

                +

                Example

                +
                #this produces 3 different querysets
                +#q does not change after it's initial definition
                +q = Automobiles.objects.filter(year=2012)
                +tesla2012 = q.filter(manufacturer='Tesla')
                +honda2012 = q.filter(manufacturer='Honda')
                +
                +
                +
                +
                +

                Ordering QuerySets

                +

                Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

                +

                However, you can set a column to order on with the .order_by(column_name) method.

                +

                Example

                +
                #sort ascending
                +q = Automobiles.objects.all().order_by('year')
                +#sort descending
                +q = Automobiles.objects.all().order_by('-year')
                +
                +
                +

                Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

                +

                For instance, given our Automobile model, year is the only column we can order on.

                +
                +
                +

                Values Lists

                +

                There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

                +
                items = list(range(20))
                +random.shuffle(items)
                +for i in items:
                +    TestModel.create(id=1, clustering_key=i)
                +
                +values = list(TestModel.objects.values_list('clustering_key', flat=True))
                +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
                +
                +
                +
                +
                +

                Per Query Timeouts

                +

                By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

                +
                class Row(Model):
                +    id = columns.Integer(primary_key=True)
                +    name = columns.Text()
                +
                +
                +

                Fetch all objects with a timeout of 5 seconds

                +
                Row.objects().timeout(5).all()
                +
                +
                +

                Create a single row with a 50ms timeout

                +
                Row(id=1, name='Jon').timeout(0.05).create()
                +
                +
                +

                Delete a single row with no timeout

                +
                Row(id=1).timeout(None).delete()
                +
                +
                +

                Update a single row with no timeout

                +
                Row(id=1).timeout(None).update(name='Blake')
                +
                +
                +

                Batch query timeouts

                +
                with BatchQuery(timeout=10) as b:
                +    Row(id=1, name='Jon').create()
                +
                +
                +

                NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

                +
                +
                +

                Default TTL and Per Query TTL

                +

                Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

                +

                Example:

                +
                class User(Model):
                +    __options__ = {'default_time_to_live': 20}
                +
                +    user_id = columns.UUID(primary_key=True)
                +    ...
                +
                +
                +

                You can set TTL per-query if needed. Here are a some examples:

                +

                Example:

                +
                class User(Model):
                +    __options__ = {'default_time_to_live': 20}
                +
                +    user_id = columns.UUID(primary_key=True)
                +    ...
                +
                +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
                +
                +user.ttl(30).update(age=21)            # Update the TTL to 30
                +User.objects.ttl(10).create(user_id=1)  # TTL 10
                +User(user_id=1, age=21).ttl(10).save()  # TTL 10
                +
                +
                +
                +
                +

                Named Tables

                +

                Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

                +
                from cassandra.cqlengine.connection import setup
                +setup("127.0.0.1", "cqlengine_test")
                +
                +from cassandra.cqlengine.named import NamedTable
                +user = NamedTable("cqlengine_test", "user")
                +user.objects()
                +user.objects()[0]
                +
                +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/third-party.html b/3.26.4-scylla/cqlengine/third-party.html new file mode 100644 index 0000000000..7c5d5a6817 --- /dev/null +++ b/3.26.4-scylla/cqlengine/third-party.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Third party integrations

                +
                +

                Celery

                +

                Here’s how, in substance, CQLengine can be plugged to Celery:

                +
                from celery import Celery
                +from celery.signals import worker_process_init, beat_init
                +from cassandra.cqlengine import connection
                +from cassandra.cqlengine.connection import (
                +    cluster as cql_cluster, session as cql_session)
                +
                +def cassandra_init(**kwargs):
                +    """ Initialize a clean Cassandra connection. """
                +    if cql_cluster is not None:
                +        cql_cluster.shutdown()
                +    if cql_session is not None:
                +        cql_session.shutdown()
                +    connection.setup()
                +
                +# Initialize worker context for both standard and periodic tasks.
                +worker_process_init.connect(cassandra_init)
                +beat_init.connect(cassandra_init)
                +
                +app = Celery()
                +
                +
                +
                +
                +

                uWSGI

                +

                This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

                +
                from cassandra.cqlengine import connection
                +from cassandra.cqlengine.connection import (
                +    cluster as cql_cluster, session as cql_session)
                +
                +try:
                +    from uwsgidecorators import postfork
                +except ImportError:
                +    # We're not in a uWSGI context, no need to hook Cassandra session
                +    # initialization to the postfork event.
                +    pass
                +else:
                +    @postfork
                +    def cassandra_init(**kwargs):
                +        """ Initialize a new Cassandra session in the context.
                +
                +        Ensures that a new session is returned for every new request.
                +        """
                +        if cql_cluster is not None:
                +            cql_cluster.shutdown()
                +        if cql_session is not None:
                +            cql_session.shutdown()
                +        connection.setup()
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/cqlengine/upgrade-guide.html b/3.26.4-scylla/cqlengine/upgrade-guide.html new file mode 100644 index 0000000000..10d5eea785 --- /dev/null +++ b/3.26.4-scylla/cqlengine/upgrade-guide.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + + + +
                +

                Upgrade Guide

                +

                This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

                +

                THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

                +
                +

                Functional Changes

                +
                +

                List Prepend Reversing

                +

                Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

                +
                +
                +

                Date Column Type

                +

                The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

                +
                +
                +
                +

                Remove cqlengine

                +

                To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

                +

                The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

                +
                +
                +

                Organization

                +
                +

                Imports

                +

                cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

                +
                from cassandra.cqlengine import columns
                +
                +
                +

                is now:

                +
                from cassandra.cqlengine import columns
                +
                +
                +
                +
                +

                Package-Level Aliases

                +

                Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

                +

                Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

                +

                These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

                +
                +
                +

                Exceptions

                +

                The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

                + + + + + + + + + + + + + + + + + + + + + + + + + + +

                Exception class

                New module

                CQLEngineException

                cassandra.cqlengine

                ModelException

                cassandra.cqlengine.models

                ValidationError

                cassandra.cqlengine

                UndefinedKeyspaceException

                cassandra.cqlengine.connection

                LWTException

                cassandra.cqlengine.query

                IfNotExistsWithCounterColumn

                cassandra.cqlengine.query

                +
                +
                +

                UnicodeMixin Consolidation

                +

                class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

                +
                +
                +
                +

                API Deprecations

                +

                This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

                +
                +

                Float/Double Overload

                +

                Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

                +
                +
                +

                Schema Management

                +

                cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

                + +

                cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

                +
                +
                +

                Model Inheritance

                +

                The names for class attributes controlling model inheritance are changing. Changes are as follows:

                + +

                The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

                +

                The example below shows a simple translation:

                +

                Before:

                +
                class Pet(Model):
                +    __table_name__ = 'pet'
                +    owner_id = UUID(primary_key=True)
                +    pet_id = UUID(primary_key=True)
                +    pet_type = Text(polymorphic_key=True)
                +    name = Text()
                +
                +class Cat(Pet):
                +    __polymorphic_key__ = 'cat'
                +
                +class Dog(Pet):
                +    __polymorphic_key__ = 'dog'
                +
                +
                +

                After:

                +
                class Pet(models.Model):
                +    __table_name__ = 'pet'
                +    owner_id = UUID(primary_key=True)
                +    pet_id = UUID(primary_key=True)
                +    pet_type = Text(discriminator_column=True)
                +    name = Text()
                +
                +class Cat(Pet):
                +    __discriminator_value__ = 'cat'
                +
                +class Dog(Pet):
                +    __discriminator_value__ = 'dog'
                +
                +
                +
                +
                +

                TimeUUID.from_datetime

                +

                This function is deprecated in favor of the core utility function uuid_from_time().

                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/dates-and-times.html b/3.26.4-scylla/dates-and-times.html new file mode 100644 index 0000000000..30461651bc --- /dev/null +++ b/3.26.4-scylla/dates-and-times.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Working with Dates and Times

                +

                This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

                +
                +

                timestamps (Cassandra DateType)

                +

                Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

                +
                +

                Write Path

                +

                When inserting timestamps, the driver handles serialization for the write path as follows:

                +

                If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

                +
                  +
                • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

                • +
                • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

                • +
                +

                Note the second point above applies even to “local” times created using now():

                +
                >>> d = datetime.now()
                +
                +>>> print(d.tzinfo)
                +None
                +
                +
                +

                These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

                +

                If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

                +
                +
                +

                Read Path

                +

                The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

                +

                The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

                +
                import pytz
                +user_tz = pytz.timezone('US/Central')
                +timestamp_naive = row.ts
                +timestamp_utc = pytz.utc.localize(timestamp_naive)
                +timestamp_presented = timestamp_utc.astimezone(user_tz)
                +
                +
                +

                This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

                +
                +
                +
                +

                date, time (Cassandra DateType)

                +

                Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

                +
                +

                Write Path

                +

                For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

                +

                For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

                +
                +
                +

                Read Path

                +

                The driver always returns custom types for date and time.

                +

                The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

                +

                The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/execution-profiles.html b/3.26.4-scylla/execution-profiles.html new file mode 100644 index 0000000000..3025c4dc8c --- /dev/null +++ b/3.26.4-scylla/execution-profiles.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Execution Profiles

                +

                Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

                +

                The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

                +

                An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

                +

                This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

                +
                +

                Mapping Legacy Parameters to Profiles

                +

                Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

                + +

                When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

                +
                +
                +

                Using Execution Profiles

                +
                +

                Default

                +
                from cassandra.cluster import Cluster
                +cluster = Cluster()
                +session = cluster.connect()
                +local_query = 'SELECT rpc_address FROM system.local'
                +for _ in cluster.metadata.all_hosts():
                +    print session.execute(local_query)[0]
                +
                +
                +
                Row(rpc_address='127.0.0.2')
                +Row(rpc_address='127.0.0.1')
                +
                +
                +

                The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

                +
                +
                +

                Initializing cluster with profiles

                +
                from cassandra.cluster import ExecutionProfile
                +from cassandra.policies import WhiteListRoundRobinPolicy
                +
                +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
                +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
                +
                +profiles = {'node1': node1_profile, 'node2': node2_profile}
                +session = Cluster(execution_profiles=profiles).connect()
                +for _ in cluster.metadata.all_hosts():
                +    print session.execute(local_query, execution_profile='node1')[0]
                +
                +
                +
                Row(rpc_address='127.0.0.1')
                +Row(rpc_address='127.0.0.1')
                +
                +
                +
                for _ in cluster.metadata.all_hosts():
                +    print session.execute(local_query, execution_profile='node2')[0]
                +
                +
                +
                Row(rpc_address='127.0.0.2')
                +Row(rpc_address='127.0.0.2')
                +
                +
                +
                for _ in cluster.metadata.all_hosts():
                +    print session.execute(local_query)[0]
                +
                +
                +
                Row(rpc_address='127.0.0.2')
                +Row(rpc_address='127.0.0.1')
                +
                +
                +

                Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

                +
                from cassandra.cluster import EXEC_PROFILE_DEFAULT
                +profile = ExecutionProfile(request_timeout=30)
                +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
                +
                +
                +
                +
                +

                Adding named profiles

                +

                New profiles can be added constructing from scratch, or deriving from default:

                +
                locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
                +node1_profile = 'node1_whitelist'
                +cluster.add_execution_profile(node1_profile, locked_execution)
                +
                +for _ in cluster.metadata.all_hosts():
                +    print session.execute(local_query, execution_profile=node1_profile)[0]
                +
                +
                +
                Row(rpc_address='127.0.0.1')
                +Row(rpc_address='127.0.0.1')
                +
                +
                +

                See Cluster.add_execution_profile() for details and optional parameters.

                +
                +
                +

                Passing a profile instance without mapping

                +

                We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

                +
                from cassandra.query import tuple_factory
                +
                +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
                +
                +print session.execute(local_query, execution_profile=tmp)[0]
                +print session.execute(local_query, execution_profile='node1')[0]
                +
                +
                +
                ('127.0.0.1',)
                +Row(rpc_address='127.0.0.1')
                +
                +
                +

                The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/faq.html b/3.26.4-scylla/faq.html new file mode 100644 index 0000000000..bfc182b4b9 --- /dev/null +++ b/3.26.4-scylla/faq.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Frequently Asked Questions

                +

                See also cqlengine FAQ

                +
                +

                Why do connections or IO operations timeout in my WSGI application?

                +

                Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

                +

                To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

                +
                from flask import Flask
                +from uwsgidecorators import postfork
                +from cassandra.cluster import Cluster
                +
                +session = None
                +prepared = None
                +
                +@postfork
                +def connect():
                +    global session, prepared
                +    session = Cluster().connect()
                +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
                +
                +app = Flask(__name__)
                +
                +@app.route('/')
                +def server_version():
                +    row = session.execute(prepared, ('local',))[0]
                +    return row.release_version
                +
                +
                +

                uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

                +
                +
                +

                How do I trace a request?

                +

                Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

                +
                >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
                +>>> result = future.result()
                +>>> trace = future.get_query_trace()
                +>>> for e in trace.events:
                +>>>     print e.source_elapsed, e.description
                +
                +0:00:00.000077 Parsing select * from system.local
                +0:00:00.000153 Preparing statement
                +0:00:00.000309 Computing ranges to query
                +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
                +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
                +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
                +0:00:00.000669 Read 1 live and 0 tombstone cells
                +0:00:00.000755 Scanned 1 rows and matched 1
                +
                +
                +

                trace is a QueryTrace object.

                +
                +
                +

                How do I determine the replicas for a query?

                +

                With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

                +
                >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
                +>>> bound = prepared.bind((1,))
                +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
                +>>> for h in replicas:
                +>>>   print h.address
                +127.0.0.1
                +127.0.0.2
                +
                +
                +

                replicas is a list of Host objects.

                +
                +
                +

                How does the driver manage request retries?

                +

                By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

                +

                Retries are presently attempted on the same coordinator, but this may change in the future.

                +

                Please see policies.RetryPolicy for further details.

                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/getting-started.html b/3.26.4-scylla/getting-started.html new file mode 100644 index 0000000000..3ab8981132 --- /dev/null +++ b/3.26.4-scylla/getting-started.html @@ -0,0 +1,1098 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Getting Started

                +

                First, make sure you have the driver properly installed.

                +
                +

                Connecting to a Cluster

                +

                Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

                +

                First, make sure you have the Cassandra driver properly installed.

                +
                +

                Connecting to Cassandra

                +

                The simplest way to create a Cluster is like this:

                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster()
                +
                +
                +

                This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
                +
                +
                +

                The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

                +

                If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

                +
                from cassandra.cluster import Cluster
                +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
                +
                +
                +

                Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

                +
                cluster = Cluster()
                +session = cluster.connect()
                +
                +
                +
                +
                +
                +

                Session Keyspace

                +

                The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

                +
                cluster = Cluster()
                +session = cluster.connect('mykeyspace')
                +
                +
                +

                You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

                +
                session.set_keyspace('users')
                +# or you can do this instead
                +session.execute('USE users')
                +
                +
                +
                +
                +

                Execution Profiles

                +

                Profiles are passed in by execution_profiles dict.

                +

                In this case we can construct the base ExecutionProfile passing all attributes:

                +
                from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
                +from cassandra.query import tuple_factory
                +
                +profile = ExecutionProfile(
                +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
                +    retry_policy=DowngradingConsistencyRetryPolicy(),
                +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
                +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
                +    request_timeout=15,
                +    row_factory=tuple_factory
                +)
                +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
                +session = cluster.connect()
                +
                +print(session.execute("SELECT release_version FROM system.local").one())
                +
                +
                +

                Users are free to setup additional profiles to be used by name:

                +
                profile_long = ExecutionProfile(request_timeout=30)
                +cluster = Cluster(execution_profiles={'long': profile_long})
                +session = cluster.connect()
                +session.execute(statement, execution_profile='long')
                +
                +
                +

                Also, parameters passed to Session.execute or attached to Statements are still honored as before.

                +
                +
                +

                Executing Queries

                +

                Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

                +
                rows = session.execute('SELECT name, age, email FROM users')
                +for user_row in rows:
                +    print user_row.name, user_row.age, user_row.email
                +
                +
                +

                This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

                +

                By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

                +
                rows = session.execute('SELECT name, age, email FROM users')
                +for row in rows:
                +    print row.name, row.age, row.email
                +
                +
                +
                rows = session.execute('SELECT name, age, email FROM users')
                +for (name, age, email) in rows:
                +    print name, age, email
                +
                +
                +
                rows = session.execute('SELECT name, age, email FROM users')
                +for row in rows:
                +    print row[0], row[1], row[2]
                +
                +
                +

                If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

                +

                As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

                +
                +
                +

                Prepared Statements

                +

                Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

                +

                To prepare a query, use Session.prepare():

                +
                user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
                +
                +users = []
                +for user_id in user_ids_to_query:
                +    user = session.execute(user_lookup_stmt, [user_id])
                +    users.append(user)
                +
                +
                +

                prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

                +

                Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

                +
                +
                +

                Passing Parameters to CQL Queries

                +

                Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

                +

                Positional parameters are used with a %s placeholder. For example, +when you execute:

                +
                session.execute(
                +    """
                +    INSERT INTO users (name, credits, user_id)
                +    VALUES (%s, %s, %s)
                +    """,
                +    ("John O'Reilly", 42, uuid.uuid1())
                +)
                +
                +
                +

                It is translated to the following CQL query:

                +
                INSERT INTO users (name, credits, user_id)
                +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
                +
                +
                +

                Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

                +
                session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
                +
                +
                +

                Instead, use %s for the age placeholder.

                +

                If you need to use a literal % character, use %%.

                +

                Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

                +
                session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
                +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
                +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
                +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
                +
                +
                +

                Note that the second line is incorrect because in Python, single-element tuples +require a comma.

                +

                Named place-holders use the %(name)s form:

                +
                session.execute(
                +    """
                +    INSERT INTO users (name, credits, user_id, username)
                +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
                +    """,
                +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
                +)
                +
                +
                +

                Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

                +

                Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

                +
                +
                +

                Type Conversions

                +

                For non-prepared statements, Python types are cast to CQL literals in the +following way:

                + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                Python Type

                CQL Literal Type

                None

                NULL

                bool

                boolean

                float

                +
                float
                +
                double
                +
                +
                +
                int
                +
                long
                +
                +
                +
                int
                +
                bigint
                +
                varint
                +
                smallint
                +
                tinyint
                +
                counter
                +
                +

                decimal.Decimal

                decimal

                +
                str
                +
                unicode
                +
                +
                +
                ascii
                +
                varchar
                +
                text
                +
                +
                +
                buffer
                +
                bytearray
                +
                +

                blob

                date

                date

                datetime

                timestamp

                time

                time

                +
                list
                +
                tuple
                +
                generator
                +
                +

                list

                +
                set
                +
                frozenset
                +
                +

                set

                +
                dict
                +
                OrderedDict
                +
                +

                map

                uuid.UUID

                +
                timeuuid
                +
                uuid
                +
                +
                +
                +
                +

                Asynchronous Queries

                +

                The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

                +

                The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

                +
                from cassandra import ReadTimeout
                +
                +query = "SELECT * FROM users WHERE user_id=%s"
                +future = session.execute_async(query, [user_id])
                +
                +# ... do some other work
                +
                +try:
                +    rows = future.result()
                +    user = rows[0]
                +    print user.name, user.age
                +except ReadTimeout:
                +    log.exception("Query timed out:")
                +
                +
                +

                This works well for executing many queries concurrently:

                +
                # build a list of futures
                +futures = []
                +query = "SELECT * FROM users WHERE user_id=%s"
                +for user_id in ids_to_fetch:
                +    futures.append(session.execute_async(query, [user_id])
                +
                +# wait for them to complete and use the results
                +for future in futures:
                +    rows = future.result()
                +    print rows[0].name
                +
                +
                +

                Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

                +
                def handle_success(rows):
                +    user = rows[0]
                +    try:
                +        process_user(user.name, user.age, user.id)
                +    except Exception:
                +        log.error("Failed to process user %s", user.id)
                +        # don't re-raise errors in the callback
                +
                +def handle_error(exception):
                +    log.error("Failed to fetch user info: %s", exception)
                +
                +
                +future = session.execute_async(query)
                +future.add_callbacks(handle_success, handle_error)
                +
                +
                +
                +
                There are a few important things to remember when working with callbacks:
                  +
                • Exceptions that are raised inside the callback functions will be logged and then ignored.

                • +
                • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

                • +
                +
                +
                +
                +
                +

                Setting a Consistency Level

                +

                The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

                +

                By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

                +
                from cassandra import ConsistencyLevel
                +from cassandra.query import SimpleStatement
                +
                +query = SimpleStatement(
                +    "INSERT INTO users (name, age) VALUES (%s, %s)",
                +    consistency_level=ConsistencyLevel.QUORUM)
                +session.execute(query, ('John', 42))
                +
                +
                +
                +
                +

                Setting a Consistency Level with Prepared Statements

                +

                To specify a consistency level for prepared statements, you have two options.

                +

                The first is to set a default consistency level for every execution of the +prepared statement:

                +
                from cassandra import ConsistencyLevel
                +
                +cluster = Cluster()
                +session = cluster.connect("mykeyspace")
                +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
                +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
                +
                +# these will both use QUORUM
                +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
                +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
                +
                +
                +

                The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

                +
                # override the QUORUM default
                +user3_lookup = user_lookup_stmt.bind([user_id3])
                +user3_lookup.consistency_level = ConsistencyLevel.ALL
                +user3 = session.execute(user3_lookup)
                +
                +
                +
                +
                +

                Speculative Execution

                +

                Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

                +

                To enable speculative execution:

                +
                  +
                • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

                • +
                • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

                • +
                +

                Example:

                +
                from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                +from cassandra.policies import ConstantSpeculativeExecutionPolicy
                +from cassandra.query import SimpleStatement
                +
                +# Configure the speculative execution policy
                +ep = ExecutionProfile(
                +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
                +)
                +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
                +session = cluster.connect()
                +
                +# Mark the query idempotent
                +query = SimpleStatement(
                +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
                +    is_idempotent=True
                +)
                +
                +# Execute. A new query will be sent to the server every 0.5 second
                +# until we receive a response, for a max number attempts of 10.
                +session.execute(query)
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/index.html b/3.26.4-scylla/index.html new file mode 100644 index 0000000000..13e0ba46ea --- /dev/null +++ b/3.26.4-scylla/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Python Driver for Scylla and Apache Cassandra®

                +

                A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

                +

                The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8.

                +

                This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

                +

                Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

                +
                +

                Contents

                +
                +
                Installation

                How to install the driver.

                +
                +
                Getting Started

                A guide through the first steps of connecting to Scylla and executing queries

                +
                +
                Scylla Specific Features

                A list of feature available only on scylla-driver

                +
                +
                Execution Profiles

                An introduction to a more flexible way of configuring request execution

                +
                +
                Lightweight Transactions (Compare-and-set)

                Working with results of conditional requests

                +
                +
                Object Mapper

                Introduction to the integrated object mapper, cqlengine

                +
                +
                Performance Notes

                Tips for getting good performance.

                +
                +
                Paging Large Queries

                Notes on paging large query results

                +
                +
                Security

                An overview of the security features of the driver

                +
                +
                Upgrading

                A guide to upgrading versions of the driver

                +
                +
                User Defined Types

                Working with Scylla’s user-defined types (UDT)

                +
                +
                Working with Dates and Times

                Some discussion on the driver’s approach to working with timestamp, date, time types

                +
                +
                ScyllaDB Cloud

                Connect to ScyllaDB Cloud

                +
                +
                ScyllaDB Cloud Serverless

                Connect to ScyllaDB Cloud Serverless

                +
                +
                CHANGELOG

                Log of changes to the driver, organized by version.

                +
                +
                Frequently Asked Questions

                A collection of Frequently Asked Questions

                +
                +
                API Documentation

                The API documentation.

                +
                +
                +
                +
                +
                +
                +

                Getting Help

                +

                Visit the FAQ section in this documentation.

                +

                Please send questions to the Scylla user list.

                +
                +
                +

                Reporting Issues

                +

                Please report any bugs and make any feature requests on the Github project issues

                +
                + +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/installation.html b/3.26.4-scylla/installation.html new file mode 100644 index 0000000000..29aa8c915f --- /dev/null +++ b/3.26.4-scylla/installation.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Installation

                +
                +

                Supported Platforms

                +

                Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

                +

                Linux, OSX, and Windows are supported.

                +
                +
                +

                Installation through pip

                +

                pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

                +
                pip install scylla-driver
                +
                +
                +

                You can use pip install --pre scylla-driver if you need to install a beta version.

                +

                *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

                +
                +
                +

                Verifying your Installation

                +

                To check if the installation was successful, you can run:

                +
                python -c 'import cassandra; print cassandra.__version__'
                +
                +
                +

                It should print something like “3.22.0”.

                +
                +
                +

                (Optional) Graph

                +

                The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

                +
                pip install scylla-driver[graph]
                +
                +
                +
                +
                +

                (Optional) Compression Support

                +

                Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

                +

                For lz4 support:

                +
                pip install lz4
                +
                +
                +

                For snappy support:

                +
                pip install python-snappy
                +
                +
                +

                (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

                +
                +
                +

                (Optional) Metrics Support

                +

                The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

                +
                pip install scales
                +
                +
                +
                +

                Speeding Up Installation

                +

                By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

                +

                In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

                +
                $ # installing from source
                +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
                +$ # installing from pip
                +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
                +
                +
                +
                +
                +

                OSX Installation Error

                +

                If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

                +
                clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
                +
                +
                +

                To fix this, re-run the installation with an extra compilation flag:

                +
                ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
                +
                +
                +
                +
                +
                +

                Windows Installation Notes

                +

                Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

                +

                Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

                +

                It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

                +
                +
                +

                Manual Installation

                +

                You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

                +

                Once the dependencies are installed, simply run:

                +
                python setup.py install
                +
                +
                +
                +
                +

                (Optional) Non-python Dependencies

                +

                The driver has several optional features that have non-Python dependencies.

                +
                +

                C Extensions

                +

                By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

                +

                When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

                +

                To compile the extensions, ensure that GCC and the Python headers are available.

                +

                On Ubuntu and Debian, this can be accomplished by running:

                +
                $ sudo apt-get install gcc python-dev
                +
                +
                +

                On RedHat and RedHat-based systems like CentOS and Fedora:

                +
                $ sudo yum install gcc python-devel
                +
                +
                +

                On OS X, homebrew installations of Python should provide the necessary headers.

                +

                See Windows Installation Notes for notes on configuring the build environment on Windows.

                +
                +

                Cython-based Extensions

                +

                By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

                +

                This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

                +
                python setup.py install --no-cython
                +
                +
                +

                Alternatively, an environment variable can be used to switch this option regardless of +context:

                +
                CASS_DRIVER_NO_CYTHON=1 <your script here>
                +- or, to disable all extensions:
                +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
                +
                +
                +

                This method is required when using pip, which provides no other way of injecting user options in a single command:

                +
                CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
                +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
                +
                +
                +

                The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

                +

                If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

                +
                sudo pip install six futures
                +sudo pip install --install-option="--no-cython"
                +
                +
                +
                +
                +
                +

                libev support

                +

                The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

                +

                If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

                +
                $ sudo apt-get install libev4 libev-dev
                +
                +
                +

                On RHEL/CentOS/Fedora:

                +
                $ sudo yum install libev libev-devel
                +
                +
                +

                If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

                +
                $ brew install libev
                +
                +
                +

                The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

                +

                If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

                +
                >>> from cassandra.io.libevreactor import LibevConnection
                +>>> from cassandra.cluster import Cluster
                +
                +>>> cluster = Cluster()
                +>>> cluster.connection_class = LibevConnection
                +>>> session = cluster.connect()
                +
                +
                +
                +
                +
                +

                (Optional) Configuring SSL

                +

                Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/lwt.html b/3.26.4-scylla/lwt.html new file mode 100644 index 0000000000..2f651bcbeb --- /dev/null +++ b/3.26.4-scylla/lwt.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Lightweight Transactions (Compare-and-set)

                +

                Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

                +

                For pertinent execution parameters, see Statement.serial_consistency_level.

                +

                This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

                +
                +

                Specialized Results

                +

                The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

                +

                The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

                +
                  +
                • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

                • +
                • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

                • +
                • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

                • +
                +

                How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

                +
                CREATE TABLE test.t (
                +    k int PRIMARY KEY,
                +    v int,
                +    x int
                +)
                +
                +
                +

                … the following sections show the expected result for a number of example statements, using the three base row factories.

                +
                +

                named_tuple_factory (default)

                +

                The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

                +
                >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                +Row(applied=True)
                +
                +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                +Row(applied=False, k=0, v=0, x=None)
                +
                +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                +Row(applied=True)
                +
                +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                +Row(applied=False, v=1, x=2)
                +
                +
                +
                +
                +

                tuple_factory

                +

                This return type does not refer to names, but the boolean value applied is always present in position 0:

                +
                >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                +(True,)
                +
                +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                +(False, 0, 0, None)
                +
                +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                +(True,)
                +
                +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                +(False, 1, 2)
                +
                +
                +
                +
                +

                dict_factory

                +

                The retuned dict contains the [applied] key:

                +
                >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                +{u'[applied]': True}
                +
                +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                +{u'x': 2, u'[applied]': False, u'v': 1}
                +
                +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
                +
                +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                +{u'[applied]': True}
                +
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/object-mapper.html b/3.26.4-scylla/object-mapper.html new file mode 100644 index 0000000000..f4204e06ae --- /dev/null +++ b/3.26.4-scylla/object-mapper.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Object Mapper

                +

                cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

                +

                Jump to Getting Started

                +
                +

                Contents

                +
                +
                Upgrade Guide

                For migrating projects from legacy cqlengine, to the integrated product

                +
                +
                Models

                Examples defining models, and mapping them to tables

                +
                +
                Making Queries

                Overview of query sets and filtering

                +
                +
                Batch Queries

                Working with batch mutations

                +
                +
                Connections

                Working with multiple sessions

                +
                +
                API Documentation

                Index of API documentation

                +
                +
                Third party integrations

                High-level examples in Celery and uWSGI

                +
                +
                +

                Frequently Asked Questions

                +
                +
                +
                +
                +

                Getting Started

                +
                import uuid
                +from cassandra.cqlengine import columns
                +from cassandra.cqlengine import connection
                +from datetime import datetime
                +from cassandra.cqlengine.management import sync_table
                +from cassandra.cqlengine.models import Model
                +
                +#first, define a model
                +class ExampleModel(Model):
                +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
                +    example_type    = columns.Integer(index=True)
                +    created_at      = columns.DateTime()
                +    description     = columns.Text(required=False)
                +
                +#next, setup the connection to your cassandra server(s)...
                +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
                +# the list of hosts will be passed to create a Cluster() instance
                +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
                +
                +#...and create your CQL table
                +>>> sync_table(ExampleModel)
                +
                +#now we can create some rows:
                +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
                +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
                +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
                +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
                +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
                +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
                +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
                +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
                +
                +#and now we can run some queries against our table
                +>>> ExampleModel.objects.count()
                +8
                +>>> q = ExampleModel.objects(example_type=1)
                +>>> q.count()
                +4
                +>>> for instance in q:
                +>>>     print instance.description
                +example5
                +example6
                +example7
                +example8
                +
                +#here we are applying additional filtering to an existing query
                +#query objects are immutable, so calling filter returns a new
                +#query object
                +>>> q2 = q.filter(example_id=em5.example_id)
                +
                +>>> q2.count()
                +1
                +>>> for instance in q2:
                +>>>     print instance.description
                +example5
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/objects.inv b/3.26.4-scylla/objects.inv new file mode 100644 index 0000000000..558d032065 Binary files /dev/null and b/3.26.4-scylla/objects.inv differ diff --git a/3.26.4-scylla/performance.html b/3.26.4-scylla/performance.html new file mode 100644 index 0000000000..16edd09ca5 --- /dev/null +++ b/3.26.4-scylla/performance.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Performance Notes

                +

                The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

                +

                Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

                +

                The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

                +

                Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

                +
                +

                PyPy

                +

                PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

                +
                +
                +

                Cython Extensions

                +

                Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

                +

                See Installation for details on controlling this build.

                +
                +
                +

                multiprocessing

                +

                All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

                +

                Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

                +

                For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/py-modindex.html b/3.26.4-scylla/py-modindex.html new file mode 100644 index 0000000000..6d91edd71e --- /dev/null +++ b/3.26.4-scylla/py-modindex.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + + + +
                + + + + + +
                + + +
                +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/query-paging.html b/3.26.4-scylla/query-paging.html new file mode 100644 index 0000000000..28d6307a85 --- /dev/null +++ b/3.26.4-scylla/query-paging.html @@ -0,0 +1,715 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Paging Large Queries

                +

                Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

                +
                +

                Controlling the Page Size

                +

                By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

                +
                +
                +

                Handling Paged Results

                +

                Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

                +
                from cassandra.query import SimpleStatement
                +query = "SELECT * FROM users"  # users contains 100 rows
                +statement = SimpleStatement(query, fetch_size=10)
                +for user_row in session.execute(statement):
                +    process_user(user_row)
                +
                +
                +

                Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

                +

                If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

                +
                +
                +

                Handling Paged Results with Callbacks

                +

                If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

                +

                Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

                +
                class PagedResultHandler(object):
                +
                +    def __init__(self, future):
                +        self.error = None
                +        self.finished_event = Event()
                +        self.future = future
                +        self.future.add_callbacks(
                +            callback=self.handle_page,
                +            errback=self.handle_err)
                +
                +    def handle_page(self, rows):
                +        for row in rows:
                +            process_row(row)
                +
                +        if self.future.has_more_pages:
                +            self.future.start_fetching_next_page()
                +        else:
                +            self.finished_event.set()
                +
                +    def handle_error(self, exc):
                +        self.error = exc
                +        self.finished_event.set()
                +
                +future = session.execute_async("SELECT * FROM users")
                +handler = PagedResultHandler(future)
                +handler.finished_event.wait()
                +if handler.error:
                +    raise handler.error
                +
                +
                +
                +
                +

                Resume Paged Results

                +

                You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

                +
                from cassandra.query import SimpleStatement
                +query = "SELECT * FROM users"
                +statement = SimpleStatement(query, fetch_size=10)
                +results = session.execute(statement)
                +
                +# save the paging_state somewhere and return current results
                +web_session['paging_state'] = results.paging_state
                +
                +
                +# resume the pagination sometime later...
                +statement = SimpleStatement(query, fetch_size=10)
                +ps = web_session['paging_state']
                +results = session.execute(statement, paging_state=ps)
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/scylla-cloud-serverless.html b/3.26.4-scylla/scylla-cloud-serverless.html new file mode 100644 index 0000000000..5bc91db174 --- /dev/null +++ b/3.26.4-scylla/scylla-cloud-serverless.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + ScyllaDB Cloud Serverless | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                ScyllaDB Cloud Serverless

                +

                With ScyllaDB Cloud, you can deploy serverless databases. +The Python driver allows you to connect to a serverless database by utilizing the connection bundle you can download via the Connect>Python tab in the Cloud application. +The connection bundle is a YAML file with connection and credential information for your cluster.

                +

                Connecting to a ScyllaDB Cloud serverless database is very similar to a standard connection to a ScyllaDB database.

                +

                Here’s a short program that connects to a ScyllaDB Cloud serverless database and prints metadata about the cluster:

                +
                from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                +from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy
                +
                +PATH_TO_BUNDLE_YAML = '/file/downloaded/from/cloud/connect-bundle.yaml'
                +
                +
                +def get_cluster():
                +    profile = ExecutionProfile(
                +        load_balancing_policy=TokenAwarePolicy(
                +            DCAwareRoundRobinPolicy(local_dc='us-east-1')
                +        )
                +    )
                +
                +    return Cluster(
                +        execution_profiles={EXEC_PROFILE_DEFAULT: profile},
                +        scylla_cloud=PATH_TO_BUNDLE_YAML,
                +    )
                +
                +
                +print('Connecting to cluster')
                +cluster = get_cluster()
                +session = cluster.connect()
                +
                +print('Connected to cluster', cluster.metadata.cluster_name)
                +
                +print('Getting metadata')
                +for host in cluster.metadata.all_hosts():
                +    print('Datacenter: {}; Host: {}; Rack: {}'.format(
                +        host.datacenter, host.address, host.rack)
                +    )
                +
                +cluster.shutdown()
                +
                +
                +

                By providing the scylla_cloud parameter to the Cluster constructor, +the driver can set up the connection based on the endpoint and credential information +stored in your downloaded ScyllaDB Cloud Serverless connection bundle.

                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/scylla-cloud.html b/3.26.4-scylla/scylla-cloud.html new file mode 100644 index 0000000000..3047b0135d --- /dev/null +++ b/3.26.4-scylla/scylla-cloud.html @@ -0,0 +1,613 @@ + + + + + + + + + + + + + ScyllaDB Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                ScyllaDB Cloud

                +

                To connect to a ScyllaDB Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/scylla-specific.html b/3.26.4-scylla/scylla-specific.html new file mode 100644 index 0000000000..e093bee407 --- /dev/null +++ b/3.26.4-scylla/scylla-specific.html @@ -0,0 +1,725 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Scylla Specific Features

                +
                +

                Shard Awareness

                +

                scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

                +

                Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding

                +

                For using it you only need to enable TokenAwarePolicy on the Cluster

                +

                See the configuration of native_shard_aware_transport_port and native_shard_aware_transport_port_ssl on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol

                +
                from cassandra.cluster import Cluster
                +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
                +
                +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
                +
                +
                +
                +
                +

                New Cluster Helpers

                +
                  +
                • shard_aware_options

                  +

                  Setting it to dict(disable=True) would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections

                  +

                  Other option is to configure scylla by setting enable_shard_aware_drivers: false on scylla.yaml.

                  +
                • +
                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster(shard_aware_options=dict(disable=True))
                +session = cluster.connect()
                +
                +assert not cluster.is_shard_aware(), "Shard aware should be disabled"
                +
                +# or just disable the shard aware port logic
                +cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True))
                +session = cluster.connect()
                +
                +
                +
                  +
                • cluster.is_shard_aware()

                  +

                  New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

                  +
                • +
                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster()
                +session = cluster.connect()
                +
                +if cluster.is_shard_aware():
                +    print("connected to a scylla cluster")
                +
                +
                +
                  +
                • cluster.shard_aware_stats()

                  +

                  New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

                  +
                • +
                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster()
                +session = cluster.connect()
                +
                +stats = cluster.shard_aware_stats()
                +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
                +    print("successfully connected to all shards of all scylla nodes")
                +
                +
                +
                +
                +

                New Error Types

                +
                  +
                • SCYLLA_RATE_LIMIT_ERROR Error

                  +

                  The ScyllaDB 5.1 introduced a feature called per-partition rate limiting. In case the (user defined) per-partition rate limit is exceeded, the database will start returning a Scylla-specific type of error: RateLimitReached.

                  +
                • +
                +
                from cassandra import RateLimitReached
                +from cassandra.cluster import Cluster
                +
                +cluster = Cluster()
                +session = cluster.connect()
                +session.execute("""
                +    CREATE KEYSPACE IF NOT EXISTS keyspace1
                +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}
                +""")
                +
                +session.execute("USE keyspace1")
                +session.execute("""
                +    CREATE TABLE tbl (pk int PRIMARY KEY, v int)
                +    WITH per_partition_rate_limit = {'max_writes_per_second': 1}
                +""")
                +
                +prepared = session.prepare("""
                +    INSERT INTO tbl (pk, v) VALUES (?, ?)
                +""")
                +
                +try:
                +    for _ in range(1000):
                +        self.session.execute(prepared.bind((123, 456)))
                +except RateLimitReached:
                +    raise
                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/search.html b/3.26.4-scylla/search.html new file mode 100644 index 0000000000..8b35c41f1e --- /dev/null +++ b/3.26.4-scylla/search.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + + + + + +
                + + + + + +
                + + +
                +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/searchindex.js b/3.26.4-scylla/searchindex.js new file mode 100644 index 0000000000..134e312fe4 --- /dev/null +++ b/3.26.4-scylla/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third-party", "cqlengine/upgrade-guide", "dates-and-times", "execution-profiles", "faq", "getting-started", "index", "installation", "lwt", "object-mapper", "performance", "query-paging", "scylla-cloud", "scylla-cloud-serverless", "scylla-specific", "security", "upgrading", "user-defined-types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third-party.rst", "cqlengine/upgrade-guide.rst", "dates-and-times.rst", "execution-profiles.rst", "faq.rst", "getting-started.rst", "index.rst", "installation.rst", "lwt.rst", "object-mapper.rst", "performance.rst", "query-paging.rst", "scylla-cloud.rst", "scylla-cloud-serverless.rst", "scylla-specific.rst", "security.rst", "upgrading.rst", "user-defined-types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "ScyllaDB Cloud", "ScyllaDB Cloud Serverless", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"march": 0, "2023": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 55, 56], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 53, 54, 55, 56], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 53, 56], "profil": [0, 3, 4, 12, 14, 45, 52], "execute_concurr": [0, 4, 33, 49], "pr": 0, "1122": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "empti": [0, 2, 3, 25, 47], "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 53, 56], "page": [0, 1, 3, 45, 51], "1110": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 54, 55, 56], "re": [0, 27, 30, 37, 38, 39, 44, 46, 54, 56], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 53, 54], "stream": [0, 29], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 54, 56], "flight": [0, 5], "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 54, 55], "1114": 0, "asyncor": [0, 33, 46], "race": 0, "condit": [0, 1, 3, 8, 10, 30, 45], "caus": [0, 3, 10, 26, 37, 47], "log": [0, 3, 8, 27, 30, 31, 44, 45, 55], "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53, 54], "shutdown": [0, 3, 39, 52], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 52, 54, 55, 56], "1266": 0, "warn": [0, 1, 3, 31, 40, 55], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 56], "trace": [0, 3, 33], "1103": 0, "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "mutabl": [0, 3], "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 54], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 53, 54, 55, 56], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 54, 55, 56], "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "1116": 0, "depend": [0, 2, 41, 43, 47, 49], "unittest2": 0, "1289": 0, "asyncio": [0, 33], "coroutin": 0, "annot": 0, "asyncioreactor": [0, 33], "pytthon": 0, "1290": 0, "typo": 0, "sourc": [0, 3, 15, 18, 45, 46], "file": [0, 40, 49, 52, 54], "1126": 0, "hostfilterpolicyinittest": 0, "1131": 0, "dontprepareonignoredhoststest": 0, "1287": 0, "integr": [0, 29, 40, 41, 45, 46, 48, 55], "simulacron": 0, "test_connect": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "1304": 0, "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 52, 54, 55], "test_single_interfac": 0, "py": [0, 46], "appear": [0, 47], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "c": [0, 6, 12, 25, 27, 38, 54], "1329": 0, "authent": [0, 1, 3, 33], "fraudul": 0, "1328": 0, "preparedstatementtest": 0, "test_fail_if_different_query_id_on_reprepar": 0, "unexpectedli": 0, "ptyhon": 0, "1327": 0, "refactor": [0, 41], "unittest": 0, "alias": 0, "compat": [0, 3, 18, 25, 33, 55], "1112": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56], "releas": [0, 9, 27, 40, 42, 54, 55], "well": [0, 27, 35, 44, 54], "2021": 0, "ensur": [0, 3, 4, 9, 27, 39, 46, 54], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55, 56], "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55, 56], "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 54, 55, 56], "invalid": [0, 1, 26, 30], "peer": [0, 5, 25], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54, 55], "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 54], "system": [0, 5, 25, 38, 42, 43, 44, 46, 55], "1260": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 54, 55], "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 53], "v5": [0, 1], "checksum": 0, "1258": 0, "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 55], "mechan": [0, 2, 3, 27, 54], "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 53, 54, 56], "astra": 0, "1265": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 55], "reserv": 0, "keyword": [0, 3, 6, 7, 9, 10], "1269": 0, "drop": [0, 6, 8, 29], "1220": 0, "secur": [0, 45, 55], "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 54, 55], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53, 55, 56], "protocol_tl": [0, 54], "1264": 0, "june": 0, "2020": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 54, 55], "geomet": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 54, 55, 56], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 53, 54, 55, 56], "runtim": [0, 46, 49], "1237": 0, "use_default_tempdir": 0, "cloud": [0, 3, 27, 45], "config": [0, 54], "1245": 0, "tcp": 0, "flow": 0, "control": [0, 3, 4, 27, 30, 40, 49, 54], "libevreactor": [0, 3, 33, 46], "1248": 0, "unabl": [0, 27, 46], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 46, 48, 49, 51, 52, 54, 56], "ubuntu": [0, 46], "04": 0, "1238": 0, "plaintextauthprovid": [0, 2, 3, 33, 54, 55], "unicod": [0, 17, 44], "char": 0, "python3": 0, "1241": 0, "graph": [0, 3], "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 54], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 52, 53, 54, 55], "local_quorum": [0, 1, 44], "1240": 0, "t": [0, 9, 10, 15, 31, 37, 38, 41, 43, 44, 47, 49, 54, 55, 56], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 53, 55, 56], "boolean": [0, 1, 6, 25, 27, 44, 47], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 56], "fluent": [0, 33, 46, 55], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 54], "1239": 0, "elementmap": 0, "deseri": [0, 15, 18, 33, 41], "1233": 0, "bump": 0, "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 55, 56], "1243": 0, "gremlinpython": [0, 46], "1212": 0, "improv": [0, 1, 35, 49, 55], "core": [0, 3, 4, 38, 40, 46, 49], "1244": 0, "april": 0, "transient": 0, "replic": [0, 3, 8, 25, 40, 53], "1207": 0, "peers_v2": 0, "port": [0, 3, 5, 25, 44, 53], "discoveri": 0, "700": 0, "1228": 0, "februari": 0, "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 53, 54, 55], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 53, 54, 55], "resultset": [0, 3, 33, 50, 55], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 54, 55, 56], "schema": [0, 3, 9, 30, 33, 37, 44, 55], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 53, 54, 55], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 53, 55, 56], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 53, 55, 56], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "788": 0, "nativ": [0, 1, 15, 18, 29, 37, 45], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 55, 56], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4, 53], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 53], "1027": 0, "enabl": [0, 3, 10, 44, 53, 54, 55], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 55, 56], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 52, 54, 55], "numer": [0, 41], "wrapper": [0, 27, 30], "proper": [0, 39, 46], "definit": [0, 3, 6, 15, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 54], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "1057": 0, "bulkset": 0, "1060": 0, "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 56], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 54, 55], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 53, 54, 55, 56], "classic": 0, "1090": 0, "1039": 0, "expos": [0, 31, 55], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 15, 25, 26, 30, 32, 38, 45, 55], "1019": 0, "more": [0, 3, 4, 6, 9, 10, 15, 25, 27, 29, 31, 38, 40, 42, 44, 45, 49, 50, 54, 55], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 54], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 53, 54, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 55, 56], "1205": 0, "januari": 0, "unifi": 0, "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 55], "packag": [0, 2, 32, 41, 46, 48, 54, 55], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55, 56], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 53, 54, 55, 56], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 54], "twist": [0, 33, 44], "1161": 0, "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "1048": 0, "flexibl": [0, 45], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 55], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 54, 56], "mismatch": 0, "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 53, 55], "cqlengineexcept": [0, 40], "1166": 0, "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "process": [0, 3, 4, 20, 43, 44, 46, 49, 53, 54, 55], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 55], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 53, 54], "1181": 0, "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 54], "certif": [0, 54], "hostnam": [0, 27, 54], "sslcontext": [0, 54], "check_hostnam": [0, 54], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 56], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 55], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 54], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 52, 53, 54, 55, 56], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 54, 55, 56], "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 54], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "about": [0, 3, 25, 30, 37, 41, 44, 46, 52, 54, 55], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 53, 54, 55], "balanc": [0, 3, 33, 42, 55], "polici": [0, 3, 33, 42, 43, 44, 52, 53, 55], "1177": 0, "publish": [0, 46, 54], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 55], "next": [0, 3, 21, 27, 42, 48, 50, 54], "major": [0, 27, 42, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 54, 55], "defaultloadbalancingpolici": [0, 27, 55], "1047": 0, "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 53, 54, 55], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 55], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 54], "unknown": [0, 15, 18, 46, 55], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 52, 54, 56], "819": 0, "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 52, 54, 56], "773": 0, "authprovid": [0, 2, 3, 33, 54], "transit": 0, "mode": 0, "831": 0, "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 54], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 55], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45, 53], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 55], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 54], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 54], "574": 0, "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 53, 55], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 55], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 54], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 53], "avail": [0, 3, 10, 30, 38, 45, 46, 53, 55], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 46, 47, 48, 49, 50, 52, 53, 54, 56], "runtimeerror": 0, "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 55], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 52, 53, 54, 56], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 53, 54], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 54, 55], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 54, 55], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53, 54], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 55], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 54, 55], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 55], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 55, 56], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 53, 54, 55], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "709": 0, "socket": [0, 5, 54], "associ": [0, 3, 55], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46, 52], "clean": [0, 39, 46, 55], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 52, 54, 55], "673": 0, "fqdn": [0, 54], "ip": [0, 3, 5, 27, 28, 44, 54], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 52, 54, 55, 56], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 56], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "around": [0, 9, 32, 40, 41, 55], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 54, 55], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 56], "789": 0, "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 54, 55, 56], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 54], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 54, 55], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 54, 55, 56], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 54], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 55], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 46, 48, 54, 55], "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 54], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 53], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44, 52], "1009": 0, "deadlock": [0, 4], "heartbeat": 0, "whilst": 0, "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 55], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 54], "1044": 0, "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 53, 54, 55], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 55], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 55], "1023": 0, "param": [0, 4, 13], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 15, 27, 33, 43, 46, 53], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 56], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 54, 55], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 56], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 55], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 53, 55, 56], "1093": 0, "incorrect": [0, 44], "compact": [0, 9], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53, 54], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 54], "1117": 0, "built": [0, 32, 42, 46, 49, 55], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 53, 55], "doesn": [0, 31, 55], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45, 53], "1127": 0, "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 54, 56], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 54], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41, 52], "1079": 0, "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 54], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 54, 55], "1082": 0, "let": [0, 3, 55], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 52, 54, 55], "sortedset": [0, 32, 33, 55], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 55], "1068": 0, "ssl_context": [0, 3, 44, 54], "995": 0, "encrypt": [0, 54], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 15, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 53, 54, 56], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 53, 55, 56], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 55, 56], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 54, 55, 56], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 55], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55, 56], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 54], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 53, 54, 55], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 53, 55], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 54, 56], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 54, 55], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 55], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 55], "1015": 0, "septemb": 0, "logic": [0, 37, 53], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 53, 55], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43, 53], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 54], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 54, 55], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 54], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 54], "loop": [0, 3, 4, 21, 33, 44, 46, 54], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 54, 55], "subclass": [0, 1, 2, 3, 27, 30, 37, 54], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 55], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 54, 55], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 54, 55, 56], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 55], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 53], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 55], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 53, 54], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 54, 55], "cassandra_vers": 0, "910": 0, "kind": [0, 27, 55], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 55, 56], "915": 0, "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53, 54], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 56], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 54, 56], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 54, 56], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 55, 56], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 56], "865": 0, "deprecationwarn": [0, 55], "846": 0, "example_mapp": 0, "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 54, 55], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 54], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 54], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42, 52], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 55], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 55], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 55, 56], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 55], "810": 0, "833": 0, "juli": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 54, 55], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 55], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 54], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 54], "772": 0, "pool": [0, 1, 3, 33, 55], "739": 0, "murmur3": [0, 3, 46], "big": [0, 53], "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 55], "785": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 54], "464": 0, "inupt": 0, "microsecond": [0, 31, 55], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 53, 56], "705": 0, "get_query_trac": [0, 3, 43, 55], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 55], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44, 53], "drain": 0, "734": 0, "resulset": 0, "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 55], "grow": 0, "720": 0, "size": [0, 3, 10, 55], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 53, 54, 55, 56], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 54], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "callback": [0, 3, 10, 44, 49, 54], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 55], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 53, 54], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 55], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 53], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52, 53], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 55], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 55], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 52, 55], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 55], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 55], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 54, 55, 56], "lead": [0, 34, 49, 55], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 56], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 54, 55], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 54, 55], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 54], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 55], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 55], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 56], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 55], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 55], "stat": [0, 26, 53], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 53, 55], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 54, 55], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 54, 55], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 55], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 55], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 53], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "569": 0, "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 54], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37, 52], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 55, 56], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49, 53], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "434": 0, "unicodedecodeerror": 0, "bop": 0, "559": 0, "565": 0, "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 53], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46, 53], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 55], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 54, 55], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 54, 55], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 54, 55], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 55], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 53, 55, 56], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 54], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 55], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 52, 54], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 53, 55], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 55], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 55], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 53, 54], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 53], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53, 54], "489": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": [0, 53], "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 55, 56], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 55], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55, 56], "might": [0, 3, 30, 50, 54], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 54, 56], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 54, 55], "access": [0, 3, 9, 26, 30, 37, 44, 55], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 54, 55], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 54, 55, 56], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 54, 55], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28, 52], "dc": [0, 3, 27, 55], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 55], "408": [0, 55], "400": [0, 55], "422": [0, 55], "292": [0, 55], "318": [0, 55], "368": [0, 55], "371": 0, "blist": 0, "soft": 0, "385": [0, 55], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44, 53], "178": [0, 30, 55], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "pagedresult": [0, 50, 55], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "397": 0, "398": 0, "extens": [0, 3, 27, 41, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 53, 56], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 55], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38, 53], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 55], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 55], "round": [0, 27, 32], "341": 0, "sizeti": 0, "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48, 53], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 55], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 54], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 55], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 54], "patch": [0, 21, 22, 41, 54], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 54], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 55], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 55], "243": 0, "kerbero": [0, 54], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 55], "192": [0, 3, 44], "set_keyspac": [0, 3, 27, 44, 56], "195": 0, "implicit": [0, 10, 55], "204": 0, "collis": 0, "sasl": [0, 2, 54], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 55], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 55], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 55], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41, 52], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27, 52], "contact_point": [0, 3, 7, 27, 54], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 55], "88": 0, "constructor": [0, 3, 6, 38, 52], "basi": [0, 55], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 53], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 53, 54, 55], "use_client_timestamp": [0, 1, 3, 55], "overrid": [0, 3, 9, 15, 18, 42, 44, 55], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 53, 56], "refer": [0, 10, 34, 40, 42, 47, 55], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 55], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 55], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 54, 55, 56], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 55], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 54, 55, 56], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 54], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 54, 55, 56], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 52, 54, 55], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 53], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 55], "help": [0, 38, 55], "done": [0, 3, 37, 41, 43, 54, 55], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 54, 55], "guarante": [0, 27, 30, 55], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 55, 56], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 54], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 53, 54, 55, 56], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 52, 54, 55, 56], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 53, 54, 55], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 55], "left": [0, 3, 4, 9, 41, 55], "place": [0, 40, 44, 55], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 55], "dict_factori": [0, 3, 7, 16, 30, 33, 55], "ordered_dict_factori": [0, 3, 16, 30, 33, 55], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 54, 55, 56], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 55], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 53, 55], "executor": 0, "becom": [0, 3, 8, 49, 55], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 54, 55], "lowercas": 0, "liter": [0, 15, 17, 18, 30, 41, 44, 55, 56], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 55], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 55, 56], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28, 52], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 54, 55], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 53, 54, 55], "never": [0, 27, 34, 47, 49, 55], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 55], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": 0, "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 54, 55], "main": [0, 3, 54, 56], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 49, 53, 54, 55], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 54, 55], "strong": 0, "garbag": [0, 55], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 55], "twice": 0, "had": [0, 40, 55], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 56], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 53], "parallel": 0, "sesssion": 0, "effort": [0, 40, 54], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 54], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 55], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 54], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 53], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 54], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 52, 54], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 55, 56], "constant": [0, 54], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 55], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 52, 54, 55], "ONE": [1, 3, 10, 40, 55], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 56], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 54, 56], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 53, 54, 56], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 53, 56], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53, 54], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 55, 56], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 54, 56], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 54], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 55], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27, 52, 53], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 53], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 55], "higher": [1, 3, 4, 30, 54, 55], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 55], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 54], "author": [1, 54], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 55], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 54], "usernam": [2, 44, 54], "password": [2, 54], "passwordauthent": [2, 54], "auth_provid": [2, 3, 54], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 54], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 53, 54, 55, 56], "servic": [2, 54], "someth": [2, 27, 37, 38, 46, 54], "qop": [2, 54], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 54], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 54], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "load_balancing_polici": [3, 27, 42, 44, 52, 53], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 53, 54, 55], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 54], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 54, 56], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 54, 55], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50, 53], "purpos": [3, 6], "register_user_typ": [3, 55, 56], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 54, 55], "whose": 3, "mykeyspac": [3, 30, 44, 55, 56], "street": [3, 11, 37, 55, 56], "zipcod": [3, 11, 37, 55, 56], "locat": [3, 40, 54, 56], "def": [3, 27, 34, 37, 39, 43, 44, 50, 52, 54, 55, 56], "self": [3, 15, 18, 37, 50, 53, 55, 56], "INTO": [3, 4, 30, 44, 47, 53, 56], "st": [3, 37, 56], "78723": [3, 56], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 53, 56], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44, 52], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 55], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 55], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 52, 54], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": 3, "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 54], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 55], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 55], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 56], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "24": 3, "appropri": [3, 37, 46, 54], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44, 52], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 55], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 54], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 54], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 54, 55], "placehold": [3, 15, 18, 30, 44, 56], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 54], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 55], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 56], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 54], "expir": 3, "exceed": [3, 4, 53], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 55], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 54], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "errback_kwarg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 54, 55], "backward": [3, 18, 25, 55], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 54], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 55, 56], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 55], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 52, 54], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 54], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 53], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42, 52, 53], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47, 52], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 54], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 54], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 53], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 53], "www": 6, "com": [6, 10, 53, 54], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 53], "durable_writ": 8, "simplestrategi": [8, 25, 53], "caution": [8, 37], "product": [8, 48, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 54, 55], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 53, 56], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 55], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 54], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 55], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 55], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 55], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 54], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 54], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 54], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 55], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 55], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "val": 15, "concis": 15, "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 55], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 54], "handle_fork": 20, "eventletconnect": [21, 33, 54], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 55], "twistedconnect": [24, 33, 54], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42, 52], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 55], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "replicationfactor": 25, "all_replica": 25, "transient_replica": 25, "options_map": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 54], "pmfstat": 26, "latenc": [26, 44, 53], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 54], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 53], "evenli": 27, "what": [27, 30, 37, 41, 54, 55, 56], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 52, 54], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 54], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 53, 55], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 54, 55], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 54, 55], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 54], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 54], "silent": 27, "idea": 27, "best": [27, 44, 51, 54], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 54], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 54], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 55], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 54], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "23": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "eventletreactor": 33, "twistedreactor": [33, 54], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 54], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 53], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 54], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 54, 55], "presist": 37, "pattern": [37, 49], "joe": [37, 54], "99999": 37, "ll": [38, 54], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 54], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 55], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44, 53], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 53], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 55], "scylla": [38, 40, 46, 51, 55], "21": 38, "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "26": 38, "17": [38, 54], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 55], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 55], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 55], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": [42, 53], "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 55, 56], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 54], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 56], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49], "handle_success": 44, "rememb": 44, "user1": [44, 54], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "upgrad": [45, 48, 54], "scylladb": [45, 53], "serverless": 45, "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 55], "reinstal": 46, "22": 46, "abl": 46, "snappi": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 54], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": [46, 53], "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 54], "mussei": [46, 54], "thorough": [46, 54], "outcom": 47, "pertin": 47, "reject": 47, "statu": [47, 53], "squar": 47, "bracket": 47, "AND": 47, "retun": 47, "jump": 48, "migrat": 48, "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 54], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "p": 50, "deploi": 52, "bundl": 52, "download": 52, "tab": 52, "veri": [52, 54], "program": 52, "path_to_bundle_yaml": 52, "get_clust": 52, "east": 52, "scylla_cloud": 52, "cluster_nam": 52, "onward": 53, "md": 53, "intranod": 53, "native_shard_aware_transport_port": 53, "native_shard_aware_transport_port_ssl": 53, "shard_aware_opt": 53, "enable_shard_aware_driv": 53, "is_shard_awar": 53, "disable_shardaware_port": 53, "shard_aware_stat": 53, "shards_count": 53, "scylla_rate_limit_error": 53, "rate": 53, "ratelimitreach": 53, "keyspace1": 53, "tbl": 53, "per_partition_rate_limit": 53, "max_writes_per_second": 53, "456": 53, "get_credenti": 54, "host_address": 54, "1234": 54, "wrap_socket": 54, "create_default_context": 54, "server_hostnam": 54, "keystor": 54, "intruct": 54, "cert": 54, "understand": 54, "demonstr": 54, "deploy": 54, "client_encryption_opt": 54, "keystore_password": 54, "mystorepass": 54, "require_client_auth": 54, "verify_mod": 54, "cert_requir": 54, "load_verify_loc": 54, "rootca": 54, "crt": 54, "truststor": 54, "jk": 54, "truststore_password": 54, "pem": 54, "conf": 54, "gen_client_cert": 54, "eof": 54, "req": 54, "distinguished_nam": 54, "req_distinguished_nam": 54, "output_password": 54, "root_cert_pass": 54, "default_bit": 54, "2048": 54, "cert_countri": 54, "cert_org_nam": 54, "ou": 54, "cert_ou": 54, "cn": 54, "root": 54, "Then": 54, "openssl": 54, "newkei": 54, "rsa": 54, "keyout": 54, "csr": 54, "x509": 54, "root_ca_base_nam": 54, "cakei": 54, "passin": 54, "crt_sign": 54, "cert_valid": 54, "cacreateseri": 54, "load_cert_chain": 54, "certfil": 54, "keyfil": 54, "crypto": 54, "tlsv1_2_method": 54, "set_verifi": 54, "verify_p": 54, "lambda": 54, "_1": 54, "_2": 54, "_3": 54, "_4": 54, "use_certificate_fil": 54, "use_privatekey_fil": 54, "ca_cert": 54, "ssl_version": 54, "ssl_opt": 54, "my": 54, "cert_req": 54, "risen": 54, "advanc": 54, "dseplaintextauthprovid": 54, "act": 54, "permiss": 54, "grant": 54, "role": 54, "plain": 54, "authorization_id": 54, "ticket": 54, "kinit": 54, "offici": [54, 55], "dse_graph": 55, "swap": 55, "rework": 55, "mesh": 55, "afterward": 55, "got": 55, "row_list": 55, "first_result": 55, "variant": 55, "brought": 55, "overhaul": 55, "highlight": 55, "nomenclatur": 55, "keyspace_nam": 55, "031ebb0": 55, "refresh_": 55, "_metadata": 55, "419fcdf": 55, "submit_schema_refresh": 55, "574266d": 55, "cqltype": 55, "bb984ee": 55, "e16a073": 55, "cc94073": 55, "from_datetim": 55, "96489cc": 55, "a2d3a98": 55, "4bd5909": 55, "__polymorphic_": 55, "__discrimin": 55, "9d98c8e": 55, "79efe97": 55, "citi": 55, "zip": [55, 56], "though": 55, "notabl": 55, "simpler": 55, "unclean": 55, "tell": 56, "insert_stat": 56, "otherstuff": 56, "first_row": 56, "fine": 56, "unprepar": 56, "parameter": 56, "interpol": 56}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph": [[12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 3, 1, "", "ReplicationFactor"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 54, 55], "26": 0, "0": [0, 54, 55], "featur": [0, 29, 53, 55], "bug": 0, "fix": 0, "other": 0, "deprec": [0, 40, 55], "25": 0, "24": 0, "23": 0, "22": 0, "21": 0, "20": 0, "2": [0, 55], "1": [0, 55], "19": 0, "18": 0, "17": 0, "16": [0, 54], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 55], "x": [0, 55], "upgrad": [0, 40, 55], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 55], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 54, 55], "cluster": [3, 42, 44, 53, 55], "session": [3, 44, 55], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 55], "execut": [4, 34, 42, 44, 54, 55], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 55], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 53, 55, 56], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 56], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 55], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 56], "user": [11, 37, 55, 56], "defin": [11, 37, 55, 56], "datastax": [12, 13, 14, 15, 33], "graph": [12, 13, 14, 15, 18, 33, 46, 55], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 55], "format": 16, "encod": [17, 55], "non": [17, 46, 55], "prepar": [17, 30, 44, 55], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 54], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 54], "metadata": [25, 55], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 54], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 54, 55], "custom": [29, 54, 55], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 55], "trace": [30, 43, 55], "timestamp": [31, 41, 55], "gener": [31, 34], "api": [33, 40, 55], "document": 33, "core": 33, "driver": [33, 43, 45], "mapper": [33, 48], "us": [34, 42, 55, 56], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 56], "new": [35, 53], "chang": [35, 40, 55], "default": [35, 38, 42, 47, 55], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 55], "work": [36, 41, 55], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 55], "delet": 36, "individu": 36, "exampl": [37, 54], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 55], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 55], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 55], "organ": 40, "import": [40, 55], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": [42, 44], "legaci": 42, "paramet": [42, 44, 55], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 56], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "keyspac": 44, "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 55], "specul": 44, "python": [45, 46], "scylla": [45, 53], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 55], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 54], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": [46, 53], "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 55], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 55], "configur": [46, 54], "ssl": [46, 54], "lightweight": [47, 55], "transact": [47, 55], "compar": 47, "special": 47, "result": [47, 50, 55], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 55], "larg": 50, "control": 50, "size": 50, "resum": 50, "scylladb": [51, 52], "cloud": [51, 52], "serverless": 52, "specif": 53, "shard": 53, "awar": 53, "helper": 53, "secur": 54, "v1": 54, "No": 54, "ident": 54, "verif": 54, "client": [54, 55], "version": 54, "lower": 54, "dse": [54, 55], "unifi": 54, "proxi": 54, "login": 54, "modul": 55, "execute_async": 55, "now": 55, "local_on": 55, "normal": 55, "inform": 55, "attach": 55, "bind": 55, "ignor": 55, "extra": 55, "blist": 55, "soft": 55, "sever": 55, "v3": 55, "nativ": 55, "side": 55, "v2": 55, "automat": 55, "sasl": 55, "call": 55, "shutdown": 55, "udt": 56, "dict": 56, "them": 56}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "Model Inheritance": [[37, "model-inheritance"], [40, "model-inheritance"]], "User Defined Types": [[37, "user-defined-types"], [56, "user-defined-types"]], "Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Frequently Asked Questions": [[36, "frequently-asked-questions"], [43, "frequently-asked-questions"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Execution Profiles": [[42, "execution-profiles"], [44, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Upgrading": [[55, "upgrading"]], "Installation": [[55, "installation"], [46, "installation"]], "Import from the cassandra module": [[55, "import-from-the-cassandra-module"]], "dse-graph": [[55, "dse-graph"]], "Session.execute and Session.execute_async API": [[55, "session-execute-and-session-execute-async-api"]], "Deprecations": [[55, "deprecations"], [55, "id2"], [0, "deprecations"], [0, "id20"], [0, "id43"], [0, "id168"]], "Upgrading to 3.0": [[55, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[55, "default-consistency-is-now-local-one"]], "Execution API Updates": [[55, "execution-api-updates"]], "Result return normalization": [[55, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[55, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[55, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[55, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[55, "metadata-api-updates"]], "Several deprecated features are removed": [[55, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[55, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[55, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[55, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[55, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[55, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[55, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[55, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[55, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[55, "protocol-level-batch-statements"]], "SASL-based Authentication": [[55, "sasl-based-authentication"]], "Lightweight Transactions": [[55, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[55, "calling-cluster-shutdown"]], "Dependency Changes": [[55, "dependency-changes"]], "Registering a UDT": [[56, "registering-a-udt"]], "Map a Class to a UDT": [[56, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[56, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[56, "using-udts-without-registering-them"]], "Scylla Specific Features": [[53, "scylla-specific-features"]], "Shard Awareness": [[53, "shard-awareness"]], "New Cluster Helpers": [[53, "new-cluster-helpers"]], "New Error Types": [[53, "new-error-types"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) Graph": [[46, "optional-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Contents": [[45, "contents"], [48, "contents"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "Security": [[54, "security"]], "Authentication": [[54, "authentication"]], "Custom Authenticators": [[54, "custom-authenticators"]], "Protocol v1 Authentication": [[54, "protocol-v1-authentication"]], "SSL": [[54, "ssl"]], "SSL with Twisted or Eventlet": [[54, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[54, "ssl-configuration-examples"]], "No identity verification": [[54, "no-identity-verification"]], "Client verifies server": [[54, "client-verifies-server"]], "Server verifies client": [[54, "server-verifies-client"]], "Server verifies client and client verifies server": [[54, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[54, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[54, "ssl-with-twisted"]], "DSE Authentication": [[54, "dse-authentication"]], "DSE Unified Authentication": [[54, "dse-unified-authentication"]], "Proxy Login": [[54, "proxy-login"]], "Proxy Execute": [[54, "proxy-execute"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Connecting to a Cluster": [[44, "connecting-to-a-cluster"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Session Keyspace": [[44, "session-keyspace"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "ScyllaDB Cloud": [[51, "scylladb-cloud"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "ScyllaDB Cloud Serverless": [[52, "scylladb-cloud-serverless"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]], "CHANGELOG": [[0, "changelog"]], "3.26.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id7"], [0, "id11"], [0, "id14"], [0, "id17"], [0, "id21"], [0, "id28"], [0, "id31"], [0, "id35"], [0, "id40"], [0, "id50"], [0, "id54"], [0, "id57"], [0, "id61"], [0, "id65"], [0, "id69"], [0, "id73"], [0, "id79"], [0, "id85"], [0, "id88"], [0, "id91"], [0, "id96"], [0, "id99"], [0, "id104"], [0, "id109"], [0, "id113"], [0, "id115"], [0, "id122"], [0, "id126"], [0, "id128"], [0, "id133"], [0, "id136"], [0, "id139"], [0, "id142"], [0, "id145"], [0, "id153"], [0, "id160"], [0, "id162"], [0, "id166"], [0, "id170"], [0, "id176"], [0, "id186"], [0, "id188"], [0, "id193"], [0, "id196"], [0, "id198"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id8"], [0, "id12"], [0, "id15"], [0, "id18"], [0, "id22"], [0, "id24"], [0, "id26"], [0, "id29"], [0, "id32"], [0, "id36"], [0, "id38"], [0, "id41"], [0, "id45"], [0, "id48"], [0, "id51"], [0, "id58"], [0, "id62"], [0, "id66"], [0, "id70"], [0, "id74"], [0, "id77"], [0, "id80"], [0, "id83"], [0, "id86"], [0, "id89"], [0, "id92"], [0, "id94"], [0, "id97"], [0, "id100"], [0, "id105"], [0, "id107"], [0, "id110"], [0, "id114"], [0, "id116"], [0, "id118"], [0, "id120"], [0, "id123"], [0, "id125"], [0, "id127"], [0, "id129"], [0, "id131"], [0, "id134"], [0, "id137"], [0, "id140"], [0, "id143"], [0, "id146"], [0, "id149"], [0, "id151"], [0, "id154"], [0, "id156"], [0, "id158"], [0, "id161"], [0, "id163"], [0, "id167"], [0, "id171"], [0, "id174"], [0, "id177"], [0, "id180"], [0, "id183"], [0, "id185"], [0, "id189"], [0, "id191"], [0, "id194"], [0, "id197"], [0, "id199"], [0, "id201"]], "Others": [[0, "others"], [0, "id5"], [0, "id9"], [0, "id19"]], "3.25.0": [[0, "id2"]], "3.24.0": [[0, "id6"]], "3.23.0": [[0, "id10"]], "3.22.0": [[0, "id13"]], "3.21.0": [[0, "id16"]], "Other": [[0, "other"], [0, "id33"], [0, "id42"], [0, "id46"], [0, "id52"], [0, "id55"], [0, "id59"], [0, "id63"], [0, "id67"], [0, "id71"], [0, "id75"], [0, "id81"], [0, "id111"], [0, "id147"], [0, "id152"], [0, "id164"], [0, "id172"], [0, "id178"], [0, "id181"], [0, "id184"], [0, "id187"], [0, "id190"], [0, "id192"], [0, "id195"], [0, "id200"]], "3.20.2": [[0, "id23"]], "3.20.1": [[0, "id25"]], "3.20.0": [[0, "id27"]], "3.19.0": [[0, "id30"]], "3.18.0": [[0, "id34"]], "3.17.1": [[0, "id37"]], "3.17.0": [[0, "id39"]], "3.16.0": [[0, "id44"]], "3.15.1": [[0, "id47"]], "3.15.0": [[0, "id49"]], "3.14.0": [[0, "id53"]], "3.13.0": [[0, "id56"]], "3.12.0": [[0, "id60"]], "3.11.0": [[0, "id64"]], "3.10.0": [[0, "id68"]], "3.9.0": [[0, "id72"]], "3.8.1": [[0, "id76"]], "3.8.0": [[0, "id78"]], "3.7.1": [[0, "id82"]], "3.7.0": [[0, "id84"]], "3.6.0": [[0, "id87"]], "3.5.0": [[0, "id90"]], "3.4.1": [[0, "id93"]], "3.4.0": [[0, "id95"]], "3.3.0": [[0, "id98"]], "3.2.2": [[0, "id101"]], "3.2.1": [[0, "id102"]], "3.2.0": [[0, "id103"]], "3.1.1": [[0, "id106"]], "3.1.0": [[0, "id108"]], "3.0.0": [[0, "id112"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id117"]], "2.7.1": [[0, "id119"]], "2.7.0": [[0, "id121"]], "2.6.0": [[0, "id124"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id130"]], "2.5.0": [[0, "id132"]], "2.1.4": [[0, "id135"]], "2.1.3": [[0, "id138"]], "2.1.2": [[0, "id141"]], "2.1.1": [[0, "id144"]], "2.1.0": [[0, "id148"]], "2.1.0c1": [[0, "id150"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id155"]], "2.0.1": [[0, "id157"]], "2.0.0": [[0, "id159"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id165"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id169"]], "1.1.1": [[0, "id173"]], "1.1.0": [[0, "id175"]], "1.0.2": [[0, "id179"]], "1.0.1": [[0, "id182"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationfactor (class in cassandra.metadata)": [[25, "cassandra.metadata.ReplicationFactor"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/3.26.4-scylla/security.html b/3.26.4-scylla/security.html new file mode 100644 index 0000000000..0bb18aaab9 --- /dev/null +++ b/3.26.4-scylla/security.html @@ -0,0 +1,1005 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Security

                +

                The two main security components you will use with the +Python driver are Authentication and SSL.

                +
                +

                Authentication

                +

                Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

                +

                For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

                +
                from cassandra.cluster import Cluster
                +from cassandra.auth import PlainTextAuthProvider
                +
                +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
                +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
                +
                +
                +
                +

                Custom Authenticators

                +

                If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

                +
                +
                +

                Protocol v1 Authentication

                +

                When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

                +
                from cassandra.cluster import Cluster
                +
                +def get_credentials(host_address):
                +    return {'username': 'joe', 'password': '1234'}
                +
                +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
                +
                +
                +
                +
                +
                +

                SSL

                +

                SSL should be used when client encryption is enabled in Cassandra.

                +

                To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

                +

                To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

                +

                If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

                +

                The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

                + +

                It might be also useful to learn about the different levels of identity verification to understand the examples:

                + +
                +

                SSL with Twisted or Eventlet

                +

                Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

                +
                +
                +

                SSL Configuration Examples

                +

                Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

                +
                +

                No identity verification

                +

                No identity verification at all. Note that this is not recommended for for production deployments.

                +

                The Cassandra configuration:

                +
                client_encryption_options:
                +  enabled: true
                +  keystore: /path/to/127.0.0.1.keystore
                +  keystore_password: myStorePass
                +  require_client_auth: false
                +
                +
                +

                The driver configuration:

                +
                from cassandra.cluster import Cluster, Session
                +from ssl import SSLContext, PROTOCOL_TLS
                +
                +ssl_context = SSLContext(PROTOCOL_TLS)
                +
                +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                +session = cluster.connect()
                +
                +
                +
                +
                +

                Client verifies server

                +

                Ensure the python driver verifies the identity of the server.

                +

                The Cassandra configuration:

                +
                client_encryption_options:
                +  enabled: true
                +  keystore: /path/to/127.0.0.1.keystore
                +  keystore_password: myStorePass
                +  require_client_auth: false
                +
                +
                +

                For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

                +
                from cassandra.cluster import Cluster, Session
                +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                +
                +ssl_context = SSLContext(PROTOCOL_TLS)
                +ssl_context.load_verify_locations('/path/to/rootca.crt')
                +ssl_context.verify_mode = CERT_REQUIRED
                +
                +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                +session = cluster.connect()
                +
                +
                +

                Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

                +
                from cassandra.cluster import Cluster, Session
                +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                +
                +ssl_context = SSLContext(PROTOCOL_TLS)
                +ssl_context.load_verify_locations('/path/to/rootca.crt')
                +ssl_context.verify_mode = CERT_REQUIRED
                +ssl_context.check_hostname = True
                +ssl_options = {'server_hostname': '127.0.0.1'}
                +
                +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
                +session = cluster.connect()
                +
                +
                +
                +
                +

                Server verifies client

                +

                If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

                +

                The cassandra configuration:

                +
                client_encryption_options:
                +  enabled: true
                +  keystore: /path/to/127.0.0.1.keystore
                +  keystore_password: myStorePass
                +  require_client_auth: true
                +  truststore: /path/to/dse-truststore.jks
                +  truststore_password: myStorePass
                +
                +
                +

                The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

                +
                cat > gen_client_cert.conf <<EOF
                +[ req ]
                +distinguished_name = req_distinguished_name
                +prompt = no
                +output_password = ${ROOT_CERT_PASS}
                +default_bits = 2048
                +
                +[ req_distinguished_name ]
                +C = ${CERT_COUNTRY}
                +O = ${CERT_ORG_NAME}
                +OU = ${CERT_OU}
                +CN = client
                +EOF
                +
                +
                +

                Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

                +
                openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
                +
                +
                +

                And generate the client signed certificate:

                +
                openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
                +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
                +
                +
                +

                Finally, you can use that configuration with the following driver code:

                +
                from cassandra.cluster import Cluster, Session
                +from ssl import SSLContext, PROTOCOL_TLS
                +
                +ssl_context = SSLContext(PROTOCOL_TLS)
                +ssl_context.load_cert_chain(
                +    certfile='/path/to/client.crt_signed',
                +    keyfile='/path/to/client.key')
                +
                +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                +session = cluster.connect()
                +
                +
                +
                +
                +

                Server verifies client and client verifies server

                +

                See the previous section for examples of Cassandra configuration and preparing +the client certificates.

                +

                The following driver code specifies that the connection should use two-way verification:

                +
                from cassandra.cluster import Cluster, Session
                +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                +
                +ssl_context = SSLContext(PROTOCOL_TLS)
                +ssl_context.load_verify_locations('/path/to/rootca.crt')
                +ssl_context.verify_mode = CERT_REQUIRED
                +ssl_context.load_cert_chain(
                +    certfile='/path/to/client.crt_signed',
                +    keyfile='/path/to/client.key')
                +
                +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                +session = cluster.connect()
                +
                +
                +

                The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

                +

                Server verifies client and client verifies server using Twisted and pyOpenSSL

                +
                from OpenSSL import SSL, crypto
                +from cassandra.cluster import Cluster
                +from cassandra.io.twistedreactor import TwistedConnection
                +
                +ssl_context = SSL.Context(SSL.TLSv1_2_METHOD)
                +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
                +ssl_context.use_certificate_file('/path/to/client.crt_signed')
                +ssl_context.use_privatekey_file('/path/to/client.key')
                +ssl_context.load_verify_locations('/path/to/rootca.crt')
                +
                +cluster = Cluster(
                +    contact_points=['127.0.0.1'],
                +    connection_class=TwistedConnection,
                +    ssl_context=ssl_context,
                +    ssl_options={'check_hostname': True}
                +)
                +session = cluster.connect()
                +
                +
                +

                Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

                +
                +
                +
                +

                Versions 3.16.0 and lower

                +

                To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

                +

                By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLS to match +Cassandra’s default protocol.

                +

                For example:

                +
                from cassandra.cluster import Cluster
                +from ssl import PROTOCOL_TLS, CERT_REQUIRED
                +
                +ssl_opts = {
                +    'ca_certs': '/path/to/my/ca.certs',
                +    'ssl_version': PROTOCOL_TLS,
                +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
                +}
                +cluster = Cluster(ssl_options=ssl_opts)
                +
                +
                +

                This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

                +
                +

                SSL with Twisted

                +

                In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

                +
                +
                +
                +
                +

                DSE Authentication

                +

                When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

                +
                from cassandra.auth import DSEGSSAPIAuthProvider
                +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
                +cluster = Cluster(auth_provider=auth_provider)
                +session = cluster.connect()
                +
                +
                +

                Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

                +
                +

                DSE Unified Authentication

                +

                With DSE (>=5.1), unified Authentication allows you to:

                +
                  +
                • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

                • +
                • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

                • +
                +
                +

                Proxy Login

                +

                Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

                +
                GRANT PROXY.LOGIN on role user1 to server
                +
                +
                +

                then you can do the proxy authentication….

                +
                from cassandra.cluster import Cluster
                +from cassandra.auth import SaslAuthProvider
                +
                +sasl_kwargs = {
                +  "service": 'dse',
                +  "mechanism":"PLAIN",
                +  "username": 'server',
                +  'password': 'server',
                +  'authorization_id': 'user1'
                +}
                +
                +auth_provider = SaslAuthProvider(**sasl_kwargs)
                +c = Cluster(auth_provider=auth_provider)
                +s = c.connect()
                +s.execute(...)  # all requests will be executed as 'user1'
                +
                +
                +

                If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

                +
                from cassandra.cluster import Cluster
                +from cassandra.auth import DSEGSSAPIAuthProvider
                +
                +# Ensure the kerberos ticket of the server user is set with the kinit utility.
                +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
                +                                      authorization_id='user1@DATASTAX.COM')
                +c = Cluster(auth_provider=auth_provider)
                +s = c.connect()
                +s.execute(...)  # all requests will be executed as 'user1'
                +
                +
                +
                +
                +

                Proxy Execute

                +

                Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

                +
                GRANT PROXY.EXECUTE on role user1 to server
                +
                +
                +

                then you can do a proxy execute…

                +
                from cassandra.cluster import Cluster
                +from cassandra.auth import DSEPlainTextAuthProvider,
                +
                +auth_provider = DSEPlainTextAuthProvider('server', 'server')
                +
                +c = Cluster(auth_provider=auth_provider)
                +s = c.connect()
                +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
                +
                +
                +

                Please see the official documentation for more details on the feature and configuration process.

                +
                +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/sitemap.xml b/3.26.4-scylla/sitemap.xml new file mode 100644 index 0000000000..5ad2b2c298 --- /dev/null +++ b/3.26.4-scylla/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-specific.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade-guide.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/dates-and-times.htmlhttps://python-driver.docs.scylladb.com/stable/execution-profiles.htmlhttps://python-driver.docs.scylladb.com/stable/user-defined-types.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/getting-started.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third-party.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/object-mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query-paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-cloud-serverless.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/3.26.4-scylla/upgrading.html b/3.26.4-scylla/upgrading.html new file mode 100644 index 0000000000..98f61c8e61 --- /dev/null +++ b/3.26.4-scylla/upgrading.html @@ -0,0 +1,994 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                Upgrading

                +
                +
                +
                +

                Installation

                +

                Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

                +
                pip install scylla-driver
                +
                +
                +

                If you need the Graph Fluent API (features provided by dse-graph):

                +
                pip install scylla-driver[graph]
                +
                +
                +

                See Installation for more details.

                +
                +
                +

                Import from the cassandra module

                +

                There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

                +
                from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
                +from dse.auth import PlainTextAuthProvider
                +from dse.policies import WhiteListRoundRobinPolicy
                +
                +# becomes
                +
                +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
                +from cassandra.auth import PlainTextAuthProvider
                +from cassandra.policies import WhiteListRoundRobinPolicy
                +
                +
                +

                Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

                +
                +
                +

                dse-graph

                +

                dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

                +
                from dse_graph import ..
                +from dse_graph.query import ..
                +
                +# becomes
                +
                +from cassandra.datastax.graph.fluent import ..
                +from cassandra.datastax.graph.fluent.query import ..
                +
                +
                +

                See fluent.

                +
                +
                +

                Session.execute and Session.execute_async API

                +

                Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

                +

                See Session.execute().

                +
                +
                +

                Deprecations

                +

                These changes are optional, but recommended:

                +
                  +
                • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

                • +
                • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

                • +
                +
                +

                Upgrading to 3.0

                +

                Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

                +
                +
                +
                +

                Default consistency is now LOCAL_ONE

                +

                Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

                +
                +
                +

                Execution API Updates

                +
                +

                Result return normalization

                +

                PYTHON-368

                +

                Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

                +

                Now, all results are returned as an iterable ResultSet.

                +

                The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

                +
                results = session.execute("SELECT * FROM system.local")
                +for row in results:
                +    process(row)
                +
                +
                +

                If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

                +
                results = session.execute("SELECT * FROM system.local")
                +row_list = list(results)
                +
                +
                +

                For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

                +
                results = session.execute("SELECT * FROM system.local")
                +first_result = results[0]  # materializes results, fetching all pages
                +
                +
                +

                This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

                +
                +
                +

                Trace information is not attached to executed Statements

                +

                PYTHON-318

                +

                Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

                +

                Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

                +

                ResponseFuture.get_query_trace()

                +

                ResponseFuture.get_all_query_traces()

                +

                ResultSet.get_query_trace()

                +

                ResultSet.get_all_query_traces()

                +
                +
                +

                Binding named parameters now ignores extra names

                +

                PYTHON-178

                +

                Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

                +

                Behavior in 3.0+ is to ignore extra names.

                +
                +
                +
                +

                blist removed as soft dependency

                +

                PYTHON-385

                +

                Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

                +

                Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

                +
                +
                +

                Metadata API Updates

                +

                PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

                +

                Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

                +

                The present API is documented: cassandra.metadata. Changes highlighted below:

                +
                  +
                • All types are now exposed as CQL types instead of types derived from the internal server implementation

                • +
                • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

                • +
                • Some metadata attributes removed

                  +
                    +
                  • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

                  • +
                  • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

                  • +
                  +
                • +
                +
                +
                +

                Several deprecated features are removed

                +

                PYTHON-292

                +
                  +
                • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

                • +
                • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

                • +
                • Cluster.submit_schema_refresh removed (574266d)

                • +
                • cqltypes time/date functions removed, use util entry points instead (bb984ee)

                • +
                • decoder module removed (e16a073)

                • +
                • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

                • +
                • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

                • +
                • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

                • +
                • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

                • +
                • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

                • +
                • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

                • +
                +
                +

                Upgrading to 2.1 from 2.0

                +

                Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

                +

                Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

                +
                +
                +
                +

                Using the v3 Native Protocol

                +

                By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster(protocol_version=3)
                +
                +
                +

                Note that protocol version 3 is only supported by Cassandra 2.1+.

                +

                In future releases, the driver may default to using protocol version +3.

                +
                +
                +

                Working with User-Defined Types

                +

                Cassandra 2.1 introduced the ability to define new types:

                +
                USE KEYSPACE mykeyspace;
                +
                +CREATE TYPE address (street text, city text, zip int);
                +
                +
                +

                The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

                +
                cluster = Cluster()
                +
                +class Address(object):
                +
                +    def __init__(self, street, city, zipcode):
                +        self.street = street
                +        self.city = text
                +        self.zipcode = zipcode
                +
                +cluster.register_user_type('mykeyspace', 'address', Address)
                +
                +
                +

                When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

                +

                If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

                +

                See User Defined Types for more details.

                +
                +
                +

                Customizing Encoders for Non-prepared Statements

                +

                Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

                +
                cluster = Cluster()
                +session = cluster.connect()
                +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
                +
                +
                +

                See Type Conversions for the table of default CQL literal conversions.

                +
                +
                +

                Using Client-Side Protocol-Level Timestamps

                +

                With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

                +

                When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

                +
                +

                Upgrading to 2.0 from 1.x

                +

                Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

                +
                +
                +
                +

                Using the v2 Native Protocol

                +

                By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster(protocol_version=2)
                +
                +
                +

                When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

                +
                from cassandra.cluster import Cluster
                +
                +cluster = Cluster(protocol_version=1)
                +
                +
                +
                +
                +

                Automatic Query Paging

                +

                Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

                +

                See Paging Large Queries for full details.

                +
                +
                +

                Protocol-Level Batch Statements

                +

                With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

                +

                See BatchStatement for details and usage examples.

                +
                +
                +

                SASL-based Authentication

                +

                Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

                +
                +
                +

                Lightweight Transactions

                +

                Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

                +
                +
                +

                Calling Cluster.shutdown()

                +

                In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

                +
                +
                +

                Deprecations

                +

                The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

                + +
                +
                +

                Dependency Changes

                +

                The following dependencies have officially been made optional:

                +
                  +
                • scales

                • +
                • blist

                • +
                +

                And one new dependency has been added (to enable Python 3 support):

                +
                  +
                • six

                • +
                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/3.26.4-scylla/user-defined-types.html b/3.26.4-scylla/user-defined-types.html new file mode 100644 index 0000000000..f2803292ef --- /dev/null +++ b/3.26.4-scylla/user-defined-types.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + + + +
                + +
                + +
                +

                User Defined Types

                +

                Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

                +
                CREATE TYPE address (street text, zip int);
                +
                +
                +

                Version 2.1 of the Python driver adds support for user-defined types.

                +
                +

                Registering a UDT

                +

                You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

                +
                +

                Map a Class to a UDT

                +
                cluster = Cluster(protocol_version=3)
                +session = cluster.connect()
                +session.set_keyspace('mykeyspace')
                +session.execute("CREATE TYPE address (street text, zipcode int)")
                +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                +
                +# create a class to map to the "address" UDT
                +class Address(object):
                +
                +    def __init__(self, street, zipcode):
                +        self.street = street
                +        self.zipcode = zipcode
                +
                +cluster.register_user_type('mykeyspace', 'address', Address)
                +
                +# insert a row using an instance of Address
                +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
                +                (0, Address("123 Main St.", 78723)))
                +
                +# results will include Address instances
                +results = session.execute("SELECT * FROM users")
                +row = results[0]
                +print(row.id, row.location.street, row.location.zipcode)
                +
                +
                +
                +
                +

                Map a dict to a UDT

                +
                cluster = Cluster(protocol_version=3)
                +session = cluster.connect()
                +session.set_keyspace('mykeyspace')
                +session.execute("CREATE TYPE address (street text, zipcode int)")
                +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                +
                +cluster.register_user_type('mykeyspace', 'address', dict)
                +
                +# insert a row using a prepared statement and a tuple
                +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
                +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
                +
                +# results will include dict instances
                +results = session.execute("SELECT * FROM users")
                +row = results[0]
                +print(row.id, row.location['street'], row.location['zipcode'])
                +
                +
                +
                +
                +
                +

                Using UDTs Without Registering Them

                +

                Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

                +

                When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

                +
                cluster = Cluster(protocol_version=3)
                +session = cluster.connect()
                +session.set_keyspace('mykeyspace')
                +session.execute("CREATE TYPE address (street text, zipcode int)")
                +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                +
                +class Foo(object):
                +
                +    def __init__(self, street, zipcode, otherstuff):
                +        self.street = street
                +        self.zipcode = zipcode
                +        self.otherstuff = otherstuff
                +
                +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
                +
                +# since we're using a prepared statement, we don't *have* to register
                +# a class to map to the UDT to insert data.  The object just needs to have
                +# "street" and "zipcode" attributes (which Foo does):
                +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
                +
                +# when we query data, UDT columns that don't have a class registered
                +# will be returned as namedtuples:
                +results = session.execute("SELECT * FROM users")
                +first_row = results[0]
                +address = first_row.location
                +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
                +street = address.street
                +zipcode = address.street
                +
                +
                +

                As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

                +

                * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

                +
                +
                + + +
                + + + + + + +
                +

                +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                +
                +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                +

                404

                +

                The ScyllaDB monster ate your page!

                +

                + Home +

                +
                + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_static/copybutton.css b/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                Short

                + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/css/main.css b/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000000..52b149be9b --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.26.4', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/img/banner-background.svg b/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/favicon-228x228.png b/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/_static/img/favicon-228x228.png differ diff --git a/_static/img/favicon-32x32.png b/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/_static/img/favicon-32x32.png differ diff --git a/_static/img/favicon.ico b/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/_static/img/favicon.ico differ diff --git a/_static/img/icons/icon-about-team.svg b/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/_static/img/icons/icon-about-us-m.svg b/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-about-us.svg b/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-alternator.svg b/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-apps.svg b/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-architecture.svg b/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/_static/img/icons/icon-benchmarks.svg b/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/_static/img/icons/icon-blog.svg b/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/_static/img/icons/icon-careers.svg b/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/_static/img/icons/icon-chevron-left.svg b/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-chevron-right.svg b/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-circe.svg b/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-clock.svg b/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-close.svg b/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_static/img/icons/icon-cloud-docs.svg b/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-cloud.svg b/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-comparison.svg b/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/_static/img/icons/icon-contact-us.svg b/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/_static/img/icons/icon-developers-blog.svg b/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/_static/img/icons/icon-docs.svg b/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/_static/img/icons/icon-enterprise-m.svg b/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/icons/icon-enterprise.svg b/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-events.svg b/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/_static/img/icons/icon-exclamation.svg b/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/icons/icon-expand.svg b/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/_static/img/icons/icon-forum.svg b/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-getting-started.svg b/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-glossary.svg b/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-home.svg b/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-infoworld.svg b/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/_static/img/icons/icon-integrations.svg b/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-knowledge-base.svg b/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-less.svg b/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_static/img/icons/icon-live-test.svg b/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/_static/img/icons/icon-mail-list.svg b/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-manager.svg b/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/_static/img/icons/icon-memory-management.svg b/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/_static/img/icons/icon-modeling.svg b/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-monitoring.svg b/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/_static/img/icons/icon-networking.svg b/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/_static/img/icons/icon-news.svg b/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/_static/img/icons/icon-newsletter.svg b/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/_static/img/icons/icon-nsql-guides.svg b/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/_static/img/icons/icon-open-source.svg b/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/_static/img/icons/icon-operator.svg b/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-overview.svg b/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/_static/img/icons/icon-partners.svg b/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/_static/img/icons/icon-plus.svg b/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_static/img/icons/icon-pricing.svg b/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/_static/img/icons/icon-release-notes.svg b/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/_static/img/icons/icon-resource-center.svg b/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/_static/img/icons/icon-roadmap.svg b/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/_static/img/icons/icon-search.svg b/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/img/icons/icon-slack.svg b/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-stack-overflow.svg b/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/img/icons/icon-summit.svg b/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-support.svg b/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/_static/img/icons/icon-tech-talks.svg b/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/_static/img/icons/icon-testing.svg b/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/_static/img/icons/icon-thumbs-down.svg b/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-thumbs-up.svg b/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-tip.svg b/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_static/img/icons/icon-training.svg b/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/_static/img/icons/icon-triangle-down.svg b/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-university.svg b/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/_static/img/icons/icon-users-blog.svg b/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/_static/img/icons/icon-warning.svg b/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/icons/icon-webinars.svg b/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/_static/img/icons/icon-whitepapers.svg b/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/_static/img/icons/icon-workshop.svg b/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/_static/img/logo-docs.svg b/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/logo-scylla-horizontal-RGB.svg b/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/mascots/404.jpg b/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/_static/img/mascots/404.jpg differ diff --git a/_static/img/mascots/scylla-3monsters.png b/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/_static/img/mascots/scylla-3monsters.png differ diff --git a/_static/img/mascots/scylla-advisor-crystal.png b/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/_static/img/mascots/scylla-alternator.svg b/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/_static/img/mascots/scylla-cloud.svg b/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/_static/img/mascots/scylla-computer-3-monsters.png b/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/_static/img/mascots/scylla-computer-headset.png b/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/_static/img/mascots/scylla-computer-headset.png differ diff --git a/_static/img/mascots/scylla-cup-number-one.png b/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/_static/img/mascots/scylla-docs.svg b/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/_static/img/mascots/scylla-drivers.svg b/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/_static/img/mascots/scylla-enterprise.svg b/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/_static/img/mascots/scylla-forklift-boxes.png b/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/_static/img/mascots/scylla-forklift-migration.png b/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/_static/img/mascots/scylla-gear.png b/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/_static/img/mascots/scylla-gear.png differ diff --git a/_static/img/mascots/scylla-hardhat.png b/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/_static/img/mascots/scylla-hardhat.png differ diff --git a/_static/img/mascots/scylla-headband.png b/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/_static/img/mascots/scylla-headband.png differ diff --git a/_static/img/mascots/scylla-headset.png b/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/_static/img/mascots/scylla-headset.png differ diff --git a/_static/img/mascots/scylla-hearts.png b/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/_static/img/mascots/scylla-hearts.png differ diff --git a/_static/img/mascots/scylla-looking-down.png b/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/_static/img/mascots/scylla-looking-down.png differ diff --git a/_static/img/mascots/scylla-looking-up.png b/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/_static/img/mascots/scylla-looking-up.png differ diff --git a/_static/img/mascots/scylla-magnifying-glass-fronting.png b/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/_static/img/mascots/scylla-magnifying-glass.png b/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/_static/img/mascots/scylla-manager.svg b/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/_static/img/mascots/scylla-monitor.svg b/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/_static/img/mascots/scylla-movement-fast.png b/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/_static/img/mascots/scylla-movement-fast.png differ diff --git a/_static/img/mascots/scylla-movement.png b/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/_static/img/mascots/scylla-movement.png differ diff --git a/_static/img/mascots/scylla-onpremise.png b/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/_static/img/mascots/scylla-onpremise.png differ diff --git a/_static/img/mascots/scylla-opensource.svg b/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/_static/img/mascots/scylla-operator.svg b/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/_static/img/mascots/scylla-plugin.png b/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/_static/img/mascots/scylla-plugin.png differ diff --git a/_static/img/mascots/scylla-release-mascot.png b/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/_static/img/mascots/scylla-release-mascot.png differ diff --git a/_static/img/mascots/scylla-repair.png b/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/_static/img/mascots/scylla-repair.png differ diff --git a/_static/img/mascots/scylla-server.png b/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/_static/img/mascots/scylla-server.png differ diff --git a/_static/img/mascots/scylla-sleeping.png b/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/_static/img/mascots/scylla-sleeping.png differ diff --git a/_static/img/mascots/scylla-tall-measure.png b/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/_static/img/mascots/scylla-tall-measure.png differ diff --git a/_static/img/mascots/scylla-university.png b/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/_static/img/mascots/scylla-university.png differ diff --git a/_static/img/mascots/scylla-weights.png b/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/_static/img/mascots/scylla-weights.png differ diff --git a/_static/img/mascots/scylla-window-cleaning.png b/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/_static/img/mascots/scylla-with-computer-2.png b/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/_static/img/mascots/scylla-with-computer.png b/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/_static/img/mascots/scylla-with-computer.png differ diff --git a/_static/img/mascots/scylla-with-linux.png b/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/_static/img/mascots/scylla-with-linux.png differ diff --git a/_static/img/mascots/scylla-writting.png b/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/_static/img/mascots/scylla-writting.png differ diff --git a/_static/img/menu.svg b/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/js/main.bundle.js b/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
              • Back
              • ',backButtonPosition:"top",wrapper:"
                ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                  "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                  ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                  ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                  ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                  ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                  "],col:[2,"","
                  "],tr:[2,"","
                  "],td:[3,"","
                  "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  CHANGELOG

                  +
                  +

                  3.26.0

                  +

                  March 13, 2023

                  +
                  +

                  Features

                  +
                    +
                  • Add support for execution profiles in execute_concurrent (PR 1122)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Handle empty non-final result pages (PR 1110)

                  • +
                  • Do not re-use stream IDs for in-flight requests (PR 1114)

                  • +
                  • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

                  • +
                  +
                  +
                  +

                  Others

                  +
                    +
                  • Fix deprecation warning in query tracing (PR 1103)

                  • +
                  • Remove mutable default values from some tests (PR 1116)

                  • +
                  • Remove dependency on unittest2 (PYTHON-1289)

                  • +
                  • Fix deprecation warnings for asyncio.coroutine annotation in asyncioreactor (PYTTHON-1290)

                  • +
                  • Fix typos in source files (PR 1126)

                  • +
                  • HostFilterPolicyInitTest fix for Python 3.11 (PR 1131)

                  • +
                  • Fix for DontPrepareOnIgnoredHostsTest (PYTHON-1287)

                  • +
                  • tests.integration.simulacron.test_connection failures (PYTHON-1304)

                  • +
                  • tests.integration.standard.test_single_interface.py appears to be failing for C* 4.0 (PYTHON-1329)

                  • +
                  • Authentication tests appear to be failing fraudulently (PYTHON-1328)

                  • +
                  • PreparedStatementTests.test_fail_if_different_query_id_on_reprepare() failing unexpectedly (PTYHON-1327)

                  • +
                  • Refactor deprecated unittest aliases for Python 3.11 compatibility (PR 1112)

                  • +
                  +
                  +
                  +

                  Deprecations

                  +
                    +
                  • This release removes support for Python 2.7.x as well as Python 3.5.x and 3.6.x

                  • +
                  +
                  +
                  +
                  +

                  3.25.0

                  +

                  March 18, 2021

                  +
                  +

                  Features

                  +
                    +
                  • Ensure the driver can connect when invalid peer hosts are in system.peers (PYTHON-1260)

                  • +
                  • Implement protocol v5 checksumming (PYTHON-1258)

                  • +
                  • Fix the default cqlengine connection mechanism to work with Astra (PYTHON-1265)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

                  • +
                  • Update list of reserved keywords (PYTHON-1269)

                  • +
                  +
                  +
                  +

                  Others

                  +
                    +
                  • Drop Python 3.4 support (PYTHON-1220)

                  • +
                  • Update security documentation and examples to use PROTOCOL_TLS (PYTHON-1264)

                  • +
                  +
                  +
                  +
                  +

                  3.24.0

                  +

                  June 18, 2020

                  +
                  +

                  Features

                  +
                    +
                  • Make geomet an optional dependency at runtime (PYTHON-1237)

                  • +
                  • Add use_default_tempdir cloud config options (PYTHON-1245)

                  • +
                  • Tcp flow control for libevreactor (PYTHON-1248)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Unable to connect to a cloud cluster using Ubuntu 20.04 (PYTHON-1238)

                  • +
                  • PlainTextAuthProvider fails with unicode chars and Python3 (PYTHON-1241)

                  • +
                  • [GRAPH] Graph execution profiles consistency level are not set to LOCAL_QUORUM with a cloud cluster (PYTHON-1240)

                  • +
                  • [GRAPH] Can’t write data in a Boolean field using the Fluent API (PYTHON-1239)

                  • +
                  • [GRAPH] Fix elementMap() result deserialization (PYTHON-1233)

                  • +
                  +
                  +
                  +

                  Others

                  +
                    +
                  • Bump geomet dependency version to 0.2 (PYTHON-1243)

                  • +
                  • Bump gremlinpython dependency version to 3.4.6 (PYTHON-1212)

                  • +
                  • Improve fluent graph documentation for core graphs (PYTHON-1244)

                  • +
                  +
                  +
                  +
                  +

                  3.23.0

                  +

                  April 6, 2020

                  +
                  +

                  Features

                  +
                    +
                  • Transient Replication Support (PYTHON-1207)

                  • +
                  • Support system.peers_v2 and port discovery for C* 4.0 (PYTHON-700)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Asyncore logging exception on shutdown (PYTHON-1228)

                  • +
                  +
                  +
                  +
                  +

                  3.22.0

                  +

                  February 26, 2020

                  +
                  +

                  Features

                  +
                    +
                  • Add all() function to the ResultSet API (PYTHON-1203)

                  • +
                  • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

                  • +
                  • Add GraphSON3 support (PYTHON-788)

                  • +
                  • Use GraphSON3 as default for Native graphs (PYTHON-1004)

                  • +
                  • Add Tuple and UDT types for native graph (PYTHON-1005)

                  • +
                  • Add Duration type for native graph (PYTHON-1000)

                  • +
                  • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

                  • +
                  • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

                  • +
                  • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

                  • +
                  • Resolve the row_factory automatically for native graphs (PYTHON-1056)

                  • +
                  • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

                  • +
                  • Add g:BulkSet graph deserializers (PYTHON-1060)

                  • +
                  • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

                  • +
                  • Update Native to Core Graph Engine

                  • +
                  • Add graphson3 and native graph support (PYTHON-1039)

                  • +
                  • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

                  • +
                  • Expose filter predicates for cql collections (PYTHON-1019)

                  • +
                  • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

                  • +
                  • Make graph metadata handling more robust (PYTHON-1204)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

                  • +
                  +
                  +
                  +
                  +

                  3.21.0

                  +

                  January 15, 2020

                  +
                  +

                  Features

                  +
                    +
                  • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

                  • +
                  • Add Python 3.8 support (PYTHON-1189)

                  • +
                  • Allow passing ssl context for Twisted (PYTHON-1161)

                  • +
                  • Ssl context and cloud support for Eventlet (PYTHON-1162)

                  • +
                  • Cloud Twisted support (PYTHON-1163)

                  • +
                  • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

                  • +
                  • Flexible version parsing (PYTHON-1174)

                  • +
                  • Support NULL in collection deserializer (PYTHON-1123)

                  • +
                  • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

                  • +
                  • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

                  • +
                  • asyncio message chunks can be processed discontinuously (PYTHON-1185)

                  • +
                  • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

                  • +
                  • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

                  • +
                  • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

                  • +
                  • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

                  • +
                  +
                  +
                  +

                  Others

                  +
                    +
                  • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

                  • +
                  • Remove *read_repair_chance table options (PYTHON-1140)

                  • +
                  • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

                  • +
                  • Add new DSE CQL keywords (PYTHON-1122)

                  • +
                  • Publish binary wheel distributions (PYTHON-1013)

                  • +
                  +
                  +
                  +

                  Deprecations

                  +
                    +
                  • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

                  • +
                  +

                  Merged from dse-driver:

                  +
                  +
                  +

                  Features

                  +
                    +
                  • Insights integration (PYTHON-1047)

                  • +
                  • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

                  • +
                  • Add NodeSync metadata (PYTHON-799)

                  • +
                  • Add new NodeSync failure values (PYTHON-934)

                  • +
                  • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

                  • +
                  • GraphOptions should show a warning for unknown parameters (PYTHON-819)

                  • +
                  • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

                  • +
                  • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

                  • +
                  • Add graph-results payload option for GraphSON format (PYTHON-773)

                  • +
                  • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

                  • +
                  • Implement serializers for the Graph String API (PYTHON-778)

                  • +
                  • Provide deserializers for GraphSON types (PYTHON-782)

                  • +
                  • Add Graph DurationType support (PYTHON-607)

                  • +
                  • Support DSE DateRange type (PYTHON-668)

                  • +
                  • RLAC CQL output for materialized views (PYTHON-682)

                  • +
                  • Add Geom Types wkt deserializer

                  • +
                  • DSE Graph Client timeouts in custom payload (PYTHON-589)

                  • +
                  • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

                  • +
                  • Add config profiles to DSE graph execution (PYTHON-570)

                  • +
                  • DSE Driver version checking (PYTHON-568)

                  • +
                  • Distinct default timeout for graph queries (PYTHON-477)

                  • +
                  • Graph result parsing for known types (PYTHON-479,487)

                  • +
                  • Distinct read/write CL for graph execution (PYTHON-509)

                  • +
                  • Target graph analytics query to spark master when available (PYTHON-510)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

                  • +
                  • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

                  • +
                  • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

                  • +
                  • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

                  • +
                  • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

                  • +
                  • Update date serialization to isoformat in graph (PYTHON-805)

                  • +
                  • DateRange Parse Error (PYTHON-729)

                  • +
                  • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

                  • +
                  • metadata.get_host returning None unexpectedly (PYTHON-709)

                  • +
                  • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

                  • +
                  • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

                  • +
                  • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

                  • +
                  • Correctly handle other types in geo type equality (PYTHON-508)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Add tests around cqlengine and continuous paging (PYTHON-872)

                  • +
                  • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

                  • +
                  • Write documentation examples for DSE 2.0 features (PYTHON-732)

                  • +
                  • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

                  • +
                  +
                  +
                  +
                  +

                  3.20.2

                  +

                  November 19, 2019

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix import error for old python installation without SSLContext (PYTHON-1183)

                  • +
                  +
                  +
                  +
                  +

                  3.20.1

                  +

                  November 6, 2019

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

                  • +
                  +
                  +
                  +
                  +

                  3.20.0

                  +

                  October 28, 2019

                  +
                  +

                  Features

                  +
                    +
                  • DataStax Astra Support (PYTHON-1074)

                  • +
                  • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

                  • +
                  • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

                  • +
                  • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

                  • +
                  +
                  +
                  +
                  +

                  3.19.0

                  +

                  August 26, 2019

                  +
                  +

                  Features

                  +
                    +
                  • Add Python 3.7 support (PYTHON-1016)

                  • +
                  • Future-proof Mapping imports (PYTHON-1023)

                  • +
                  • Include param values in cqlengine logging (PYTHON-1105)

                  • +
                  • NTS Token Replica Map Generation is slow (PYTHON-622)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

                  • +
                  • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

                  • +
                  • Fix incorrect metadata for compact counter tables (PYTHON-1100)

                  • +
                  • Call ConnectionException with correct kwargs (PYTHON-1117)

                  • +
                  • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

                  • +
                  • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

                  • +
                  • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

                  • +
                  • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

                  • +
                  +
                  +
                  +
                  +

                  3.18.0

                  +

                  May 27, 2019

                  +
                  +

                  Features

                  +
                    +
                  • Abstract Host Connection information (PYTHON-1079)

                  • +
                  • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

                  • +
                  • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

                  • +
                  • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

                  • +
                  • Accept legacy empty strings as column names (PYTHON-1082)

                  • +
                  • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

                  • +
                  +
                  +
                  +
                  +

                  3.17.1

                  +

                  May 2, 2019

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

                  • +
                  +
                  +
                  +
                  +

                  3.17.0

                  +

                  February 19, 2019

                  +
                  +

                  Features

                  +
                    +
                  • Send driver name and version in startup message (PYTHON-1068)

                  • +
                  • Add Cluster ssl_context option to enable SSL (PYTHON-995)

                  • +
                  • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

                  • +
                  • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

                  • +
                  • Add Session.get_execution_profile (PYTHON-932)

                  • +
                  • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

                  • +
                  • Serial consistency level is not used (PYTHON-1007)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Fail faster on incorrect lz4 import (PYTHON-1042)

                  • +
                  • Bump Cython dependency version to 0.29 (PYTHON-1036)

                  • +
                  • Expand Driver SSL Documentation (PYTHON-740)

                  • +
                  +
                  +
                  +

                  Deprecations

                  +
                    +
                  • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

                  • +
                  • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

                  • +
                  +
                  +
                  +
                  +

                  3.16.0

                  +

                  November 12, 2018

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

                  • +
                  • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

                  • +
                  • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

                  • +
                  • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

                  • +
                  • Log profile name on attempt to create existing profile (PYTHON-944)

                  • +
                  • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

                  • +
                  • Fix wrong use of ResultSet indexing (PYTHON-1015)

                  • +
                  +
                  +
                  +
                  +

                  3.15.1

                  +

                  September 6, 2018

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

                  • +
                  +
                  +
                  +
                  +

                  3.15.0

                  +

                  August 30, 2018

                  +
                  +

                  Features

                  +
                    +
                  • Parse Virtual Keyspace Metadata (PYTHON-992)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

                  • +
                  • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

                  • +
                  • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

                  • +
                  • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Use global variable for libev loops so it can be subclassed (PYTHON-973)

                  • +
                  • Update SchemaParser for V4 (PYTHON-1006)

                  • +
                  • Bump Cython dependency version to 0.28 (PYTHON-1012)

                  • +
                  +
                  +
                  +
                  +

                  3.14.0

                  +

                  April 17, 2018

                  +
                  +

                  Features

                  +
                    +
                  • Add one() function to the ResultSet API (PYTHON-947)

                  • +
                  • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

                  • +
                  • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

                  • +
                  • Twisted SSL Support (PYTHON-343)

                  • +
                  • Support IS NOT NULL operator in cqlengine (PYTHON-968)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Fix Broken Links in Docs (PYTHON-916)

                  • +
                  • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

                  • +
                  • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

                  • +
                  • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

                  • +
                  • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

                  • +
                  • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

                  • +
                  • Add DSE smoke test to OSS driver tests (PYTHON-894)

                  • +
                  • Document long compilation times and workarounds (PYTHON-868)

                  • +
                  • Improve error for batch WriteTimeouts (PYTHON-941)

                  • +
                  • Deprecate ResultSet indexing (PYTHON-945)

                  • +
                  +
                  +
                  +
                  +

                  3.13.0

                  +

                  January 30, 2018

                  +
                  +

                  Features

                  +
                    +
                  • cqlengine: LIKE filter operator (PYTHON-512)

                  • +
                  • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

                  • +
                  • Support retry_policy in PreparedStatement (PYTHON-861)

                  • +
                  • __del__ method in Session is throwing an exception (PYTHON-813)

                  • +
                  • LZ4 import issue with recent versions (PYTHON-897)

                  • +
                  • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

                  • +
                  • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

                  • +
                  • Fix DeprecationWarning of log.warn (PYTHON-846)

                  • +
                  • Fix example_mapper.py for python3 (PYTHON-860)

                  • +
                  • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

                  • +
                  • Add some known deprecated warnings for 4.x (PYTHON-877)

                  • +
                  • Remove copyright dates from copyright notices (PYTHON-863)

                  • +
                  • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

                  • +
                  • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

                  • +
                  • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

                  • +
                  • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

                  • +
                  +
                  +
                  +
                  +

                  3.12.0

                  +

                  November 6, 2017

                  +
                  +

                  Features

                  +
                    +
                  • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

                  • +
                  • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

                  • +
                  • WriteType.CDC and VIEW missing (PYTHON-794)

                  • +
                  • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

                  • +
                  • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

                  • +
                  • Include hash of result set metadata in prepared stmt id (PYTHON-808)

                  • +
                  • Add NO_COMPACT startup option (PYTHON-839)

                  • +
                  • Add new exception type for CDC (PYTHON-837)

                  • +
                  • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

                  • +
                  • Add asyncio reactor (PYTHON-507)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

                  • +
                  • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

                  • +
                  • Not create two sessions by default in CQLEngine (PYTHON-814)

                  • +
                  • Bug when subclassing AyncoreConnection (PYTHON-827)

                  • +
                  • Error at cleanup when closing the asyncore connections (PYTHON-829)

                  • +
                  • Fix sites where sessions can change during iteration (PYTHON-793)

                  • +
                  • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

                  • +
                  • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

                  • +
                  • Dont set the session keyspace when preparing statements (PYTHON-843)

                  • +
                  • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

                  • +
                  • Bump Cython dependency version to 0.27 (PYTHON-833)

                  • +
                  +
                  +
                  +
                  +

                  3.11.0

                  +

                  July 24, 2017

                  +
                  +

                  Features

                  +
                    +
                  • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

                  • +
                  • Add HostFilterPolicy (PYTHON-761)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

                  • +
                  • Fix asyncore hang on exit (PYTHON-767)

                  • +
                  • Driver takes several minutes to remove a bad host from session (PYTHON-762)

                  • +
                  • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

                  • +
                  • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

                  • +
                  • request_ids may not be returned to the pool (PYTHON-739)

                  • +
                  • Fix murmur3 on big-endian systems (PYTHON-653)

                  • +
                  • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

                  • +
                  • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Bump Cython dependency version to 0.25.2 (PYTHON-754)

                  • +
                  • Fix DeprecationWarning when using lz4 (PYTHON-769)

                  • +
                  • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

                  • +
                  • Improve upgrade guide for materializing pages (PYTHON-464)

                  • +
                  • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

                  • +
                  • Point to DSA Slack, not IRC, in docs index

                  • +
                  +
                  +
                  +
                  +

                  3.10.0

                  +

                  May 24, 2017

                  +
                  +

                  Features

                  +
                    +
                  • Add Duration type to cqlengine (PYTHON-750)

                  • +
                  • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

                  • +
                  • get_query_trace() contract is ambiguous (PYTHON-196)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Queries using speculative execution policy timeout prematurely (PYTHON-755)

                  • +
                  • Fix map where results are not consumed (PYTHON-749)

                  • +
                  • Driver fails to encode Duration’s with large values (PYTHON-747)

                  • +
                  • UDT values are not updated correctly in CQLEngine (PYTHON-743)

                  • +
                  • UDT types are not validated in CQLEngine (PYTHON-742)

                  • +
                  • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

                  • +
                  • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

                  • +
                  • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

                  • +
                  • Memory grows and doesn’t get removed (PYTHON-720)

                  • +
                  • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

                  • +
                  • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

                  • +
                  • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Update README (PYTHON-746)

                  • +
                  • Test python versions 3.5 and 3.6 (PYTHON-737)

                  • +
                  • Docs Warning About Prepare select * (PYTHON-626)

                  • +
                  • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

                  • +
                  • Example SSL connection code does not verify server certificates (PYTHON-469)

                  • +
                  +
                  +
                  +
                  +

                  3.9.0

                  +
                  +

                  Features

                  +
                    +
                  • cqlengine: remove elements by key from a map (PYTHON-688)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • improve error handling when connecting to non-existent keyspace (PYTHON-665)

                  • +
                  • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

                  • +
                  • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

                  • +
                  • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

                  • +
                  • race where callback or errback for request may not be called (PYTHON-733)

                  • +
                  • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

                  • +
                  • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Connection not closed in example_mapper (PYTHON-723)

                  • +
                  • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

                  • +
                  +
                  +
                  +
                  +

                  3.8.1

                  +

                  March 16, 2017

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

                  • +
                  • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

                  • +
                  • Fix DecimalType regression (PYTHON-724)

                  • +
                  +
                  +
                  +
                  +

                  3.8.0

                  +
                  +

                  Features

                  +
                    +
                  • Quote index names in metadata CQL generation (PYTHON-616)

                  • +
                  • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

                  • +
                  • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

                  • +
                  • Added cql types to result set (PYTHON-648)

                  • +
                  • Add __len__ to BatchStatement (PYTHON-650)

                  • +
                  • Duration Type for Cassandra (PYTHON-655)

                  • +
                  • Send flags with PREPARE message in v5 (PYTHON-684)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

                  • +
                  • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

                  • +
                  • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

                  • +
                  • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

                  • +
                  • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

                  • +
                  • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

                  • +
                  • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

                  • +
                  • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

                  • +
                  • Make client timestamps strictly monotonic (PYTHON-676)

                  • +
                  • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Create a cqlengine doc section explaining None semantics (PYTHON-623)

                  • +
                  • Resolve warnings in documentation generation (PYTHON-645)

                  • +
                  • Cython dependency (PYTHON-686)

                  • +
                  • Drop Support for Python 2.6 (PYTHON-690)

                  • +
                  +
                  +
                  +
                  +

                  3.7.1

                  +

                  October 26, 2016

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

                  • +
                  +
                  +
                  +
                  +

                  3.7.0

                  +

                  September 13, 2016

                  +
                  +

                  Features

                  +
                    +
                  • Add v5 protocol failure map (PYTHON-619)

                  • +
                  • Don’t return from initial connect on first error (PYTHON-617)

                  • +
                  • Indicate failed column when deserialization fails (PYTHON-361)

                  • +
                  • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

                  • +
                  • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

                  • +
                  • EC2 Address Resolver (PYTHON-198)

                  • +
                  • Speculative query retries (PYTHON-218)

                  • +
                  • Expose paging state in API (PYTHON-200)

                  • +
                  • Don’t mark host down while one connection is active (PYTHON-498)

                  • +
                  • Query request size information (PYTHON-284)

                  • +
                  • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

                  • +
                  • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

                  • +
                  • Add beta version native protocol flag (PYTHON-614)

                  • +
                  • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Race when adding a pool while setting keyspace (PYTHON-628)

                  • +
                  • Update results_metadata when prepared statement is reprepared (PYTHON-621)

                  • +
                  • CQL Export for Thrift Tables (PYTHON-213)

                  • +
                  • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

                  • +
                  • cqlengine: columns are no longer hashable (PYTHON-618)

                  • +
                  • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

                  • +
                  +
                  +
                  +
                  +

                  3.6.0

                  +

                  August 1, 2016

                  +
                  +

                  Features

                  +
                    +
                  • Handle null values in NumpyProtocolHandler (PYTHON-553)

                  • +
                  • Collect greplin scales stats per cluster (PYTHON-561)

                  • +
                  • Update mock unit test dependency requirement (PYTHON-591)

                  • +
                  • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

                  • +
                  • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

                  • +
                  • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

                  • +
                  • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

                  • +
                  • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

                  • +
                  • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix geventreactor with SSL support (PYTHON-600)

                  • +
                  • Don’t downgrade protocol version if explicitly set (PYTHON-537)

                  • +
                  • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

                  • +
                  • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

                  • +
                  • Libev loop shutdown race (PYTHON-578)

                  • +
                  • Include aliases in DCT type string (PYTHON-579)

                  • +
                  • cqlengine: Comparison operators for Columns (PYTHON-595)

                  • +
                  • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

                  • +
                  • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

                  • +
                  • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

                  • +
                  • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

                  • +
                  • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

                  • +
                  • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

                  • +
                  +
                  +
                  +
                  +

                  3.5.0

                  +

                  June 27, 2016

                  +
                  +

                  Features

                  +
                    +
                  • Optional Execution Profiles for the core driver (PYTHON-569)

                  • +
                  • API to get the host metadata associated with the control connection node (PYTHON-583)

                  • +
                  • Expose CDC option in table metadata CQL (PYTHON-593)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Clean up Asyncore socket map when fork is detected (PYTHON-577)

                  • +
                  • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

                  • +
                  +
                  +
                  +
                  +

                  3.4.1

                  +

                  May 26, 2016

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Gevent connection closes on IO timeout (PYTHON-573)

                  • +
                  • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

                  • +
                  +
                  +
                  +
                  +

                  3.4.0

                  +

                  May 24, 2016

                  +
                  +

                  Features

                  +
                    +
                  • Include DSE version and workload in Host data (PYTHON-555)

                  • +
                  • Add a context manager to Cluster and Session (PYTHON-521)

                  • +
                  • Better Error Message for Unsupported Protocol Version (PYTHON-157)

                  • +
                  • Make the error message explicitly state when an error comes from the server (PYTHON-412)

                  • +
                  • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

                  • +
                  • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

                  • +
                  • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

                  • +
                  • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

                  • +
                  • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

                  • +
                  • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

                  • +
                  • Write docs around working with datetime and timezones (PYTHON-394)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • High CPU utilization when using asyncore event loop (PYTHON-239)

                  • +
                  • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

                  • +
                  • Make stress scripts Python 2.6 compatible (PYTHON-434)

                  • +
                  • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

                  • +
                  • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

                  • +
                  • Cluster and Session do not GC after leaving scope (PYTHON-135)

                  • +
                  • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

                  • +
                  • Reprepare on_up with many clients causes node overload (PYTHON-556)

                  • +
                  • None inserted into host map when control connection node is decommissioned (PYTHON-548)

                  • +
                  • weakref.ref does not accept keyword arguments (github #585)

                  • +
                  +
                  +
                  +
                  +

                  3.3.0

                  +

                  May 2, 2016

                  +
                  +

                  Features

                  +
                    +
                  • Add an AddressTranslator interface (PYTHON-69)

                  • +
                  • New Retry Policy Decision - try next host (PYTHON-285)

                  • +
                  • Don’t mark host down on timeout (PYTHON-286)

                  • +
                  • SSL hostname verification (PYTHON-296)

                  • +
                  • Add C* version to metadata or cluster objects (PYTHON-301)

                  • +
                  • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

                  • +
                  • Expose listen_address of node we get ring information from (PYTHON-332)

                  • +
                  • Use A-record with multiple IPs for contact points (PYTHON-415)

                  • +
                  • Custom consistency level for populating query traces (PYTHON-435)

                  • +
                  • Normalize Server Exception Types (PYTHON-443)

                  • +
                  • Propagate exception message when DDL schema agreement fails (PYTHON-444)

                  • +
                  • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

                  • +
                  • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

                  • +
                  • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

                  • +
                  • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

                  • +
                  • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

                  • +
                  • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

                  • +
                  +
                  +
                  +
                  +

                  3.2.2

                  +

                  April 19, 2016

                  +
                    +
                  • Fix counter save-after-no-update (PYTHON-547)

                  • +
                  +
                  +
                  +

                  3.2.1

                  +

                  April 13, 2016

                  +
                    +
                  • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

                  • +
                  +
                  +
                  +

                  3.2.0

                  +

                  April 12, 2016

                  +
                  +

                  Features

                  +
                    +
                  • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

                  • +
                  • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

                  • +
                  • cqlengine: support non-equal conditions for LWT (PYTHON-528)

                  • +
                  • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

                  • +
                  • cqlengine: token-aware routing for mapper statements (PYTHON-535)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

                  • +
                  • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

                  • +
                  • comparing models with datetime fields fail #79 (PYTHON-273)

                  • +
                  • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

                  • +
                  • db_field is not always respected with UpdateStatement (PYTHON-530)

                  • +
                  • Sync_table fails on column.Set with secondary index (PYTHON-533)

                  • +
                  +
                  +
                  +
                  +

                  3.1.1

                  +

                  March 14, 2016

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

                  • +
                  +
                  +
                  +
                  +

                  3.1.0

                  +

                  March 10, 2016

                  +
                  +

                  Features

                  +
                    +
                  • Pass name of server auth class to AuthProvider (PYTHON-454)

                  • +
                  • Surface schema agreed flag for DDL statements (PYTHON-458)

                  • +
                  • Automatically convert float and int to Decimal on serialization (PYTHON-468)

                  • +
                  • Eventlet Reactor IO improvement (PYTHON-495)

                  • +
                  • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

                  • +
                  • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

                  • +
                  • Add Session.default_serial_consistency_level (github #510)

                  • +
                  • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

                  • +
                  • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

                  • +
                  • cqlengine: Add DISTINCT query operator (PYTHON-266)

                  • +
                  • cqlengine: Tuple cqlengine api (PYTHON-306)

                  • +
                  • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

                  • +
                  • cqlengine: Allow nested container types (PYTHON-478)

                  • +
                  • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

                  • +
                  • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

                  • +
                  • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

                  • +
                  • Overflow when decoding large collections (cython) (PYTHON-459)

                  • +
                  • Timer heap comparison issue with Python 3 (github #466)

                  • +
                  • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

                  • +
                  • Decode error encountered when cython deserializing large map results (PYTHON-459)

                  • +
                  • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

                  • +
                  • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

                  • +
                  • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

                  • +
                  • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

                  • +
                  • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

                  • +
                  • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

                  • +
                  • cqlengine: db_field breaks UserType (PYTHON-346)

                  • +
                  • cqlengine: UDT badly quoted (PYTHON-347)

                  • +
                  • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

                  • +
                  • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

                  • +
                  • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

                  • +
                  • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

                  • +
                  • cqlengine: Better error for management functions when no connection set (PYTHON-451)

                  • +
                  • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

                  • +
                  • cqlengine: Fix inserting None for model save (PYTHON-475)

                  • +
                  • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

                  • +
                  • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

                  • +
                  • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

                  • +
                  • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

                  • +
                  +
                  +
                  +
                  +

                  3.0.0

                  +

                  November 24, 2015

                  +
                  +

                  Features

                  +
                    +
                  • Support datetime.date objects as a DateType (PYTHON-212)

                  • +
                  • Add Cluster.update_view_metadata (PYTHON-407)

                  • +
                  • QueryTrace option to populate partial trace sessions (PYTHON-438)

                  • +
                  • Attach column names to ResultSet (PYTHON-439)

                  • +
                  • Change default consistency level to LOCAL_ONE

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

                  • +
                  • Evict UDTs from UserType cache on change (PYTHON-226)

                  • +
                  • Make sure query strings are always encoded UTF-8 (PYTHON-334)

                  • +
                  • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

                  • +
                  • UDT CQL encoding does not work for unicode values (PYTHON-353)

                  • +
                  • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

                  • +
                  • Cython integer overflow on decimal type deserialization (PYTHON-433)

                  • +
                  • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

                  • +
                  +
                  +
                  +
                  +

                  3.0.0rc1

                  +

                  November 9, 2015

                  +
                  +

                  Features

                  +
                    +
                  • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

                  • +
                  • Remove deprecated features (PYTHON-292)

                  • +
                  • Don’t assign trace data to Statements (PYTHON-318)

                  • +
                  • Normalize results return (PYTHON-368)

                  • +
                  • Process Materialized View Metadata/Events (PYTHON-371)

                  • +
                  • Remove blist as soft dependency (PYTHON-385)

                  • +
                  • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

                  • +
                  • Normalize CQL query/export in metadata model (PYTHON-405)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Implementation of named arguments bind is non-pythonic (PYTHON-178)

                  • +
                  • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

                  • +
                  • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

                  • +
                  • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

                  • +
                  • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

                  • +
                  +
                  +
                  +
                  +

                  2.7.2

                  +

                  September 14, 2015

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

                  • +
                  • Remove futures dep. for Python 3 (PYTHON-393)

                  • +
                  • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

                  • +
                  • Unit test runtime issues (PYTHON-397,398)

                  • +
                  +
                  +
                  +
                  +

                  2.7.1

                  +

                  August 25, 2015

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Explicitly include extension source files in Manifest

                  • +
                  +
                  +
                  +
                  +

                  2.7.0

                  +

                  August 25, 2015

                  +

                  Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

                  +
                  +

                  Features

                  +
                    +
                  • General Performance Improvements for Throughput (PYTHON-283)

                  • +
                  • Improve synchronous request performance with Timers (PYTHON-108)

                  • +
                  • Enable C Extensions for PyPy Runtime (PYTHON-357)

                  • +
                  • Refactor SerDes functionality for pluggable interface (PYTHON-313)

                  • +
                  • Cython SerDes Extension (PYTHON-377)

                  • +
                  • Accept iterators/generators for execute_concurrent() (PYTHON-123)

                  • +
                  • cythonize existing modules (PYTHON-342)

                  • +
                  • Pure Python murmur3 implementation (PYTHON-363)

                  • +
                  • Make driver tolerant of inconsistent metadata (PYTHON-370)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

                  • +
                  • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

                  • +
                  • Blocking connect does not use connect_timeout (PYTHON-381)

                  • +
                  • Properly protect partition key in CQL export (PYTHON-375)

                  • +
                  • Trigger error callbacks on timeout (PYTHON-294)

                  • +
                  +
                  +
                  +
                  +

                  2.6.0

                  +

                  July 20, 2015

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

                  • +
                  +
                  +
                  +
                  +

                  2.6.0c2

                  +

                  June 24, 2015

                  +
                  +

                  Features

                  +
                    +
                  • Automatic Protocol Version Downgrade (PYTHON-240)

                  • +
                  • cqlengine Python 2.6 compatibility (PYTHON-288)

                  • +
                  • Double-dollar string quote UDF body (PYTHON-345)

                  • +
                  • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Avoid stall while connecting to mixed version cluster (PYTHON-303)

                  • +
                  • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

                  • +
                  • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

                  • +
                  • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

                  • +
                  • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

                  • +
                  +
                  +
                  +
                  +

                  2.6.0c1

                  +

                  June 4, 2015

                  +

                  This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

                  +
                  +

                  Features

                  +
                    +
                  • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

                  • +
                  • Configuration option for connection timeout (PYTHON-206)

                  • +
                  • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

                  • +
                  • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

                  • +
                  • Implement new request failure messages in protocol v4+ (PYTHON-238)

                  • +
                  • Metadata model now maps index meta by index name (PYTHON-241)

                  • +
                  • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

                  • +
                  • cqle: add Double column type and remove Float overload (PYTHON-246)

                  • +
                  • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

                  • +
                  • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

                  • +
                  • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

                  • +
                  • Save trace id even when trace complete times out (PYTHON-302)

                  • +
                  • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

                  • +
                  • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

                  • +
                  • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

                  • +
                  • Expose CQL keywords in API (PYTHON-324)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • IPv6 address support on Windows (PYTHON-20)

                  • +
                  • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

                  • +
                  • cqle: Quote keywords properly in table management functions (PYTHON-244)

                  • +
                  • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

                  • +
                  • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

                  • +
                  • Make protocol read_inet work for Windows (PYTHON-309)

                  • +
                  • cqle: Correct encoding for nested types (PYTHON-311)

                  • +
                  • Update list of CQL keywords used quoting identifiers (PYTHON-319)

                  • +
                  • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

                  • +
                  • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

                  • +
                  +
                  +
                  +
                  +

                  2.5.1

                  +

                  April 23, 2015

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

                  • +
                  • Fix race condition in node/token rebuild (PYTHON-298)

                  • +
                  • Set and send serial consistency parameter (PYTHON-299)

                  • +
                  +
                  +
                  +
                  +

                  2.5.0

                  +

                  March 30, 2015

                  +
                  +

                  Features

                  +
                    +
                  • Integrated cqlengine object mapping package

                  • +
                  • Utility functions for converting timeuuids and datetime (PYTHON-99)

                  • +
                  • Schema metadata fetch window randomized, config options added (PYTHON-202)

                  • +
                  • Support for new Date and Time Cassandra types (PYTHON-190)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

                  • +
                  • Thread exception during GIL cleanup (PYTHON-229)

                  • +
                  • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

                  • +
                  • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

                  • +
                  • Support reading CompositeType data (PYTHON-234)

                  • +
                  • Preserve float precision in CQL encoding (PYTHON-243)

                  • +
                  +
                  +
                  +
                  +

                  2.1.4

                  +

                  January 26, 2015

                  +
                  +

                  Features

                  +
                    +
                  • SaslAuthenticator for Kerberos support (PYTHON-109)

                  • +
                  • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

                  • +
                  • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

                  • +
                  • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

                  • +
                  • Add eventlet connection support (PYTHON-194)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Schema meta fix for complex thrift tables (PYTHON-191)

                  • +
                  • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

                  • +
                  • Resolve stream ID leak on set_keyspace (PYTHON-195)

                  • +
                  • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

                  • +
                  • Resolve stream id collision when using SASL auth (PYTHON-210)

                  • +
                  • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

                  • +
                  +
                  +
                  +
                  +

                  2.1.3

                  +

                  December 16, 2014

                  +
                  +

                  Features

                  +
                    +
                  • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

                  • +
                  • Avoid connecting to peer with incomplete metadata (PYTHON-163)

                  • +
                  • Add SSL support to gevent reactor (PYTHON-174)

                  • +
                  • Use control connection timeout in wait for schema agreement (PYTHON-175)

                  • +
                  • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

                  • +
                  • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Support large negative timestamps on Windows (PYTHON-119)

                  • +
                  • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

                  • +
                  • Retain table metadata following keyspace meta refresh (PYTHON-173)

                  • +
                  • Use a timeout when preparing a statement for all nodes (PYTHON-179)

                  • +
                  • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

                  • +
                  • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

                  • +
                  • Correct routing key encoding for composite keys (PYTHON-184)

                  • +
                  • Include compression option in schema export string when disabled (PYTHON-187)

                  • +
                  +
                  +
                  +
                  +

                  2.1.2

                  +

                  October 16, 2014

                  +
                  +

                  Features

                  +
                    +
                  • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

                  • +
                  • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

                  • +
                  • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

                  • +
                  • Handle Unauthorized message on schema_triggers query (PYTHON-155)

                  • +
                  • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

                  • +
                  • Support CUSTOM index metadata and string export (PYTHON-165)

                  • +
                  +
                  +
                  +
                  +

                  2.1.1

                  +

                  September 11, 2014

                  +
                  +

                  Features

                  +
                    +
                  • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

                  • +
                  • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

                  • +
                  • Keep timeout for paged results (PYTHON-150)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

                  • +
                  +
                  +
                  +
                  +

                  2.1.0

                  +

                  August 7, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

                  • +
                  • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

                  • +
                  +
                  +
                  +
                  +

                  2.1.0c1

                  +

                  July 25, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Properly specify UDTs for columns in CREATE TABLE statements

                  • +
                  • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

                  • +
                  • Don’t ignore fetch_size arguments to Statement constructors (github-151)

                  • +
                  • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

                  • +
                  • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

                  • +
                  • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

                  • +
                  • Raise TypeError when a string is used for contact_points (github #164)

                  • +
                  • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

                  • +
                  +
                  +
                  +
                  +

                  2.1.0b1

                  +

                  July 11, 2014

                  +

                  This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

                  +
                  +

                  Features

                  +
                    +
                  • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

                  • +
                  • Support for user-defined types (Cassandra 2.1+)

                  • +
                  • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

                  • +
                  • Protocol-level client-side timestamps (see Session.use_client_timestamp)

                  • +
                  • Overridable type encoding for non-prepared statements (see Session.encoders)

                  • +
                  • Configurable serial consistency levels for batch statements

                  • +
                  • Use io.BytesIO for reduced CPU consumption (github #143)

                  • +
                  • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

                  • +
                  • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

                  • +
                  • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

                  • +
                  • Don’t share prepared statement lock across Cluster instances

                  • +
                  • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

                  • +
                  • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

                  • +
                  • Properly defunct connections after protocol errors

                  • +
                  • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

                  • +
                  • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

                  • +
                  • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

                  • +
                  • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

                  • +
                  • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

                  • +
                  • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

                  • +
                  • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

                  • +
                  +
                  +
                  +
                  +

                  2.0.2

                  +

                  June 10, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Add six to requirements.txt

                  • +
                  • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

                  • +
                  • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

                  • +
                  • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

                  • +
                  • Add python-six to debian dependencies, move python-blist to recommends

                  • +
                  • Fix memory leak when libev connections are created and +destroyed (github #93)

                  • +
                  • Ensure token map is rebuilt when hosts are removed from the cluster

                  • +
                  +
                  +
                  +
                  +

                  2.0.1

                  +

                  May 28, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

                  • +
                  +
                  +
                  +
                  +

                  2.0.0

                  +

                  May 28, 2014

                  +
                  +

                  Features

                  +
                    +
                  • Make libev C extension Python3-compatible (PYTHON-70)

                  • +
                  • Support v2 protocol authentication (PYTHON-73, github #125)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix murmur3 C extension compilation under Python3.4 (github #124)

                  • +
                  +
                  +
                  +

                  Merged From 1.x

                  +
                  +

                  Features

                  +
                    +
                  • Add Session.default_consistency_level (PYTHON-14)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

                  • +
                  • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

                  • +
                  • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

                  • +
                  • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

                  • +
                  • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

                  • +
                  • Avoid rebuilding token metadata when cluster topology has not +actually changed

                  • +
                  • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

                  • +
                  +
                  +
                  +
                  +
                  +

                  2.0.0b1

                  +

                  May 6, 2014

                  +
                  +

                  Upgrading from 1.x

                  +

                  Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

                  +

                  If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

                  +
                  +

                  cluster = Cluster(…, protocol_version=1)

                  +
                  +
                  +
                  +

                  Features

                  +
                    +
                  • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

                  • +
                  • Support for Python 3.3 and 3.4

                  • +
                  • Allow a default query timeout to be set per-Session

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

                  • +
                  +
                  +
                  +

                  Deprecations

                  +

                  The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

                  +
                    +
                  • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

                  • +
                  • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

                  • +
                  • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

                  • +
                  • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

                  • +
                  +

                  Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

                  +
                  +
                  +
                  +

                  1.1.2

                  +

                  May 8, 2014

                  +
                  +

                  Features

                  +
                    +
                  • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

                  • +
                  • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

                  • +
                  • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

                  • +
                  • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

                  • +
                  • Handle exhausted ReconnectionPolicy schedule correctly

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Don’t log at ERROR when a connection is closed during the startup +communications

                  • +
                  • Mke scales, blist optional dependencies

                  • +
                  +
                  +
                  +
                  +

                  1.1.1

                  +

                  April 16, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix unconditional import of nose in setup.py (github #111)

                  • +
                  +
                  +
                  +
                  +

                  1.1.0

                  +

                  April 16, 2014

                  +
                  +

                  Features

                  +
                    +
                  • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

                  • +
                  • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

                  • +
                  • Add debian packaging (github issue #101)

                  • +
                  • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

                  • +
                  • Lowercase boolean literals when generating schemas

                  • +
                  • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

                  • +
                  • Don’t reconnect the control connection every time Cluster.connect() is +called

                  • +
                  • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

                  • +
                  • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

                  • +
                  • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

                  • +
                  • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

                  • +
                  • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

                  • +
                  • Better error message when libevwrapper is not found

                  • +
                  • Only try to import scales when metrics are enabled (github issue #92)

                  • +
                  • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

                  • +
                  • Issue warning log when schema versions do not match

                  • +
                  +
                  +
                  +
                  +

                  1.0.2

                  +

                  March 4, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

                  • +
                  • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

                  • +
                  • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

                  • +
                  • Handle latest table options when parsing the schema and generating +CREATE statements.

                  • +
                  • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

                  • +
                  • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

                  • +
                  • More consistent type checking for query parameters

                  • +
                  • Add option to a return special object for empty string values for non-string +columns

                  • +
                  +
                  +
                  +
                  +

                  1.0.1

                  +

                  Feb 19, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Include table indexes in KeyspaceMetadata.export_as_string()

                  • +
                  • Fix broken token awareness on ByteOrderedPartitioner

                  • +
                  • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

                  • +
                  • Handle “custom” types (such as the replaced DateType) correctly

                  • +
                  • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

                  • +
                  • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

                  • +
                  • Handle data that is already utf8-encoded for UTF8Type values

                  • +
                  • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

                  • +
                  • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

                  • +
                  • Add details about errors and the last queried host to OperationTimedOut

                  • +
                  +
                  +
                  +
                  +

                  1.0.0 Final

                  +

                  Jan 29, 2014

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Prevent leak of Scheduler thread (even with proper shutdown)

                  • +
                  • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

                  • +
                  • Hold strong reference to prepared statement while executing it to avoid +garbage collection

                  • +
                  • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

                  • +
                  • Fix bad handling of nodes that have been removed from the cluster

                  • +
                  • Properly escape string types within cql collections

                  • +
                  • Handle setting the same keyspace twice in a row

                  • +
                  • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

                  • +
                  • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

                  • +
                  • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

                  • +
                  • Fix endless hanging of some requests when using the libev reactor

                  • +
                  • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

                  • +
                  • Generators map to CQL lists, not key sequences

                  • +
                  • Always defunct connections when an internal operation fails

                  • +
                  • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

                  • +
                  • Avoid potential double-erroring of callbacks when a connection +becomes defunct

                  • +
                  +
                  +
                  +

                  Features

                  +
                    +
                  • Add default query timeout to Session

                  • +
                  • Add timeout parameter to Session.execute()

                  • +
                  • Add WhiteListRoundRobinPolicy as a load balancing policy option

                  • +
                  • Support for consistency level LOCAL_ONE

                  • +
                  • Make the backoff for fetching traces exponentially increasing and +configurable

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

                  • +
                  • Add encoder mapping for OrderedDict

                  • +
                  • Use timeouts on all control connection queries

                  • +
                  • Benchmark improvements, including command line options and eay +multithreading support

                  • +
                  • Reduced lock contention when using the asyncore reactor

                  • +
                  • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

                  • +
                  • Add requirements.txt and test-requirements.txt

                  • +
                  • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

                  • +
                  +
                  +
                  +
                  +

                  1.0.0b7

                  +

                  Nov 12, 2013

                  +

                  This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

                  +
                  +

                  Features

                  +
                    +
                  • Add timeout kwarg to ResponseFuture.result()

                  • +
                  • Create connection pools to all hosts in parallel when initializing +new Sesssions.

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Properly set exception on ResponseFuture when a query fails +against all hosts

                  • +
                  • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

                  • +
                  • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

                  • +
                  • Better error messages for failed Session.prepare() opertaions

                  • +
                  • Prepare new statements against all hosts in parallel (formerly +sequential)

                  • +
                  • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

                  • +
                  • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

                  • +
                  • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

                  • +
                  • Throttle trashing of underutilized connections to avoid trashing newly +created connections

                  • +
                  • Fix race condition which could result in trashed connections being closed +before the last operations had completed

                  • +
                  • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

                  • +
                  • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

                  • +
                  • Correctly handle large messages through libev

                  • +
                  • Add timeout to schema agreement check queries

                  • +
                  • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

                  • +
                  • Better debug logging around connection management

                  • +
                  • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

                  • +
                  +
                  +
                  +
                  +

                  1.0.0b6

                  +

                  Oct 22, 2013

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Use lazy string formatting when logging

                  • +
                  • Avoid several deadlock scenarios, especially when nodes go down

                  • +
                  • Avoid trashing newly created connections due to insufficient traffic

                  • +
                  • Gracefully handle un-handled Exceptions when erroring callbacks

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

                  • +
                  +
                  +
                  +
                  +

                  1.0.0b5

                  +

                  Oct 10, 2013

                  +
                  +

                  Features

                  +
                    +
                  • SSL support

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Avoid KeyError when building replica map for NetworkTopologyStrategy

                  • +
                  • Work around python bug which causes deadlock when a thread imports +the utf8 module

                  • +
                  • Handle no blist library, which is not compatible with pypy

                  • +
                  • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Switch packaging from Distribute to setuptools, improved C extension +support

                  • +
                  • Use PEP 386 compliant beta and post-release versions

                  • +
                  +
                  +
                  +
                  +

                  1.0.0-beta4

                  +

                  Sep 24, 2013

                  +
                  +

                  Features

                  +
                    +
                  • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

                  • +
                  • Add cql_version kwarg to Cluster.__init__

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

                  • +
                  • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

                  • +
                  +
                  +
                  +
                  +

                  1.0.0-beta3

                  +

                  Sep 20, 2013

                  +
                  +

                  Features

                  +
                    +
                  • Support for LZ4 compression (Cassandra 2.0+)

                  • +
                  • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

                  • +
                  +
                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix libev include path for CentOS

                  • +
                  • Fix varint packing of the value 0

                  • +
                  • Correctly pack unicode values

                  • +
                  • Don’t attempt to return failed connections to the pool when a final result +is set

                  • +
                  • Fix bad iteration of connection credentials

                  • +
                  • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

                  • +
                  • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

                  • +
                  • Boolean constants shouldn’t be surrounded by single quotes

                  • +
                  • Avoid a potential loss of precision on float constants due to string +formatting

                  • +
                  • Actually utilize non-standard ports set on Cluster objects

                  • +
                  • Fix export of schema as a set of CQL queries

                  • +
                  +
                  +
                  +

                  Other

                  +
                    +
                  • Use cStringIO for connection buffer for better performance

                  • +
                  • Add __repr__ method for Statement classes

                  • +
                  • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

                  • +
                  • Make all tests compatible with Python 2.6

                  • +
                  • Add 1s timeout for opening new connections

                  • +
                  +
                  +
                  +
                  +

                  1.0.0-beta2

                  +

                  Aug 19, 2013

                  +
                  +

                  Bug Fixes

                  +
                    +
                  • Fix pip packaging

                  • +
                  +
                  +
                  +
                  +

                  1.0.0-beta

                  +

                  Aug 16, 2013

                  +

                  Initial release

                  +
                  +
                  + + +
                  + + + + + +
                  + + +
                  +
                  +

                  +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                  +
                  +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/master/CNAME b/master/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/master/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/master/_sources/CHANGELOG.rst.txt b/master/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/master/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/master/_sources/api/cassandra.rst.txt b/master/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/master/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/master/_sources/api/cassandra/auth.rst.txt b/master/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/master/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/master/_sources/api/cassandra/cluster.rst.txt b/master/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..a9a9d378a4 --- /dev/null +++ b/master/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_kwargs=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/master/_sources/api/cassandra/concurrent.rst.txt b/master/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/master/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/master/_sources/api/cassandra/connection.rst.txt b/master/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/master/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/master/_sources/api/cassandra/cqlengine/columns.rst.txt b/master/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/master/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/master/_sources/api/cassandra/cqlengine/connection.rst.txt b/master/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/master/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/master/_sources/api/cassandra/cqlengine/management.rst.txt b/master/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/master/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/master/_sources/api/cassandra/cqlengine/models.rst.txt b/master/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/master/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/master/_sources/api/cassandra/cqlengine/query.rst.txt b/master/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/master/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/master/_sources/api/cassandra/cqlengine/usertype.rst.txt b/master/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/master/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/master/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/master/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/master/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/master/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/master/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/master/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/master/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/master/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/master/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/master/_sources/api/cassandra/datastax/graph/index.rst.txt b/master/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..a9b41cbdc2 --- /dev/null +++ b/master/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,133 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + :noindex: + +.. autoclass:: GraphOptions + :noindex: + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + :noindex: + +.. autoclass:: Result + :members: + :noindex: + +.. autoclass:: Vertex + :members: + :noindex: + +.. autoclass:: VertexProperty + :members: + :noindex: + +.. autoclass:: Edge + :members: + :noindex: + +.. autoclass:: Path + :members: + :noindex: + +.. autoclass:: T + :members: + :noindex: + +.. autoclass:: GraphSON1Serializer + :members: + :noindex: + +.. autoclass:: GraphSON1Deserializer + :noindex: + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + :noindex: diff --git a/master/_sources/api/cassandra/decoder.rst.txt b/master/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/master/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/master/_sources/api/cassandra/encoder.rst.txt b/master/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/master/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/master/_sources/api/cassandra/graph.rst.txt b/master/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/master/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/master/_sources/api/cassandra/io/asyncioreactor.rst.txt b/master/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/master/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/master/_sources/api/cassandra/io/asyncorereactor.rst.txt b/master/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/master/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/master/_sources/api/cassandra/io/eventletreactor.rst.txt b/master/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/master/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/master/_sources/api/cassandra/io/geventreactor.rst.txt b/master/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/master/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/master/_sources/api/cassandra/io/libevreactor.rst.txt b/master/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/master/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/master/_sources/api/cassandra/io/twistedreactor.rst.txt b/master/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/master/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/master/_sources/api/cassandra/metadata.rst.txt b/master/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..7c1280bcf7 --- /dev/null +++ b/master/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,93 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: ReplicationFactor + :members: + :exclude-members: create + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/master/_sources/api/cassandra/metrics.rst.txt b/master/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/master/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/master/_sources/api/cassandra/policies.rst.txt b/master/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/master/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/master/_sources/api/cassandra/pool.rst.txt b/master/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/master/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/master/_sources/api/cassandra/protocol.rst.txt b/master/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/master/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/master/_sources/api/cassandra/query.rst.txt b/master/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/master/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/master/_sources/api/cassandra/timestamps.rst.txt b/master/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/master/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/master/_sources/api/cassandra/util.rst.txt b/master/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/master/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/master/_sources/api/index.rst.txt b/master/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/master/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/master/_sources/cqlengine/batches.rst.txt b/master/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/master/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/master/_sources/cqlengine/connections.rst.txt b/master/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/master/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/master/_sources/cqlengine/faq.rst.txt b/master/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/master/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/master/_sources/cqlengine/models.rst.txt b/master/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/master/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/master/_sources/cqlengine/queryset.rst.txt b/master/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/master/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/master/_sources/cqlengine/third-party.rst.txt b/master/_sources/cqlengine/third-party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/master/_sources/cqlengine/third-party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/master/_sources/cqlengine/upgrade-guide.rst.txt b/master/_sources/cqlengine/upgrade-guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/master/_sources/cqlengine/upgrade-guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/master/_sources/dates-and-times.rst.txt b/master/_sources/dates-and-times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/master/_sources/dates-and-times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/master/_sources/execution-profiles.rst.txt b/master/_sources/execution-profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/master/_sources/execution-profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/master/_sources/faq.rst.txt b/master/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/master/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/master/_sources/getting-started.rst.txt b/master/_sources/getting-started.rst.txt new file mode 100644 index 0000000000..1969b503ba --- /dev/null +++ b/master/_sources/getting-started.rst.txt @@ -0,0 +1,479 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to a Cluster +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +First, make sure you have the Cassandra driver properly :doc:`installed `. + +Connecting to Cassandra ++++++++++++++++++++++++ +The simplest way to create a :class:`~.Cluster` is like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +Session Keyspace +---------------- +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Execution Profiles +------------------ +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +--------------------------------- +Although it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +---------------- +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +-------------------- +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +---------------------------------------------------- +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +--------------------- + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/master/_sources/index.rst.txt b/master/_sources/index.rst.txt new file mode 100644 index 0000000000..c21d293b6f --- /dev/null +++ b/master/_sources/index.rst.txt @@ -0,0 +1,107 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting-started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla-specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution-profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object-mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query-paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user-defined-types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates-and-times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla-cloud` + Connect to ScyllaDB Cloud + +:doc:`scylla-cloud-serverless` + Connect to ScyllaDB Cloud Serverless + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting-started + scylla-specific + upgrading + execution-profiles + performance + query-paging + lwt + security + user-defined-types + object-mapper + dates-and-times + scylla-cloud + scylla-cloud-serverless + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. diff --git a/master/_sources/installation.rst.txt b/master/_sources/installation.rst.txt new file mode 100644 index 0000000000..4996a02c1b --- /dev/null +++ b/master/_sources/installation.rst.txt @@ -0,0 +1,234 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/master/_sources/lwt.rst.txt b/master/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/master/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/master/_sources/object-mapper.rst.txt b/master/_sources/object-mapper.rst.txt new file mode 100644 index 0000000000..421be246ac --- /dev/null +++ b/master/_sources/object-mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade-guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third-party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade-guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third-party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/master/_sources/performance.rst.txt b/master/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/master/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/master/_sources/query-paging.rst.txt b/master/_sources/query-paging.rst.txt new file mode 100644 index 0000000000..23ee2c1129 --- /dev/null +++ b/master/_sources/query-paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_state'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/master/_sources/scylla-cloud-serverless.rst.txt b/master/_sources/scylla-cloud-serverless.rst.txt new file mode 100644 index 0000000000..4e0bafd1b8 --- /dev/null +++ b/master/_sources/scylla-cloud-serverless.rst.txt @@ -0,0 +1,49 @@ +ScyllaDB Cloud Serverless +------------------------- + +With ScyllaDB Cloud, you can deploy `serverless databases `_. +The Python driver allows you to connect to a serverless database by utilizing the connection bundle you can download via the **Connect>Python** tab in the Cloud application. +The connection bundle is a YAML file with connection and credential information for your cluster. + +Connecting to a ScyllaDB Cloud serverless database is very similar to a standard connection to a ScyllaDB database. + +Here’s a short program that connects to a ScyllaDB Cloud serverless database and prints metadata about the cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy + + PATH_TO_BUNDLE_YAML = '/file/downloaded/from/cloud/connect-bundle.yaml' + + + def get_cluster(): + profile = ExecutionProfile( + load_balancing_policy=TokenAwarePolicy( + DCAwareRoundRobinPolicy(local_dc='us-east-1') + ) + ) + + return Cluster( + execution_profiles={EXEC_PROFILE_DEFAULT: profile}, + scylla_cloud=PATH_TO_BUNDLE_YAML, + ) + + + print('Connecting to cluster') + cluster = get_cluster() + session = cluster.connect() + + print('Connected to cluster', cluster.metadata.cluster_name) + + print('Getting metadata') + for host in cluster.metadata.all_hosts(): + print('Datacenter: {}; Host: {}; Rack: {}'.format( + host.datacenter, host.address, host.rack) + ) + + cluster.shutdown() + +By providing the ``scylla_cloud`` parameter to the :class:`~.Cluster` constructor, +the driver can set up the connection based on the endpoint and credential information +stored in your downloaded ScyllaDB Cloud Serverless connection bundle. \ No newline at end of file diff --git a/master/_sources/scylla-cloud.rst.txt b/master/_sources/scylla-cloud.rst.txt new file mode 100644 index 0000000000..b5eb6df798 --- /dev/null +++ b/master/_sources/scylla-cloud.rst.txt @@ -0,0 +1,5 @@ +ScyllaDB Cloud +-------------- + +To connect to a `ScyllaDB Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/master/_sources/scylla-specific.rst.txt b/master/_sources/scylla-specific.rst.txt new file mode 100644 index 0000000000..87fcf01aa3 --- /dev/null +++ b/master/_sources/scylla-specific.rst.txt @@ -0,0 +1,124 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +See the configuration of ``native_shard_aware_transport_port`` and ``native_shard_aware_transport_port_ssl`` on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``shard_aware_options`` + + Setting it to ``dict(disable=True)`` would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections + + Other option is to configure scylla by setting ``enable_shard_aware_drivers: false`` on scylla.yaml. + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(shard_aware_options=dict(disable=True)) + session = cluster.connect() + + assert not cluster.is_shard_aware(), "Shard aware should be disabled" + + # or just disable the shard aware port logic + cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True)) + session = cluster.connect() + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Error Types +-------------------- + +* ``SCYLLA_RATE_LIMIT_ERROR`` Error + + The ScyllaDB 5.1 introduced a feature called per-partition rate limiting. In case the (user defined) per-partition rate limit is exceeded, the database will start returning a Scylla-specific type of error: RateLimitReached. + +.. code:: python + + from cassandra import RateLimitReached + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} + """) + + session.execute("USE keyspace1") + session.execute(""" + CREATE TABLE tbl (pk int PRIMARY KEY, v int) + WITH per_partition_rate_limit = {'max_writes_per_second': 1} + """) + + prepared = session.prepare(""" + INSERT INTO tbl (pk, v) VALUES (?, ?) + """) + + try: + for _ in range(1000): + self.session.execute(prepared.bind((123, 456))) + except RateLimitReached: + raise + + +Tablet Awareness +---------------- + +**scylla-driver** is tablet aware, which mean that it is able to parse `TABLETS_ROUTING_V1` extension to ProtocolFeatures, recieve tablet information send by Scylla in `custom_payload` part of `RESULT` message, and utilize it. +Thanks to that queries to tablet based tables are still shard aware. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylladb/blob/master/docs/dev/protocol-extensions.md#negotiate-sending-tablets-info-to-the-drivers + +Details on the sending tablet information to the drivers +https://github.com/scylladb/scylladb/blob/master/docs/dev/protocol-extensions.md#sending-tablet-info-to-the-drivers diff --git a/master/_sources/security.rst.txt b/master/_sources/security.rst.txt new file mode 100644 index 0000000000..c30189562f --- /dev/null +++ b/master/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS + + ssl_context = SSLContext(PROTOCOL_TLS) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_2_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLS`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLS, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLS, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/master/_sources/upgrading.rst.txt b/master/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..bc963e6722 --- /dev/null +++ b/master/_sources/upgrading.rst.txt @@ -0,0 +1,380 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +--------------------------- +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +-------------------------------------------------------- +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +------------------------------------------------ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/master/_sources/user-defined-types.rst.txt b/master/_sources/user-defined-types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/master/_sources/user-defined-types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
                  )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
                  )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
                  )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/master/_static/basic.css b/master/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/master/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/master/_static/check-solid.svg b/master/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/master/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/clipboard.min.js b/master/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/master/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/master/_static/copybutton.css b/master/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/master/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                  Short

                  + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/master/_static/copybutton.js b/master/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/master/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/master/_static/copybutton_funcs.js b/master/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/master/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/master/_static/css/main.css b/master/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/master/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/master/_static/doctools.js b/master/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/master/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/master/_static/documentation_options.js b/master/_static/documentation_options.js new file mode 100644 index 0000000000..52b149be9b --- /dev/null +++ b/master/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.26.4', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/master/_static/file.png b/master/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/master/_static/file.png differ diff --git a/master/_static/img/banner-background.svg b/master/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/master/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/favicon-228x228.png b/master/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/master/_static/img/favicon-228x228.png differ diff --git a/master/_static/img/favicon-32x32.png b/master/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/master/_static/img/favicon-32x32.png differ diff --git a/master/_static/img/favicon.ico b/master/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/master/_static/img/favicon.ico differ diff --git a/master/_static/img/icons/icon-about-team.svg b/master/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/master/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/master/_static/img/icons/icon-about-us-m.svg b/master/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/master/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-about-us.svg b/master/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/master/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-alternator.svg b/master/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/master/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-apps.svg b/master/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/master/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-architecture.svg b/master/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/master/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/master/_static/img/icons/icon-benchmarks.svg b/master/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/master/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/master/_static/img/icons/icon-blog.svg b/master/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/master/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/master/_static/img/icons/icon-careers.svg b/master/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/master/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/master/_static/img/icons/icon-chevron-left.svg b/master/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/master/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-chevron-right.svg b/master/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/master/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-circe.svg b/master/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/master/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-clock.svg b/master/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/master/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-close.svg b/master/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/master/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/master/_static/img/icons/icon-cloud-docs.svg b/master/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/master/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-cloud.svg b/master/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/master/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-comparison.svg b/master/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/master/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/master/_static/img/icons/icon-contact-us.svg b/master/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/master/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/master/_static/img/icons/icon-developers-blog.svg b/master/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/master/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/master/_static/img/icons/icon-docs.svg b/master/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/master/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/master/_static/img/icons/icon-enterprise-m.svg b/master/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/master/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/icons/icon-enterprise.svg b/master/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/master/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-events.svg b/master/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/master/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/master/_static/img/icons/icon-exclamation.svg b/master/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/master/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/icons/icon-expand.svg b/master/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/master/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/master/_static/img/icons/icon-forum.svg b/master/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/master/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-getting-started.svg b/master/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/master/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-glossary.svg b/master/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/master/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-home.svg b/master/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/master/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-infoworld.svg b/master/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/master/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/master/_static/img/icons/icon-integrations.svg b/master/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/master/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-knowledge-base.svg b/master/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/master/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-less.svg b/master/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/master/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/master/_static/img/icons/icon-live-test.svg b/master/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/master/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/master/_static/img/icons/icon-mail-list.svg b/master/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/master/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-manager.svg b/master/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/master/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/master/_static/img/icons/icon-memory-management.svg b/master/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/master/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/master/_static/img/icons/icon-modeling.svg b/master/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/master/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-monitoring.svg b/master/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/master/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/master/_static/img/icons/icon-networking.svg b/master/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/master/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/master/_static/img/icons/icon-news.svg b/master/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/master/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/master/_static/img/icons/icon-newsletter.svg b/master/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/master/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/master/_static/img/icons/icon-nsql-guides.svg b/master/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/master/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/master/_static/img/icons/icon-open-source.svg b/master/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/master/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/master/_static/img/icons/icon-operator.svg b/master/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/master/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-overview.svg b/master/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/master/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/master/_static/img/icons/icon-partners.svg b/master/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/master/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/master/_static/img/icons/icon-plus.svg b/master/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/master/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/master/_static/img/icons/icon-pricing.svg b/master/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/master/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/master/_static/img/icons/icon-release-notes.svg b/master/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/master/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/master/_static/img/icons/icon-resource-center.svg b/master/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/master/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/master/_static/img/icons/icon-roadmap.svg b/master/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/master/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/master/_static/img/icons/icon-search.svg b/master/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/master/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/img/icons/icon-slack.svg b/master/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/master/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-stack-overflow.svg b/master/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/master/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/img/icons/icon-summit.svg b/master/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/master/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-support.svg b/master/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/master/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/master/_static/img/icons/icon-tech-talks.svg b/master/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/master/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/master/_static/img/icons/icon-testing.svg b/master/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/master/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/master/_static/img/icons/icon-thumbs-down.svg b/master/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/master/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-thumbs-up.svg b/master/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/master/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-tip.svg b/master/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/master/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/master/_static/img/icons/icon-training.svg b/master/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/master/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/master/_static/img/icons/icon-triangle-down.svg b/master/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/master/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-university.svg b/master/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/master/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/master/_static/img/icons/icon-users-blog.svg b/master/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/master/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/master/_static/img/icons/icon-warning.svg b/master/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/master/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/icons/icon-webinars.svg b/master/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/master/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/master/_static/img/icons/icon-whitepapers.svg b/master/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/master/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/master/_static/img/icons/icon-workshop.svg b/master/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/master/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/logo-docs.svg b/master/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/master/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/logo-scylla-horizontal-RGB.svg b/master/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/master/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/mascots/404.jpg b/master/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/master/_static/img/mascots/404.jpg differ diff --git a/master/_static/img/mascots/scylla-3monsters.png b/master/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/master/_static/img/mascots/scylla-3monsters.png differ diff --git a/master/_static/img/mascots/scylla-advisor-crystal.png b/master/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/master/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/master/_static/img/mascots/scylla-alternator.svg b/master/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/master/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/master/_static/img/mascots/scylla-cloud.svg b/master/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/master/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/master/_static/img/mascots/scylla-computer-3-monsters.png b/master/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/master/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/master/_static/img/mascots/scylla-computer-headset.png b/master/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/master/_static/img/mascots/scylla-computer-headset.png differ diff --git a/master/_static/img/mascots/scylla-cup-number-one.png b/master/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/master/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/master/_static/img/mascots/scylla-docs.svg b/master/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/master/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/master/_static/img/mascots/scylla-drivers.svg b/master/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/master/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/master/_static/img/mascots/scylla-enterprise.svg b/master/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/master/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/master/_static/img/mascots/scylla-forklift-boxes.png b/master/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/master/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/master/_static/img/mascots/scylla-forklift-migration.png b/master/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/master/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/master/_static/img/mascots/scylla-gear.png b/master/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/master/_static/img/mascots/scylla-gear.png differ diff --git a/master/_static/img/mascots/scylla-hardhat.png b/master/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/master/_static/img/mascots/scylla-hardhat.png differ diff --git a/master/_static/img/mascots/scylla-headband.png b/master/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/master/_static/img/mascots/scylla-headband.png differ diff --git a/master/_static/img/mascots/scylla-headset.png b/master/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/master/_static/img/mascots/scylla-headset.png differ diff --git a/master/_static/img/mascots/scylla-hearts.png b/master/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/master/_static/img/mascots/scylla-hearts.png differ diff --git a/master/_static/img/mascots/scylla-looking-down.png b/master/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/master/_static/img/mascots/scylla-looking-down.png differ diff --git a/master/_static/img/mascots/scylla-looking-up.png b/master/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/master/_static/img/mascots/scylla-looking-up.png differ diff --git a/master/_static/img/mascots/scylla-magnifying-glass-fronting.png b/master/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/master/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/master/_static/img/mascots/scylla-magnifying-glass.png b/master/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/master/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/master/_static/img/mascots/scylla-manager.svg b/master/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/master/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/master/_static/img/mascots/scylla-monitor.svg b/master/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/master/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/master/_static/img/mascots/scylla-movement-fast.png b/master/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/master/_static/img/mascots/scylla-movement-fast.png differ diff --git a/master/_static/img/mascots/scylla-movement.png b/master/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/master/_static/img/mascots/scylla-movement.png differ diff --git a/master/_static/img/mascots/scylla-onpremise.png b/master/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/master/_static/img/mascots/scylla-onpremise.png differ diff --git a/master/_static/img/mascots/scylla-opensource.svg b/master/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/master/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/master/_static/img/mascots/scylla-operator.svg b/master/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/master/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/master/_static/img/mascots/scylla-plugin.png b/master/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/master/_static/img/mascots/scylla-plugin.png differ diff --git a/master/_static/img/mascots/scylla-release-mascot.png b/master/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/master/_static/img/mascots/scylla-release-mascot.png differ diff --git a/master/_static/img/mascots/scylla-repair.png b/master/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/master/_static/img/mascots/scylla-repair.png differ diff --git a/master/_static/img/mascots/scylla-server.png b/master/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/master/_static/img/mascots/scylla-server.png differ diff --git a/master/_static/img/mascots/scylla-sleeping.png b/master/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/master/_static/img/mascots/scylla-sleeping.png differ diff --git a/master/_static/img/mascots/scylla-tall-measure.png b/master/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/master/_static/img/mascots/scylla-tall-measure.png differ diff --git a/master/_static/img/mascots/scylla-university.png b/master/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/master/_static/img/mascots/scylla-university.png differ diff --git a/master/_static/img/mascots/scylla-weights.png b/master/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/master/_static/img/mascots/scylla-weights.png differ diff --git a/master/_static/img/mascots/scylla-window-cleaning.png b/master/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/master/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/master/_static/img/mascots/scylla-with-computer-2.png b/master/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/master/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/master/_static/img/mascots/scylla-with-computer.png b/master/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/master/_static/img/mascots/scylla-with-computer.png differ diff --git a/master/_static/img/mascots/scylla-with-linux.png b/master/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/master/_static/img/mascots/scylla-with-linux.png differ diff --git a/master/_static/img/mascots/scylla-writting.png b/master/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/master/_static/img/mascots/scylla-writting.png differ diff --git a/master/_static/img/menu.svg b/master/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/master/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/js/main.bundle.js b/master/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/master/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                • Back
                • ',backButtonPosition:"top",wrapper:"
                  ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                    "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                    ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                    ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                    ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                    ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                    "],col:[2,"","
                    "],tr:[2,"","
                    "],td:[3,"","
                    "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra - Exceptions and Enums

                    +
                    +
                    +cassandra.__version_info__
                    +

                    The version of the driver in a tuple format

                    +
                    + +
                    +
                    +cassandra.__version__
                    +

                    The version of the driver in a string format

                    +
                    + +
                    +
                    +class cassandra.ConsistencyLevel
                    +

                    Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

                    +
                    +
                    +ANY = 0
                    +

                    Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

                    +
                    + +
                    +
                    +ONE = 1
                    +

                    Only one replica needs to respond to consider the operation a success

                    +
                    + +
                    +
                    +TWO = 2
                    +

                    Two replicas must respond to consider the operation a success

                    +
                    + +
                    +
                    +THREE = 3
                    +

                    Three replicas must respond to consider the operation a success

                    +
                    + +
                    +
                    +QUORUM = 4
                    +

                    ceil(RF/2) + 1 replicas must respond to consider the operation a success

                    +
                    + +
                    +
                    +ALL = 5
                    +

                    All replicas must respond to consider the operation a success

                    +
                    + +
                    +
                    +LOCAL_QUORUM = 6
                    +

                    Requires a quorum of replicas in the local datacenter

                    +
                    + +
                    +
                    +EACH_QUORUM = 7
                    +

                    Requires a quorum of replicas in each datacenter

                    +
                    + +
                    +
                    +SERIAL = 8
                    +

                    For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

                    +
                    + +
                    +
                    +LOCAL_SERIAL = 9
                    +

                    Like SERIAL, but only requires consensus +among replicas in the local datacenter.

                    +
                    + +
                    +
                    +LOCAL_ONE = 10
                    +

                    Sends a request only to replicas in the local datacenter and waits for +one response.

                    +
                    + +
                    + +
                    +
                    +class cassandra.ProtocolVersion
                    +

                    Defines native protocol versions supported by this driver.

                    +
                    +
                    +V1 = 1
                    +

                    v1, supported in Cassandra 1.2–>2.2

                    +
                    + +
                    +
                    +V2 = 2
                    +

                    v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

                    +
                    + +
                    +
                    +V3 = 3
                    +

                    v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

                    +
                    + +
                    +
                    +V4 = 4
                    +

                    v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

                    +
                    + +
                    +
                    +V5 = 5
                    +

                    v5, in beta from 3.x+. Finalised in 4.0-beta5

                    +
                    + +
                    +
                    +V6 = 6
                    +

                    v6, in beta from 4.0-beta5

                    +
                    + +
                    +
                    +DSE_V1 = 65
                    +

                    DSE private protocol v1, supported in DSE 5.1+

                    +
                    + +
                    +
                    +DSE_V2 = 66
                    +

                    DSE private protocol v2, supported in DSE 6.0+

                    +
                    + +
                    +
                    +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
                    +

                    A tuple of all supported protocol versions

                    +
                    + +
                    +
                    +BETA_VERSIONS = (6,)
                    +

                    A tuple of all beta protocol versions

                    +
                    + +
                    +
                    +MIN_SUPPORTED = 1
                    +

                    Minimum protocol version supported by this driver.

                    +
                    + +
                    +
                    +MAX_SUPPORTED = 66
                    +

                    Maximum protocol version supported by this driver.

                    +
                    + +
                    +
                    +classmethod get_lower_supported(previous_version)
                    +

                    Return the lower supported protocol version. Beta versions are omitted.

                    +
                    + +
                    + +
                    +
                    +class cassandra.UserFunctionDescriptor(name, argument_types)
                    +

                    Describes a User function by name and argument signature

                    +
                    +
                    +name = None
                    +

                    name of the function

                    +
                    + +
                    +
                    +argument_types = None
                    +

                    Ordered list of CQL argument type names comprising the type signature

                    +
                    + +
                    +
                    +property signature
                    +

                    function signature string in the form ‘name([type0[,type1[…]]])’

                    +

                    can be used to uniquely identify overloaded function names within a keyspace

                    +
                    + +
                    + +
                    +
                    +class cassandra.UserAggregateDescriptor(name, argument_types)
                    +

                    Describes a User aggregate function by name and argument signature

                    +
                    +
                    +name = None
                    +

                    name of the aggregate

                    +
                    + +
                    +
                    +argument_types = None
                    +

                    Ordered list of CQL argument type names comprising the type signature

                    +
                    + +
                    +
                    +property signature
                    +

                    function signature string in the form ‘name([type0[,type1[…]]])’

                    +

                    can be used to uniquely identify overloaded function names within a keyspace

                    +
                    + +
                    + +
                    +
                    +exception cassandra.DriverException
                    +

                    Base for all exceptions explicitly raised by the driver.

                    +
                    + +
                    +
                    +exception cassandra.RequestExecutionException
                    +

                    Base for request execution exceptions returned from the server.

                    +
                    + +
                    +
                    +exception cassandra.Unavailable
                    +

                    There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

                    +
                    +
                    +consistency = None
                    +

                    The requested ConsistencyLevel

                    +
                    + +
                    +
                    +required_replicas = None
                    +

                    The number of replicas that needed to be live to complete the operation

                    +
                    + +
                    +
                    +alive_replicas = None
                    +

                    The number of replicas that were actually alive

                    +
                    + +
                    + +
                    +
                    +exception cassandra.Timeout
                    +

                    Replicas failed to respond to the coordinator node before timing out.

                    +
                    +
                    +consistency = None
                    +

                    The requested ConsistencyLevel

                    +
                    + +
                    +
                    +required_responses = None
                    +

                    The number of required replica responses

                    +
                    + +
                    +
                    +received_responses = None
                    +

                    The number of replicas that responded before the coordinator timed out +the operation

                    +
                    + +
                    + +
                    +
                    +exception cassandra.ReadTimeout
                    +

                    A subclass of Timeout for read operations.

                    +

                    This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

                    +
                    +
                    +data_retrieved = None
                    +

                    A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

                    +
                    + +
                    + +
                    +
                    +exception cassandra.WriteTimeout
                    +

                    A subclass of Timeout for write operations.

                    +

                    This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

                    +
                    +
                    +write_type = None
                    +

                    The type of write operation, enum on WriteType

                    +
                    + +
                    + +
                    +
                    +exception cassandra.CoordinationFailure
                    +

                    Replicas sent a failure to the coordinator.

                    +
                    +
                    +consistency = None
                    +

                    The requested ConsistencyLevel

                    +
                    + +
                    +
                    +required_responses = None
                    +

                    The number of required replica responses

                    +
                    + +
                    +
                    +received_responses = None
                    +

                    The number of replicas that responded before the coordinator timed out +the operation

                    +
                    + +
                    +
                    +failures = None
                    +

                    The number of replicas that sent a failure message

                    +
                    + +
                    +
                    +error_code_map = None
                    +

                    A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

                    +
                    + +
                    + +
                    +
                    +exception cassandra.ReadFailure
                    +

                    A subclass of CoordinationFailure for read operations.

                    +

                    This indicates that the replicas sent a failure message to the coordinator.

                    +
                    +
                    +data_retrieved = None
                    +

                    A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

                    +
                    + +
                    + +
                    +
                    +exception cassandra.WriteFailure
                    +

                    A subclass of CoordinationFailure for write operations.

                    +

                    This indicates that the replicas sent a failure message to the coordinator.

                    +
                    +
                    +write_type = None
                    +

                    The type of write operation, enum on WriteType

                    +
                    + +
                    + +
                    +
                    +exception cassandra.FunctionFailure
                    +

                    User Defined Function failed during execution

                    +
                    +
                    +keyspace = None
                    +

                    Keyspace of the function

                    +
                    + +
                    +
                    +function = None
                    +

                    Name of the function

                    +
                    + +
                    +
                    +arg_types = None
                    +

                    List of argument type names of the function

                    +
                    + +
                    + +
                    +
                    +exception cassandra.RequestValidationException
                    +

                    Server request validation failed

                    +
                    + +
                    +
                    +exception cassandra.ConfigurationException
                    +

                    Server indicated request errro due to current configuration

                    +
                    + +
                    +
                    +exception cassandra.AlreadyExists
                    +

                    An attempt was made to create a keyspace or table that already exists.

                    +
                    +
                    +keyspace = None
                    +

                    The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

                    +
                    + +
                    +
                    +table = None
                    +

                    The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

                    +
                    + +
                    + +
                    +
                    +exception cassandra.InvalidRequest
                    +

                    A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

                    +
                    + +
                    +
                    +exception cassandra.Unauthorized
                    +

                    The current user is not authorized to perform the requested operation.

                    +
                    + +
                    +
                    +exception cassandra.AuthenticationFailed
                    +

                    Failed to authenticate.

                    +
                    + +
                    +
                    +exception cassandra.OperationTimedOut
                    +

                    The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

                    +
                    +
                    +errors = None
                    +

                    A dict of errors keyed by the Host against which they occurred.

                    +
                    + +
                    +
                    +last_host = None
                    +

                    The last Host this operation was attempted against.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/auth.html b/master/api/cassandra/auth.html new file mode 100644 index 0000000000..76bff65311 --- /dev/null +++ b/master/api/cassandra/auth.html @@ -0,0 +1,830 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.auth - Authentication

                    +
                    +
                    +class cassandra.auth.AuthProvider
                    +

                    An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    +
                    +new_authenticator(host)
                    +

                    Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                    +
                    + +
                    + +
                    +
                    +class cassandra.auth.Authenticator
                    +

                    An abstract class that handles SASL authentication with Cassandra servers.

                    +

                    Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

                    +

                    1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

                    +

                    2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

                    +

                    3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

                    +

                    The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    +
                    +server_authenticator_class = None
                    +

                    Set during the connection AUTHENTICATE phase

                    +
                    + +
                    +
                    +initial_response()
                    +

                    Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

                    +
                    + +
                    +
                    +evaluate_challenge(challenge)
                    +

                    Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                    +
                    + +
                    +
                    +on_authentication_success(token)
                    +

                    Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

                    +
                    + +
                    + +
                    +
                    +class cassandra.auth.PlainTextAuthProvider(username, password)
                    +

                    An AuthProvider that works with Cassandra’s PasswordAuthenticator.

                    +

                    Example usage:

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.auth import PlainTextAuthProvider
                    +
                    +auth_provider = PlainTextAuthProvider(
                    +        username='cassandra', password='cassandra')
                    +cluster = Cluster(auth_provider=auth_provider)
                    +
                    +
                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    +
                    +new_authenticator(host)
                    +

                    Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                    +
                    + +
                    + +
                    +
                    +class cassandra.auth.PlainTextAuthenticator(username, password)
                    +
                    +
                    +evaluate_challenge(challenge)
                    +

                    Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                    +
                    + +
                    + +
                    +
                    +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
                    +

                    An AuthProvider supporting general SASL auth mechanisms

                    +

                    Suitable for GSSAPI or other SASL mechanisms

                    +

                    Example usage:

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.auth import SaslAuthProvider
                    +
                    +sasl_kwargs = {'service': 'something',
                    +               'mechanism': 'GSSAPI',
                    +               'qops': 'auth'.split(',')}
                    +auth_provider = SaslAuthProvider(**sasl_kwargs)
                    +cluster = Cluster(auth_provider=auth_provider)
                    +
                    +
                    +
                    +

                    New in version 2.1.4.

                    +
                    +
                    +
                    +new_authenticator(host)
                    +

                    Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                    +
                    + +
                    + +
                    +
                    +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
                    +

                    A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

                    +
                    +

                    New in version 2.1.4.

                    +
                    +
                    +
                    +initial_response()
                    +

                    Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

                    +
                    + +
                    +
                    +evaluate_challenge(challenge)
                    +

                    Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cluster.html b/master/api/cassandra/cluster.html new file mode 100644 index 0000000000..3d80c366da --- /dev/null +++ b/master/api/cassandra/cluster.html @@ -0,0 +1,1905 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cluster - Clusters and Sessions

                    +
                    +
                    +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
                    +

                    The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

                    +

                    Example usage:

                    +
                    >>> from cassandra.cluster import Cluster
                    +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
                    +>>> session = cluster.connect()
                    +>>> session.execute("CREATE KEYSPACE ...")
                    +>>> ...
                    +>>> cluster.shutdown()
                    +
                    +
                    +

                    Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

                    +

                    executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

                    +

                    Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

                    +
                    +
                    +contact_points = ['127.0.0.1']
                    +
                    + +
                    +
                    +port = 9042
                    +
                    + +
                    +
                    +cql_version = None
                    +
                    + +
                    +
                    +protocol_version = 66
                    +
                    + +
                    +
                    +compression = True
                    +
                    + +
                    +
                    +auth_provider
                    +

                    When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

                    +

                    When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

                    +

                    When not using authentication, this should be left as None.

                    +
                    + +
                    +
                    +load_balancing_policy
                    +

                    An instance of policies.LoadBalancingPolicy or +one of its subclasses.

                    +
                    +

                    Changed in version 2.6.0.

                    +
                    +

                    Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

                    +

                    Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

                    +
                    + +
                    +
                    +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
                    +
                    + +
                    +
                    +default_retry_policy = <cassandra.policies.RetryPolicy object>
                    +

                    A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

                    +
                    + +
                    +
                    +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
                    +
                    + +
                    +
                    +address_translator = <cassandra.policies.IdentityTranslator object>
                    +
                    + +
                    +
                    +metrics_enabled = False
                    +
                    + +
                    +
                    +metrics = None
                    +
                    + +
                    +
                    +ssl_context = None
                    +
                    + +
                    +
                    +ssl_options = None
                    +
                    + +
                    +
                    +sockopts = None
                    +
                    + +
                    +
                    +max_schema_agreement_wait = 10
                    +
                    + +
                    +
                    +metadata = None
                    +
                    + +
                    +
                    +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
                    +
                    + +
                    +
                    +control_connection_timeout = 2.0
                    +
                    + +
                    +
                    +idle_heartbeat_interval = 30
                    +
                    + +
                    +
                    +idle_heartbeat_timeout = 30
                    +
                    + +
                    +
                    +schema_event_refresh_window = 2
                    +
                    + +
                    +
                    +topology_event_refresh_window = 10
                    +
                    + +
                    +
                    +status_event_refresh_window = 2
                    +
                    + +
                    +
                    +prepare_on_all_hosts = True
                    +
                    + +
                    +
                    +reprepare_on_up = True
                    +
                    + +
                    +
                    +connect_timeout = 5
                    +
                    + +
                    +
                    +schema_metadata_enabled = True
                    +

                    Flag indicating whether internal schema metadata is updated.

                    +

                    When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

                    +
                    + +
                    +
                    +token_metadata_enabled = True
                    +

                    Flag indicating whether internal token metadata is updated.

                    +

                    When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

                    +
                    + +
                    +
                    +timestamp_generator = None
                    +
                    + +
                    +
                    +endpoint_factory = None
                    +
                    + +
                    +
                    +cloud = None
                    +
                    + +
                    +
                    +connect(keyspace=None, wait_for_all_pools=False)
                    +

                    Creates and returns a new Session object.

                    +

                    If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

                    +

                    wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

                    +
                    + +
                    +
                    +shutdown()
                    +

                    Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

                    +

                    Once shutdown, a Cluster should not be used for any purpose.

                    +
                    + +
                    +
                    +register_user_type(keyspace, user_type, klass)
                    +

                    Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

                    +

                    keyspace is the name of the keyspace that the UDT is defined in.

                    +

                    user_type is the string name of the UDT to register the mapping +for.

                    +

                    klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

                    +

                    This method should only be called after the type has been created +within Cassandra.

                    +

                    Example:

                    +
                    cluster = Cluster(protocol_version=3)
                    +session = cluster.connect()
                    +session.set_keyspace('mykeyspace')
                    +session.execute("CREATE TYPE address (street text, zipcode int)")
                    +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
                    +
                    +# create a class to map to the "address" UDT
                    +class Address(object):
                    +
                    +    def __init__(self, street, zipcode):
                    +        self.street = street
                    +        self.zipcode = zipcode
                    +
                    +cluster.register_user_type('mykeyspace', 'address', Address)
                    +
                    +# insert a row using an instance of Address
                    +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
                    +                (0, Address("123 Main St.", 78723)))
                    +
                    +# results will include Address instances
                    +results = session.execute("SELECT * FROM users")
                    +row = results[0]
                    +print row.id, row.location.street, row.location.zipcode
                    +
                    +
                    +
                    + +
                    +
                    +register_listener(listener)
                    +

                    Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

                    +
                    + +
                    +
                    +unregister_listener(listener)
                    +

                    Removes a registered listener.

                    +
                    + +
                    +
                    +add_execution_profile(name, profile, pool_wait_timeout=5)
                    +

                    Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

                    +

                    Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

                    +

                    Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

                    +
                    + +
                    +
                    +set_max_requests_per_connection(host_distance, max_requests)
                    +

                    Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

                    +

                    Pertains to connection pool management in protocol versions {1,2}.

                    +
                    + +
                    +
                    +get_max_requests_per_connection(host_distance)
                    +
                    + +
                    +
                    +set_min_requests_per_connection(host_distance, min_requests)
                    +

                    Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

                    +

                    Pertains to connection pool management in protocol versions {1,2}.

                    +
                    + +
                    +
                    +get_min_requests_per_connection(host_distance)
                    +
                    + +
                    +
                    +get_core_connections_per_host(host_distance)
                    +

                    Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                    +

                    This property is ignored if protocol_version is +3 or higher.

                    +
                    + +
                    +
                    +set_core_connections_per_host(host_distance, core_connections)
                    +

                    Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                    +

                    Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

                    +

                    If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

                    +
                    + +
                    +
                    +get_max_connections_per_host(host_distance)
                    +

                    Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

                    +

                    This property is ignored if protocol_version is +3 or higher.

                    +
                    + +
                    +
                    +set_max_connections_per_host(host_distance, max_connections)
                    +

                    Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                    +

                    If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

                    +
                    + +
                    +
                    +get_control_connection_host()
                    +

                    Returns the control connection host metadata.

                    +
                    + +
                    +
                    +refresh_schema_metadata(max_schema_agreement_wait=None)
                    +

                    Synchronously refresh all schema metadata.

                    +

                    By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

                    +

                    Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

                    +

                    Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

                    +

                    An Exception is raised if schema refresh fails for any reason.

                    +
                    + +
                    +
                    +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
                    +

                    Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

                    +

                    See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                    +
                    + +
                    +
                    +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
                    +

                    Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

                    +

                    See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                    +
                    + +
                    +
                    +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
                    +

                    Synchronously refresh user defined type metadata.

                    +

                    See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                    +
                    + +
                    +
                    +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
                    +

                    Synchronously refresh user defined function metadata.

                    +

                    function is a cassandra.UserFunctionDescriptor.

                    +

                    See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                    +
                    + +
                    +
                    +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
                    +

                    Synchronously refresh user defined aggregate metadata.

                    +

                    aggregate is a cassandra.UserAggregateDescriptor.

                    +

                    See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                    +
                    + +
                    +
                    +refresh_nodes(force_token_rebuild=False)
                    +

                    Synchronously refresh the node list and token metadata

                    +

                    force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

                    +

                    An Exception is raised if node refresh fails for any reason.

                    +
                    + +
                    +
                    +set_meta_refresh_enabled(enabled)
                    +

                    Deprecated: set schema_metadata_enabled token_metadata_enabled instead

                    +

                    Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

                    +

                    Disabling this is useful to minimize refreshes during multiple changes.

                    +

                    Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

                    +
                    + +
                    + +
                    +
                    +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
                    +
                    +
                    +consistency_level = LOCAL_ONE
                    +
                    + +
                    +
                    +static row_factory(colnames, rows)
                    +

                    Returns each row as a namedtuple. +This is the default row factory.

                    +

                    Example:

                    +
                    >>> from cassandra.query import named_tuple_factory
                    +>>> session = cluster.connect('mykeyspace')
                    +>>> session.row_factory = named_tuple_factory
                    +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                    +>>> user = rows[0]
                    +
                    +>>> # you can access field by their name:
                    +>>> print "name: %s, age: %d" % (user.name, user.age)
                    +name: Bob, age: 42
                    +
                    +>>> # or you can access fields by their position (like a tuple)
                    +>>> name, age = user
                    +>>> print "name: %s, age: %d" % (name, age)
                    +name: Bob, age: 42
                    +>>> name = user[0]
                    +>>> age = user[1]
                    +>>> print "name: %s, age: %d" % (name, age)
                    +name: Bob, age: 42
                    +
                    +
                    +
                    +

                    Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                    +
                    +
                    + +
                    + +
                    +
                    +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
                    +

                    Default execution profile for graph execution.

                    +

                    See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

                    +

                    In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

                    +
                    + +
                    +
                    +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
                    +

                    Execution profile with timeout and load balancing appropriate for graph analytics queries.

                    +

                    See also GraphExecutionPolicy.

                    +

                    In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

                    +

                    Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

                    +
                    + +
                    +
                    +cassandra.cluster.EXEC_PROFILE_DEFAULT
                    +

                    The base class of the class hierarchy.

                    +

                    When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                    +
                    + +
                    +
                    +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
                    +

                    The base class of the class hierarchy.

                    +

                    When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                    +
                    + +
                    +
                    +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
                    +

                    The base class of the class hierarchy.

                    +

                    When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                    +
                    + +
                    +
                    +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
                    +

                    The base class of the class hierarchy.

                    +

                    When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                    +
                    + +
                    +
                    +class cassandra.cluster.Session
                    +

                    A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

                    +

                    Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

                    +

                    Example usage:

                    +
                    >>> session = cluster.connect()
                    +>>> session.set_keyspace("mykeyspace")
                    +>>> session.execute("SELECT * FROM mycf")
                    +
                    +
                    +
                    +
                    +default_timeout = 10.0
                    +

                    A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

                    +

                    Setting this to None will cause no timeouts to be set by default.

                    +

                    Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    + +
                    +
                    +default_consistency_level = LOCAL_ONE
                    +

                    Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

                    +
                    +

                    New in version 1.2.0.

                    +
                    +
                    +

                    Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

                    +
                    +
                    + +
                    +
                    +default_serial_consistency_level = None
                    +

                    The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

                    +

                    Only valid for protocol_version >= 2.

                    +
                    + +
                    +
                    +row_factory = <function named_tuple_factory>
                    +

                    The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

                    + +
                    + +
                    +
                    +default_fetch_size = 5000
                    +
                    + +
                    +
                    +use_client_timestamp = True
                    +
                    + +
                    +
                    +timestamp_generator = None
                    +
                    + +
                    +
                    +encoder = None
                    +
                    + +
                    +
                    +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
                    +
                    + +
                    +
                    +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
                    +

                    Execute the given query and synchronously wait for the response.

                    +

                    If an error is encountered while executing the query, an Exception +will be raised.

                    +

                    query may be a query string or an instance of cassandra.query.Statement.

                    +

                    parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

                    +

                    timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

                    +

                    If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

                    +

                    custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

                    +

                    execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

                    +

                    paging_state is an optional paging state, reused from a previous ResultSet.

                    +

                    host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

                    +

                    execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

                    +
                    + +
                    +
                    +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
                    +

                    Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

                    +

                    See Session.execute() for parameter definitions.

                    +

                    Example usage:

                    +
                    >>> session = cluster.connect()
                    +>>> future = session.execute_async("SELECT * FROM mycf")
                    +
                    +>>> def log_results(results):
                    +...     for row in results:
                    +...         log.info("Results: %s", row)
                    +
                    +>>> def log_error(exc):
                    +>>>     log.error("Operation failed: %s", exc)
                    +
                    +>>> future.add_callbacks(log_results, log_error)
                    +
                    +
                    +

                    Async execution with blocking wait for results:

                    +
                    >>> future = session.execute_async("SELECT * FROM mycf")
                    +>>> # do other stuff...
                    +
                    +>>> try:
                    +...     results = future.result()
                    +... except Exception:
                    +...     log.exception("Operation failed:")
                    +
                    +
                    +
                    + +
                    +
                    +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
                    +

                    Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

                    +

                    parameters is dict of named parameters to bind. The values must be +JSON-serializable.

                    +

                    execution_profile: Selects an execution profile for the request.

                    +

                    execute_as the user that will be used on the server to execute the request.

                    +
                    + +
                    +
                    +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
                    +

                    Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

                    +
                    + +
                    +
                    +prepare(statement)
                    +

                    Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

                    +
                    >>> session = cluster.connect("mykeyspace")
                    +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
                    +>>> prepared = session.prepare(query)
                    +>>> session.execute(prepared, (user.id, user.name, user.age))
                    +
                    +
                    +

                    Or you may bind values to the prepared statement ahead of time:

                    +
                    >>> prepared = session.prepare(query)
                    +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
                    +>>> session.execute(bound_stmt)
                    +
                    +
                    +

                    Of course, prepared statements may (and should) be reused:

                    +
                    >>> prepared = session.prepare(query)
                    +>>> for user in users:
                    +...     bound = prepared.bind((user.id, user.name, user.age))
                    +...     session.execute(bound)
                    +
                    +
                    +

                    Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

                    +
                    >>> analyticskeyspace_prepared = session.prepare(
                    +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
                    +...     keyspace="analyticskeyspace")  # note the different keyspace
                    +
                    +
                    +

                    Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

                    +

                    custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

                    +
                    + +
                    +
                    +shutdown()
                    +

                    Close all connections. Session instances should not be used +for any purpose after being shutdown.

                    +
                    + +
                    +
                    +set_keyspace(keyspace)
                    +

                    Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

                    +
                    + +
                    +
                    +get_execution_profile(name)
                    +

                    Returns the execution profile associated with the provided name.

                    +
                    +
                    Parameters:
                    +

                    name – The name (or key) of the execution profile.

                    +
                    +
                    +
                    + +
                    +
                    +execution_profile_clone_update(ep, **kwargs)
                    +

                    Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

                    +

                    This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

                    +
                    + +
                    +
                    +add_request_init_listener(fn, *args, **kwargs)
                    +

                    Adds a callback with arguments to be called when any request is created.

                    +

                    It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

                    +

                    response_future is the ResponseFuture for the request.

                    +

                    Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

                    +

                    See this example in the +source tree for an example.

                    +
                    + +
                    +
                    +remove_request_init_listener(fn, *args, **kwargs)
                    +

                    Removes a callback and arguments from the list.

                    +

                    See Session.add_request_init_listener().

                    +
                    + +
                    + +
                    +
                    +class cassandra.cluster.ResponseFuture
                    +

                    An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

                    +
                    +
                    There are two ways for results to be delivered:
                    +
                    +
                    +
                    +
                    +query = None
                    +
                    + +
                    +
                    +result()
                    +

                    Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

                    +

                    Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

                    +

                    Example usage:

                    +
                    >>> future = session.execute_async("SELECT * FROM mycf")
                    +>>> # do other stuff...
                    +
                    +>>> try:
                    +...     rows = future.result()
                    +...     for row in rows:
                    +...         ... # process results
                    +... except Exception:
                    +...     log.exception("Operation failed:")
                    +
                    +
                    +
                    + +
                    +
                    +get_query_trace()
                    +

                    Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

                    +

                    Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

                    +

                    If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

                    +

                    query_cl is the consistency level used to poll the trace tables.

                    +
                    + +
                    +
                    +get_all_query_traces()
                    +

                    Fetches and returns the query traces for all query pages, if tracing was enabled.

                    +

                    See note in get_query_trace() regarding possible exceptions.

                    +
                    + +
                    +
                    +custom_payload
                    +

                    The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

                    +

                    Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

                    +
                    +
                    Returns:
                    +

                    Custom Payloads.

                    +
                    +
                    +
                    + +
                    +
                    +is_schema_agreed = True
                    +
                    + +
                    +
                    +has_more_pages
                    +

                    Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    + +
                    +
                    +warnings
                    +

                    Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

                    +

                    Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

                    +

                    Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

                    +
                    + +
                    +
                    +start_fetching_next_page()
                    +

                    If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

                    +

                    This should only be called after the first page has been returned.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    + +
                    +
                    +add_callback(fn, *args, **kwargs)
                    +

                    Attaches a callback function to be called when the final results arrive.

                    +

                    By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

                    +

                    If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

                    +

                    If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

                    +

                    Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

                    +

                    Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

                    +

                    Usage example:

                    +
                    >>> session = cluster.connect("mykeyspace")
                    +
                    +>>> def handle_results(rows, start_time, should_log=False):
                    +...     if should_log:
                    +...         log.info("Total time: %f", time.time() - start_time)
                    +...     ...
                    +
                    +>>> future = session.execute_async("SELECT * FROM users")
                    +>>> future.add_callback(handle_results, time.time(), should_log=True)
                    +
                    +
                    +
                    + +
                    +
                    +add_errback(fn, *args, **kwargs)
                    +

                    Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

                    +
                    + +
                    +
                    +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_kwargs=None)
                    +

                    A convenient combination of add_callback() and +add_errback().

                    +

                    Example usage:

                    +
                    >>> session = cluster.connect()
                    +>>> query = "SELECT * FROM mycf"
                    +>>> future = session.execute_async(query)
                    +
                    +>>> def log_results(results, level='debug'):
                    +...     for row in results:
                    +...         log.log(level, "Result: %s", row)
                    +
                    +>>> def log_error(exc, query):
                    +...     log.error("Query '%s' failed: %s", query, exc)
                    +
                    +>>> future.add_callbacks(
                    +...     callback=log_results, callback_kwargs={'level': 'info'},
                    +...     errback=log_error, errback_args=(query,))
                    +
                    +
                    +
                    + +
                    + +
                    +
                    +class cassandra.cluster.ResultSet
                    +

                    An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

                    +

                    You can treat this as a normal iterator over rows:

                    +
                    >>> from cassandra.query import SimpleStatement
                    +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
                    +>>> for user_row in session.execute(statement):
                    +...     process_user(user_row)
                    +
                    +
                    +

                    Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

                    +
                    +
                    +all()
                    +

                    Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

                    +

                    This function is not recommended for queries that return a large number of elements.

                    +
                    + +
                    +
                    +property current_rows
                    +

                    The list of current page rows. May be empty if the result was empty, +or this is the last page.

                    +
                    + +
                    +
                    +fetch_next_page()
                    +

                    Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

                    +
                    + +
                    +
                    +get_all_query_traces(max_wait_sec_per=None)
                    +

                    Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

                    +
                    + +
                    +
                    +get_query_trace(max_wait_sec=None)
                    +

                    Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

                    +
                    + +
                    +
                    +property has_more_pages
                    +

                    True if the last response indicated more pages; False otherwise

                    +
                    + +
                    +
                    +one()
                    +

                    Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

                    +
                    + +
                    +
                    +property paging_state
                    +

                    Server paging state of the query. Can be None if the query was not paged.

                    +

                    The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

                    +
                    + +
                    +
                    +property was_applied
                    +

                    For LWT results, returns whether the transaction was applied.

                    +

                    Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

                    +

                    Only valid when one of the of the internal row factories is in use.

                    +
                    + +
                    + +
                    +
                    +exception cassandra.cluster.QueryExhausted
                    +

                    Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    + +
                    +
                    +exception cassandra.cluster.NoHostAvailable
                    +

                    Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

                    +
                    + +
                    +
                    +exception cassandra.cluster.UserTypeDoesNotExist
                    +

                    An attempt was made to use a user-defined type that does not exist.

                    +
                    +

                    New in version 2.1.0.

                    +
                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/concurrent.html b/master/api/cassandra/concurrent.html new file mode 100644 index 0000000000..b4122ccd0d --- /dev/null +++ b/master/api/cassandra/concurrent.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.concurrent - Utilities for Concurrent Statement Execution

                    +
                    +
                    +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
                    +

                    Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

                    +

                    The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

                    +

                    If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

                    +

                    results_generator controls how the results are returned.

                    +
                      +
                    • If False, the results are returned only after all requests have completed.

                    • +
                    • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

                    • +
                    +

                    execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

                    +

                    A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

                    +

                    Example usage:

                    +
                    select_statement = session.prepare("SELECT * FROM users WHERE id=?")
                    +
                    +statements_and_params = []
                    +for user_id in user_ids:
                    +    params = (user_id, )
                    +    statements_and_params.append((select_statement, params))
                    +
                    +results = execute_concurrent(
                    +    session, statements_and_params, raise_on_first_error=False)
                    +
                    +for (success, result) in results:
                    +    if not success:
                    +        handle_error(result)  # result will be an Exception
                    +    else:
                    +        process_user(result[0])  # result will be a list of rows
                    +
                    +
                    +

                    Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

                    +
                    + +
                    +
                    +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
                    +

                    Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

                    +

                    Example usage:

                    +
                    statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
                    +parameters = [(x,) for x in range(1000)]
                    +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/connection.html b/master/api/cassandra/connection.html new file mode 100644 index 0000000000..1d6458d0fa --- /dev/null +++ b/master/api/cassandra/connection.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.connection - Low Level Connection Info

                    +
                    +
                    +exception cassandra.connection.ConnectionException
                    +

                    An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

                    +
                    + +
                    +
                    +exception cassandra.connection.ConnectionShutdown
                    +

                    Raised when a connection has been marked as defunct or has been closed.

                    +
                    + +
                    +
                    +exception cassandra.connection.ConnectionBusy
                    +

                    An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

                    +
                    + +
                    +
                    +exception cassandra.connection.ProtocolError
                    +

                    Communication did not match the protocol that this driver expects.

                    +
                    + +
                    +
                    +class cassandra.connection.EndPoint
                    +

                    Represents the information to connect to a cassandra node.

                    +
                    +
                    +property address
                    +

                    The IP address of the node. This is the RPC address the driver uses when connecting to the node

                    +
                    + +
                    +
                    +property port
                    +

                    The port of the node.

                    +
                    + +
                    +
                    +resolve()
                    +

                    Resolve the endpoint to an address/port. This is called +only on socket connection.

                    +
                    + +
                    +
                    +property socket_family
                    +

                    The socket family of the endpoint.

                    +
                    + +
                    +
                    +property ssl_options
                    +

                    SSL options specific to this endpoint.

                    +
                    + +
                    + +
                    +
                    +class cassandra.connection.EndPointFactory
                    +
                    +
                    +configure(cluster)
                    +

                    This is called by the cluster during its initialization.

                    +
                    + +
                    +
                    +create(row)
                    +

                    Create an EndPoint from a system.peers row.

                    +
                    + +
                    + +
                    +
                    +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
                    +

                    SNI Proxy EndPoint implementation.

                    +
                    + +
                    +
                    +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
                    +
                    + +
                    +
                    +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
                    +

                    Unix Socket EndPoint implementation.

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cqlengine/columns.html b/master/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..fda1ad1c67 --- /dev/null +++ b/master/api/cassandra/cqlengine/columns.html @@ -0,0 +1,985 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cqlengine.columns - Column types for object mapping models

                    +
                    +

                    Columns

                    +

                    Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

                    +

                    Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

                    +

                    Each column on your model definitions needs to be an instance of a Column class.

                    +
                    +
                    +class cassandra.cqlengine.columns.Column(**kwargs)
                    +
                    +
                    +primary_key = False
                    +

                    bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

                    +
                    + +
                    +
                    +partition_key = False
                    +

                    indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

                    +
                    + +
                    +
                    +index = False
                    +

                    bool flag, indicates an index should be created for this column

                    +
                    + +
                    +
                    +custom_index = False
                    +

                    bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

                    +
                    + +
                    +
                    +db_field = None
                    +

                    the fieldname this field will map to in the database

                    +
                    + +
                    +
                    +default = None
                    +

                    the default value, can be a value or a callable (no args)

                    +
                    + +
                    +
                    +required = False
                    +

                    boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

                    +
                    + +
                    +
                    +clustering_order = None
                    +

                    only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

                    +
                    + +
                    +
                    +discriminator_column = False
                    +

                    boolean, if set to True, this column will be used for discriminating records +of inherited models.

                    +

                    Should only be set on a column of an abstract model being used for inheritance.

                    +

                    There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

                    +
                    + +
                    +
                    +static = False
                    +

                    boolean, if set to True, this is a static column, with a single value per partition

                    +
                    + +
                    + +
                    +
                    +

                    Column Types

                    +

                    Columns of all types are initialized by passing Column attributes to the constructor by keyword.

                    +
                    +
                    +class cassandra.cqlengine.columns.Ascii(**kwargs)
                    +

                    Stores a US-ASCII character string

                    +
                    +
                    Parameters:
                    +
                      +
                    • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

                    • +
                    • max_length (int) – Sets the maximum length of this string, for validation purposes.

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.BigInt(**kwargs)
                    +

                    Stores a 64-bit signed integer value

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Blob(**kwargs)
                    +

                    Stores a raw binary value

                    +
                    + +
                    +
                    +cassandra.cqlengine.columns.Bytes
                    +

                    alias of Blob

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Boolean(**kwargs)
                    +

                    Stores a boolean True or False value

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
                    +

                    Stores a counter that can be incremented and decremented

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Date(**kwargs)
                    +

                    Stores a simple date, with no time-of-day

                    +
                    +

                    Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

                    +
                    +

                    requires C* 2.2+ and protocol v4+

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.DateTime(**kwargs)
                    +

                    Stores a datetime value

                    +
                    +
                    +truncate_microseconds = False
                    +

                    Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

                    +
                    DateTime.truncate_microseconds = True
                    +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
                    +
                    +
                    +

                    Defaults to False to preserve legacy behavior. May change in the future.

                    +
                    + +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Decimal(**kwargs)
                    +

                    Stores a variable precision decimal value

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Double(**kwargs)
                    +

                    Stores a double-precision floating-point value

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
                    +

                    Stores a single-precision floating-point value

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Integer(**kwargs)
                    +

                    Stores a 32-bit signed integer value

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
                    +

                    Stores a list of ordered values

                    +

                    http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

                    +
                    +
                    Parameters:
                    +

                    value_type – a column class indicating the types of the value

                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
                    +

                    Stores a key -> value map (dictionary)

                    +

                    https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

                    +
                    +
                    Parameters:
                    +
                      +
                    • key_type – a column class indicating the types of the key

                    • +
                    • value_type – a column class indicating the types of the value

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
                    +

                    Stores a set of unordered, unique values

                    +

                    http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

                    +
                    +
                    Parameters:
                    +
                      +
                    • value_type – a column class indicating the types of the value

                    • +
                    • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.SmallInt(**kwargs)
                    +

                    Stores a 16-bit signed integer value

                    +
                    +

                    New in version 2.6.0.

                    +
                    +

                    requires C* 2.2+ and protocol v4+

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
                    +

                    Stores a UTF-8 encoded string

                    +
                    +
                    Parameters:
                    +
                      +
                    • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

                    • +
                    • max_length (int) – Sets the maximum length of this string, for validation purposes.

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.Time(**kwargs)
                    +

                    Stores a timezone-naive time-of-day, with nanosecond precision

                    +
                    +

                    New in version 2.6.0.

                    +
                    +

                    requires C* 2.2+ and protocol v4+

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
                    +

                    UUID containing timestamp

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.TinyInt(**kwargs)
                    +

                    Stores an 8-bit signed integer value

                    +
                    +

                    New in version 2.6.0.

                    +
                    +

                    requires C* 2.2+ and protocol v4+

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
                    +

                    User Defined Type column

                    +

                    http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

                    +

                    These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

                    +

                    Please see User Defined Types for examples and discussion.

                    +
                    +
                    Parameters:
                    +

                    user_type (type) – specifies the UserType model of the column

                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.UUID(**kwargs)
                    +

                    Stores a type 1 or 4 UUID

                    +
                    + +
                    +
                    +class cassandra.cqlengine.columns.VarInt(**kwargs)
                    +

                    Stores an arbitrary-precision integer

                    +
                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cqlengine/connection.html b/master/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..a60325ebd3 --- /dev/null +++ b/master/api/cassandra/cqlengine/connection.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cqlengine.connection - Connection management for cqlengine

                    +
                    +
                    +cassandra.cqlengine.connection.default()
                    +

                    Configures the default connection to localhost, using the driver defaults +(except for row_factory)

                    +
                    + +
                    +
                    +cassandra.cqlengine.connection.set_session(s)
                    +

                    Configures the default connection with a preexisting cassandra.cluster.Session

                    +

                    Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

                    +
                    + +
                    +
                    +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
                    +

                    Setup a the driver connection used by the mapper

                    +
                    +
                    Parameters:
                    +
                      +
                    • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

                    • +
                    • default_keyspace (str) – The default keyspace to use

                    • +
                    • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

                    • +
                    • lazy_connect (bool) – True if should not connect until first use

                    • +
                    • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

                    • +
                    • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
                    +

                    Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

                    +
                    +
                    Parameters:
                    +
                      +
                    • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

                    • +
                    • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

                    • +
                    • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

                    • +
                    • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

                    • +
                    • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

                    • +
                    • default (bool) – If True, set the new connection as the cqlengine +default

                    • +
                    • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +cassandra.cqlengine.connection.unregister_connection(name)
                    +
                    + +
                    +
                    +cassandra.cqlengine.connection.set_default_connection(name)
                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cqlengine/management.html b/master/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..b5ad119662 --- /dev/null +++ b/master/api/cassandra/cqlengine/management.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cqlengine.management - Schema management for cqlengine

                    +

                    A collection of functions for managing keyspace and table schema.

                    +
                    +
                    +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
                    +

                    Creates a keyspace with SimpleStrategy for replica placement

                    +

                    If the keyspace already exists, it will not be modified.

                    +

                    This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                    +

                    There are plans to guard schema-modifying functions with an environment-driven conditional.

                    +
                    +
                    Parameters:
                    +
                      +
                    • name (str) – name of keyspace to create

                    • +
                    • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

                    • +
                    • durable_writes (bool) – Write log is bypassed if set to False

                    • +
                    • connections (list) – List of connection names

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
                    +

                    Creates a keyspace with NetworkTopologyStrategy for replica placement

                    +

                    If the keyspace already exists, it will not be modified.

                    +

                    This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                    +

                    There are plans to guard schema-modifying functions with an environment-driven conditional.

                    +
                    +
                    Parameters:
                    +
                      +
                    • name (str) – name of keyspace to create

                    • +
                    • dc_replication_map (dict) – map of dc_names: replication_factor

                    • +
                    • durable_writes (bool) – Write log is bypassed if set to False

                    • +
                    • connections (list) – List of connection names

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
                    +

                    Drops a keyspace, if it exists.

                    +

                    There are plans to guard schema-modifying functions with an environment-driven conditional.

                    +

                    This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                    +
                    +
                    Parameters:
                    +
                      +
                    • name (str) – name of keyspace to drop

                    • +
                    • connections (list) – List of connection names

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
                    +

                    Inspects the model and creates / updates the corresponding table and columns.

                    +

                    If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

                    +

                    If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

                    +

                    Any User Defined Types used in the table are implicitly synchronized.

                    +

                    This function can only add fields that are not part of the primary key.

                    +

                    Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

                    +

                    This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                    +

                    There are plans to guard schema-modifying functions with an environment-driven conditional.

                    +
                    + +
                    +
                    +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
                    +

                    Inspects the type_model and creates / updates the corresponding type.

                    +

                    Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

                    +

                    This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                    +

                    There are plans to guard schema-modifying functions with an environment-driven conditional.

                    +
                    + +
                    +
                    +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
                    +

                    Drops the table indicated by the model, if it exists.

                    +

                    If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

                    +

                    If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

                    +

                    This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                    +

                    There are plans to guard schema-modifying functions with an environment-driven conditional.

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cqlengine/models.html b/master/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..2c179e0dcc --- /dev/null +++ b/master/api/cassandra/cqlengine/models.html @@ -0,0 +1,965 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cqlengine.models - Table models for object mapping

                    +
                    +

                    Model

                    +
                    +
                    +class cassandra.cqlengine.models.Model(\*\*kwargs)
                    +

                    The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

                    +
                    class Person(Model):
                    +    id = columns.UUID(primary_key=True)
                    +    first_name  = columns.Text()
                    +    last_name = columns.Text()
                    +
                    +person = Person(first_name='Blake', last_name='Eggleston')
                    +person.first_name  #returns 'Blake'
                    +person.last_name  #returns 'Eggleston'
                    +
                    +
                    +

                    Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

                    +
                    +
                    +__abstract__ = False
                    +

                    Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

                    +
                    + +
                    +
                    +__table_name__ = None
                    +

                    Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

                    +
                    + +
                    +
                    +__table_name_case_sensitive__ = False
                    +

                    Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

                    +
                    + +
                    +
                    +__keyspace__ = None
                    +

                    Sets the name of the keyspace used by this model.

                    +
                    + +
                    +
                    +__connection__ = None
                    +

                    Sets the name of the default connection used by this model.

                    +
                    + +
                    +
                    +__default_ttl__ = None
                    +

                    Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

                    +
                    + +
                    +
                    +__discriminator_value__ = None
                    +

                    Optional Specifies a value for the discriminator column when using model inheritance.

                    +

                    See Model Inheritance for usage examples.

                    +
                    + +

                    Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

                    +

                    When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

                    +

                    Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

                    +

                    See the list of supported table properties for more information.

                    +
                    +
                    +__options__
                    +

                    For example:

                    +
                    class User(Model):
                    +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
                    +                                  'sstable_size_in_mb': '64',
                    +                                  'tombstone_threshold': '.2'},
                    +                   'comment': 'User data stored here'}
                    +
                    +    user_id = columns.UUID(primary_key=True)
                    +    name = columns.Text()
                    +
                    +
                    +

                    or :

                    +
                    class TimeData(Model):
                    +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
                    +                                  'bucket_low': '.3',
                    +                                  'bucket_high': '2',
                    +                                  'min_threshold': '2',
                    +                                  'max_threshold': '64',
                    +                                  'tombstone_compaction_interval': '86400'},
                    +                   'gc_grace_seconds': '0'}
                    +
                    +
                    +
                    + +
                    +
                    +__compute_routing_key__ = True
                    +

                    Optional Setting False disables computing the routing key for TokenAwareRouting

                    +
                    + +

                    The base methods allow creating, storing, and querying modeled objects.

                    +
                    +
                    +classmethod create(**kwargs)
                    +

                    Create an instance of this model in the database.

                    +

                    Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

                    +

                    Returns the instance.

                    +
                    + +
                    +
                    +if_not_exists()
                    +

                    Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

                    +

                    If the insertion isn’t applied, a LWTException is raised.

                    +
                    try:
                    +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
                    +except LWTException as e:
                    +    # handle failure case
                    +    print e.existing  # dict containing LWT result fields
                    +
                    +
                    +

                    This method is supported on Cassandra 2.0 or later.

                    +
                    + +
                    +
                    +if_exists()
                    +

                    Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

                    +

                    If the update or delete isn’t applied, a LWTException is raised.

                    +
                    try:
                    +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
                    +except LWTException as e:
                    +    # handle failure case
                    +    pass
                    +
                    +
                    +

                    This method is supported on Cassandra 2.0 or later.

                    +
                    + +
                    +
                    +save()
                    +

                    Saves an object to the database.

                    +
                    #create a person instance
                    +person = Person(first_name='Kimberly', last_name='Eggleston')
                    +#saves it to Cassandra
                    +person.save()
                    +
                    +
                    +
                    + +
                    +
                    +update(**values)
                    +

                    Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

                    +

                    It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

                    +
                    + +
                    +
                    +iff(**values)
                    +

                    Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

                    +

                    If the insertion isn’t applied, a LWTException is raised.

                    +
                    t = TestTransactionModel(text='some text', count=5)
                    +try:
                    +     t.iff(count=5).update('other text')
                    +except LWTException as e:
                    +    # handle failure case
                    +    print e.existing # existing object
                    +
                    +
                    +
                    + +
                    +
                    +classmethod get(*args, **kwargs)
                    +

                    Returns a single object based on the passed filter constraints.

                    +

                    This is a pass-through to the model objects().:method:~cqlengine.queries.get.

                    +
                    + +
                    +
                    +classmethod filter(*args, **kwargs)
                    +

                    Returns a queryset based on filter parameters.

                    +

                    This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

                    +
                    + +
                    +
                    +classmethod all()
                    +

                    Returns a queryset representing all stored objects

                    +

                    This is a pass-through to the model objects().all()

                    +
                    + +
                    +
                    +delete()
                    +

                    Deletes the object from the database

                    +
                    + +
                    +
                    +batch(batch_object)
                    +

                    Sets the batch object to run instance updates and inserts queries with.

                    +

                    See Batch Queries for usage examples

                    +
                    + +
                    +
                    +timeout(timeout)
                    +

                    Sets a timeout for use in save(), update(), and delete() +operations

                    +
                    + +
                    +
                    +timestamp(timedelta_or_datetime)
                    +

                    Sets the timestamp for the query

                    +
                    + +
                    +
                    +ttl(ttl_in_sec)
                    +

                    Sets the ttl values to run instance updates and inserts queries with.

                    +
                    + +
                    +
                    +using(connection=None)
                    +

                    Change the context on the fly of the model instance (keyspace, connection)

                    +
                    + +
                    +
                    +classmethod column_family_name(include_keyspace=True)
                    +

                    Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

                    +
                    + +

                    Models also support dict-like access:

                    +
                    +
                    +len(m)
                    +

                    Returns the number of columns defined in the model

                    +
                    + +
                    +
                    +m[col_name]()
                    +

                    Returns the value of column col_name

                    +
                    + +
                    +
                    +m[col_name] = value
                    +

                    Set m[col_name] to value

                    +
                    + +
                    +
                    +keys()
                    +

                    Returns a list of column IDs.

                    +
                    + +
                    +
                    +values()
                    +

                    Returns list of column values.

                    +
                    + +
                    +
                    +items()
                    +

                    Returns a list of column ID/value tuples.

                    +
                    + +
                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cqlengine/query.html b/master/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..66965f00c9 --- /dev/null +++ b/master/api/cassandra/cqlengine/query.html @@ -0,0 +1,1061 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cqlengine.query - Query and filter model objects

                    +
                    +

                    QuerySet

                    +

                    QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

                    +
                    +
                    +class cassandra.cqlengine.query.ModelQuerySet(model)
                    +
                    +
                    +all()
                    +

                    Returns a queryset matching all rows

                    +
                    for user in User.objects().all():
                    +    print(user)
                    +
                    +
                    +
                    + +
                    +
                    +batch(batch_obj)
                    +

                    Set a batch object to run the query on.

                    +

                    Note: running a select query with a batch object will raise an exception

                    +
                    + +
                    +
                    +consistency(consistency)
                    +

                    Sets the consistency level for the operation. See ConsistencyLevel.

                    +
                    for user in User.objects(id=3).consistency(CL.ONE):
                    +    print(user)
                    +
                    +
                    +
                    + +
                    +
                    +count()
                    +

                    Returns the number of rows matched by this query.

                    +

                    Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

                    +
                    + +
                    +
                    +len(queryset)
                    +

                    Returns the number of rows matched by this query. This function uses count() internally.

                    +

                    Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

                    +
                    + +
                    +
                    +distinct(distinct_fields=None)
                    +

                    Returns the DISTINCT rows matched by this query.

                    +

                    distinct_fields default to the partition key fields if not specified.

                    +

                    Note: distinct_fields must be a partition key or a static column

                    +
                    class Automobile(Model):
                    +    manufacturer = columns.Text(partition_key=True)
                    +    year = columns.Integer(primary_key=True)
                    +    model = columns.Text(primary_key=True)
                    +    price = columns.Decimal()
                    +
                    +sync_table(Automobile)
                    +
                    +# create rows
                    +
                    +Automobile.objects.distinct()
                    +
                    +# or
                    +
                    +Automobile.objects.distinct(['manufacturer'])
                    +
                    +
                    +
                    + +
                    +
                    +filter(*args, **kwargs)
                    +

                    Adds WHERE arguments to the queryset, returning a new queryset

                    +

                    See Retrieving objects with filters

                    +

                    Returns a QuerySet filtered on the keyword arguments

                    +
                    + +
                    +
                    +get(*args, **kwargs)
                    +

                    Returns a single instance matching this query, optionally with additional filter kwargs.

                    +

                    See Retrieving objects with filters

                    +

                    Returns a single object matching the QuerySet.

                    +
                    user = User.get(id=1)
                    +
                    +
                    +

                    If no objects are matched, a DoesNotExist exception is raised.

                    +

                    If more than one object is found, a MultipleObjectsReturned exception is raised.

                    +
                    + +
                    +
                    +limit(v)
                    +

                    Limits the number of results returned by Cassandra. Use 0 or None to disable.

                    +

                    Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

                    +
                    # Fetch 100 users
                    +for user in User.objects().limit(100):
                    +    print(user)
                    +
                    +# Fetch all users
                    +for user in User.objects().limit(None):
                    +    print(user)
                    +
                    +
                    +
                    + +
                    +
                    +fetch_size(v)
                    +

                    Sets the number of rows that are fetched at a time.

                    +

                    Note that driver’s default fetch size is 5000.

                    +
                    for user in User.objects().fetch_size(500):
                    +    print(user)
                    +
                    +
                    +
                    + +
                    +
                    +if_not_exists()
                    +

                    Check the existence of an object before insertion.

                    +

                    If the insertion isn’t applied, a LWTException is raised.

                    +
                    + +
                    +
                    +if_exists()
                    +

                    Check the existence of an object before an update or delete.

                    +

                    If the update or delete isn’t applied, a LWTException is raised.

                    +
                    + +
                    +
                    +order_by(*colnames)
                    +

                    Sets the column(s) to be used for ordering

                    +

                    Default order is ascending, prepend a ‘-’ to any column name for descending

                    +

                    Note: column names must be a clustering key

                    +
                    from uuid import uuid1,uuid4
                    +
                    +class Comment(Model):
                    +    photo_id = UUID(primary_key=True)
                    +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
                    +    comment = Text()
                    +
                    +sync_table(Comment)
                    +
                    +u = uuid4()
                    +for x in range(5):
                    +    Comment.create(photo_id=u, comment="test %d" % x)
                    +
                    +print("Normal")
                    +for comment in Comment.objects(photo_id=u):
                    +    print comment.comment_id
                    +
                    +print("Reversed")
                    +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
                    +    print comment.comment_id
                    +
                    +
                    +
                    + +
                    +
                    +allow_filtering()
                    +

                    Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

                    +
                    + +
                    +
                    +only(fields)
                    +

                    Load only these fields for the returned query

                    +
                    + +
                    +
                    +defer(fields)
                    +

                    Don’t load these fields for the returned query

                    +
                    + +
                    +
                    +timestamp(timestamp)
                    +

                    Allows for custom timestamps to be saved with the record.

                    +
                    + +
                    +
                    +ttl(ttl)
                    +

                    Sets the ttl (in seconds) for modified data.

                    +

                    Note that running a select query with a ttl value will raise an exception

                    +
                    + +
                    +
                    +using(keyspace=None, connection=None)
                    +

                    Change the context on-the-fly of the Model class (keyspace, connection)

                    +
                    + +
                    +
                    +update(**values)
                    +

                    Performs an update on the row selected by the queryset. Include values to update in the +update like so:

                    +
                    Model.objects(key=n).update(value='x')
                    +
                    +
                    +

                    Passing in updates for columns which are not part of the model will raise a ValidationError.

                    +

                    Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

                    +

                    For example:

                    +
                    class User(Model):
                    +    id = Integer(primary_key=True)
                    +    name = Text()
                    +
                    +setup(["localhost"], "test")
                    +sync_table(User)
                    +
                    +u = User.create(id=1, name="jon")
                    +
                    +User.objects(id=1).update(name="Steve")
                    +
                    +# sets name to null
                    +User.objects(id=1).update(name=None)
                    +
                    +
                    +

                    Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

                    +

                    Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

                    +

                    Given the model below, here are the operations that can be performed on the different container columns:

                    +
                    class Row(Model):
                    +    row_id      = columns.Integer(primary_key=True)
                    +    set_column  = columns.Set(Integer)
                    +    list_column = columns.List(Integer)
                    +    map_column  = columns.Map(Integer, Integer)
                    +
                    +
                    +

                    Set

                    +
                      +
                    • add: adds the elements of the given set to the column

                    • +
                    • remove: removes the elements of the given set to the column

                    • +
                    +
                    # add elements to a set
                    +Row.objects(row_id=5).update(set_column__add={6})
                    +
                    +# remove elements to a set
                    +Row.objects(row_id=5).update(set_column__remove={4})
                    +
                    +
                    +

                    List

                    +
                      +
                    • append: appends the elements of the given list to the end of the column

                    • +
                    • prepend: prepends the elements of the given list to the beginning of the column

                    • +
                    +
                    # append items to a list
                    +Row.objects(row_id=5).update(list_column__append=[6, 7])
                    +
                    +# prepend items to a list
                    +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
                    +
                    +
                    +

                    Map

                    +
                      +
                    • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

                    • +
                    +
                    # add items to a map
                    +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
                    +
                    +# remove items from a map
                    +Row.objects(row_id=5).update(map_column__remove={1, 2})
                    +
                    +
                    +
                    + +
                    + +
                    +
                    +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
                    +

                    Handles the batching of queries

                    +

                    http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

                    +

                    See Batch Queries for more details.

                    +
                    +
                    Parameters:
                    +
                      +
                    • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

                    • +
                    • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

                    • +
                    • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

                    • +
                    • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

                    • +
                    • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

                    • +
                    • connection (str) – Connection name to use for the batch execution

                    • +
                    +
                    +
                    +
                    +
                    +add_query(query)
                    +
                    + +
                    +
                    +execute()
                    +
                    + +
                    +
                    +add_callback(fn, *args, **kwargs)
                    +

                    Add a function and arguments to be passed to it to be executed after the batch executes.

                    +

                    A batch can support multiple callbacks.

                    +

                    Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

                    +
                    +
                    Parameters:
                    +
                      +
                    • fn (callable) – Callable object

                    • +
                    • *args – Positional arguments to be passed to the callback at the time of execution

                    • +
                    • **kwargs – Named arguments to be passed to the callback at the time of execution

                    • +
                    +
                    +
                    +
                    + +
                    + +
                    +
                    +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
                    +

                    A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

                    +
                    +
                    Parameters:
                    +
                      +
                    • *args – One or more models. A model should be a class type, not an instance.

                    • +
                    • **kwargs – (optional) Context parameters: can be keyspace or connection

                    • +
                    +
                    +
                    +

                    For example:

                    +
                    with ContextQuery(Automobile, keyspace='test2') as A:
                    +    A.objects.create(manufacturer='honda', year=2008, model='civic')
                    +    print len(A.objects.all())  # 1 result
                    +
                    +with ContextQuery(Automobile, keyspace='test4') as A:
                    +    print len(A.objects.all())  # 0 result
                    +
                    +# Multiple models
                    +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
                    +    print len(A.objects.all())
                    +    print len(A2.objects.all())
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.cqlengine.query.DoesNotExist
                    +
                    + +
                    +
                    +class cassandra.cqlengine.query.MultipleObjectsReturned
                    +
                    + +
                    +
                    +class cassandra.cqlengine.query.LWTException(existing)
                    +

                    Lightweight conditional exception.

                    +

                    This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

                    +
                    +
                    Parameters:
                    +

                    existing – The current state of the data which prevented the write.

                    +
                    +
                    +
                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/cqlengine/usertype.html b/master/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..4d9f8d1755 --- /dev/null +++ b/master/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.cqlengine.usertype - Model classes for User Defined Types

                    +
                    +

                    UserType

                    +
                    +
                    +class cassandra.cqlengine.usertype.UserType(**values)
                    +

                    This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

                    +
                    # connect with default keyspace ...
                    +
                    +from cassandra.cqlengine.columns import Text, Integer
                    +from cassandra.cqlengine.usertype import UserType
                    +
                    +class address(UserType):
                    +    street = Text()
                    +    zipcode = Integer()
                    +
                    +from cassandra.cqlengine import management
                    +management.sync_type(address)
                    +
                    +
                    +

                    Please see User Defined Types for a complete example and discussion.

                    +
                    +
                    +__type_name__ = None
                    +

                    Optional. Sets the name of the CQL type for this type.

                    +

                    If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

                    +
                    + +
                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/datastax/graph/fluent/index.html b/master/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..ca84ded381 --- /dev/null +++ b/master/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,765 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.datastax.graph.fluent

                    +
                    +
                    +class cassandra.datastax.graph.fluent.DseGraph
                    +

                    Dse Graph utility class for GraphTraversal construction and execution.

                    +
                    +
                    +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
                    +

                    Graph query language, Default is ‘bytecode-json’ (GraphSON).

                    +
                    + +
                    +
                    +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
                    +

                    Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

                    +
                    +
                    Parameters:
                    +
                      +
                    • graph_name – The graph name

                    • +
                    • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
                    +

                    From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

                    +
                    +
                    Parameters:
                    +
                      +
                    • traversal – The GraphTraversal object

                    • +
                    • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

                    • +
                    • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
                    +

                    Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

                    +
                    +
                    Parameters:
                    +
                      +
                    • session – (Optional) A DSE session

                    • +
                    • graph_name – (Optional) DSE Graph name

                    • +
                    • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

                    • +
                    • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

                    • +
                    +
                    +
                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.datastax.graph.fluent import DseGraph
                    +
                    +c = Cluster()
                    +session = c.connect()
                    +
                    +g = DseGraph.traversal_source(session, 'my_graph')
                    +print g.V().valueMap().toList()
                    +
                    +
                    +
                    + +
                    +
                    +static batch(session=None, execution_profile=None)
                    +

                    Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
                    +

                    A Tinkerpop RemoteConnection to execute traversal queries on DSE.

                    +
                    +
                    Parameters:
                    +
                      +
                    • session – A DSE session

                    • +
                    • graph_name – (Optional) DSE Graph name.

                    • +
                    • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
                    +

                    Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

                    +
                    +
                    Currently supported:
                      +
                    • bulk results

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +cassandra.datastax.graph.fluent.graph_traversal_row_factory
                    +

                    alias of _GremlinGraphSON2RowFactory

                    +
                    + +
                    +
                    +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
                    +

                    alias of _DseGraphSON2RowFactory

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/datastax/graph/fluent/predicates.html b/master/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..e90ff3ba76 --- /dev/null +++ b/master/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,771 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.datastax.graph.fluent.predicates

                    +
                    +
                    +class cassandra.datastax.graph.fluent.predicates.Search
                    +
                    +
                    +static token(value)
                    +

                    Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static token_prefix(value)
                    +

                    Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static token_regex(value)
                    +

                    Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static prefix(value)
                    +

                    Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static regex(value)
                    +

                    Search for this regular expression inside the text property targeted. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static fuzzy(value, distance)
                    +

                    Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

                    +
                    + +
                    +
                    +static token_fuzzy(value, distance)
                    +

                    Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

                    +
                    + +
                    +
                    +static phrase(value, proximity)
                    +

                    Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.fluent.predicates.CqlCollection
                    +
                    +
                    +static contains(value)
                    +

                    Search for a value inside a cql list/set column. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static contains_value(value)
                    +

                    Search for a map value. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static contains_key(value)
                    +

                    Search for a map key. +:param value: the value to look for.

                    +
                    + +
                    +
                    +static entry_eq(value)
                    +

                    Search for a map entry. +:param value: the value to look for.

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.fluent.predicates.Geo
                    +
                    +
                    +static inside(value, units=1)
                    +

                    Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/datastax/graph/fluent/query.html b/master/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..3d325b865e --- /dev/null +++ b/master/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,708 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.datastax.graph.fluent.query

                    +
                    +
                    +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
                    +

                    A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

                    +

                    If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

                    +
                    +
                    Parameters:
                    +
                      +
                    • session – (Optional) A DSE session

                    • +
                    • execution_profile – (Optional) The execution profile to use for the batch execution

                    • +
                    +
                    +
                    +
                    +
                    +add(traversal)
                    +

                    Add a traversal to the batch.

                    +
                    +
                    Parameters:
                    +

                    traversal – A gremlin GraphTraversal

                    +
                    +
                    +
                    + +
                    +
                    +add_all(traversals)
                    +

                    Adds a sequence of traversals to the batch.

                    +
                    +
                    Parameters:
                    +

                    traversals – A sequence of gremlin GraphTraversal

                    +
                    +
                    +
                    + +
                    +
                    +execute()
                    +

                    Execute the traversal batch if bounded to a DSE Session.

                    +
                    + +
                    +
                    +as_graph_statement(graph_protocol=b'graphson-2.0')
                    +

                    Return the traversal batch as GraphStatement.

                    +
                    +
                    Parameters:
                    +

                    graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

                    +
                    +
                    +
                    + +
                    +
                    +clear()
                    +

                    Clear a traversal batch for reuse.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/datastax/graph/index.html b/master/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..44a79cfc8b --- /dev/null +++ b/master/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1066 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.datastax.graph - Graph Statements, Options, and Row Factories

                    +
                    +
                    +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
                    +

                    returns the JSON string value of graph results

                    +
                    + +
                    +
                    +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
                    +

                    Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
                    +

                    Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
                    +

                    Row factory to deserialize GraphSON2 results.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
                    +

                    Row factory to deserialize GraphSON3 results.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.to_int(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Int.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.to_bigint(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Bigint.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.to_smallint(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Smallint.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.to_float(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Float.

                    +
                    + +
                    +
                    +cassandra.datastax.graph.to_double(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Double.

                    +
                    + +
                    +
                    +class cassandra.datastax.graph.GraphProtocol
                    +
                    +
                    +GRAPHSON_1_0 = b'graphson-1.0'
                    +

                    GraphSON1

                    +
                    + +
                    +
                    +GRAPHSON_2_0 = b'graphson-2.0'
                    +

                    GraphSON2

                    +
                    + +
                    +
                    +GRAPHSON_3_0 = b'graphson-3.0'
                    +

                    GraphSON3

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.GraphOptions(**kwargs)
                    +

                    Options for DSE Graph Query handler.

                    +
                    +
                    +graph_name
                    +

                    name of the targeted graph.

                    +
                    + +
                    +
                    +graph_source
                    +

                    choose the graph traversal source, configured on the server side.

                    +
                    + +
                    +
                    +graph_language
                    +

                    the language used in the queries (default “gremlin-groovy”)

                    +
                    + +
                    +
                    +graph_read_consistency_level
                    +

                    read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

                    +
                    + +
                    +
                    +graph_write_consistency_level
                    +

                    write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

                    +
                    + +
                    +
                    +is_default_source
                    +
                    + +
                    +
                    +is_analytics_source
                    +

                    True if graph_source is set to the server-defined analytics traversal source (‘a’)

                    +
                    + +
                    +
                    +is_graph_source
                    +

                    True if graph_source is set to the server-defined graph traversal source (‘g’)

                    +
                    + +
                    +
                    +set_source_default()
                    +

                    Sets graph_source to the server-defined default traversal source (‘default’)

                    +
                    + +
                    +
                    +set_source_analytics()
                    +

                    Sets graph_source to the server-defined analytic traversal source (‘a’)

                    +
                    + +
                    +
                    +set_source_graph()
                    +

                    Sets graph_source to the server-defined graph traversal source (‘g’)

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                    +

                    Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

                    +

                    query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                    +

                    See Statement attributes for a description of the other parameters.

                    +
                    + +
                    +
                    +class cassandra.datastax.graph.Result(value)
                    +

                    Represents deserialized graph results. +Property and item getters are provided for convenience.

                    +
                    +
                    +value = None
                    +

                    Deserialized value from the result

                    +
                    + +
                    +
                    +as_vertex()
                    +

                    Return a Vertex parsed from this result

                    +

                    Raises TypeError if parsing fails (i.e. the result structure is not valid).

                    +
                    + +
                    +
                    +as_edge()
                    +

                    Return a Edge parsed from this result

                    +

                    Raises TypeError if parsing fails (i.e. the result structure is not valid).

                    +
                    + +
                    +
                    +as_path()
                    +

                    Return a Path parsed from this result

                    +

                    Raises TypeError if parsing fails (i.e. the result structure is not valid).

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.Vertex(id, label, type, properties)
                    +

                    Represents a Vertex element from a graph query.

                    +

                    Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

                    +
                    + +
                    +
                    +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
                    +

                    Vertex properties have a top-level value and an optional dict of properties.

                    +
                    +
                    +label = None
                    +

                    label of the property

                    +
                    + +
                    +
                    +value = None
                    +

                    Value of the property

                    +
                    + +
                    +
                    +properties = None
                    +

                    dict of properties attached to the property

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
                    +

                    Represents an Edge element from a graph query.

                    +

                    Attributes match initializer parameters.

                    +
                    + +
                    +
                    +class cassandra.datastax.graph.Path(labels, objects)
                    +

                    Represents a graph path.

                    +

                    Labels list is taken verbatim from the results.

                    +

                    Objects are either Result or Vertex/Edge for recognized types

                    +
                    +
                    +labels = None
                    +

                    List of labels in the path

                    +
                    + +
                    +
                    +objects = None
                    +

                    List of objects in the path

                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.T(name, val)
                    +

                    Represents a collection of tokens for more concise Traversal definitions.

                    +
                    +
                    +id = T.id
                    +
                    + +
                    +
                    +key = T.key
                    +
                    + +
                    +
                    +label = T.label
                    +
                    + +
                    +
                    +value = T.value
                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.GraphSON1Serializer
                    +

                    Serialize python objects to graphson types.

                    +
                    + +
                    +
                    +class cassandra.datastax.graph.GraphSON1Deserializer
                    +

                    Deserialize graphson1 types to python objects.

                    +
                    +
                    +classmethod deserialize_date(value)
                    +
                    + +
                    +
                    +classmethod deserialize_timestamp(value)
                    +
                    + +
                    +
                    +classmethod deserialize_time(value)
                    +
                    + +
                    +
                    +classmethod deserialize_duration(value)
                    +
                    + +
                    +
                    +classmethod deserialize_int(value)
                    +
                    + +
                    +
                    +classmethod deserialize_bigint(value)
                    +
                    + +
                    +
                    +classmethod deserialize_double(value)
                    +
                    + +
                    +
                    +classmethod deserialize_float(value)
                    +
                    + +
                    +
                    +classmethod deserialize_uuid(value)
                    +
                    + +
                    +
                    +classmethod deserialize_blob(value)
                    +
                    + +
                    +
                    +classmethod deserialize_decimal(value)
                    +
                    + +
                    +
                    +classmethod deserialize_point(value)
                    +
                    + +
                    +
                    +classmethod deserialize_linestring(value)
                    +
                    + +
                    +
                    +classmethod deserialize_polygon(value)
                    +
                    + +
                    + +
                    +
                    +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
                    +

                    GraphSON2 Reader that parse json and deserialize to python objects.

                    +
                    +
                    Parameters:
                    +

                    extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                    +
                    +
                    +
                    +
                    +read(json_data)
                    +

                    Read and deserialize json_data.

                    +
                    + +
                    +
                    +deserialize(obj)
                    +

                    Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/decoder.html b/master/api/cassandra/decoder.html new file mode 100644 index 0000000000..b77156e3d9 --- /dev/null +++ b/master/api/cassandra/decoder.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.decoder - Data Return Formats

                    +
                    +
                    +cassandra.decoder.tuple_factory()
                    +

                    Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

                    +
                    + +
                    +
                    +cassandra.decoder.named_tuple_factory()
                    +

                    Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

                    +
                    + +
                    +
                    +cassandra.decoder.dict_factory()
                    +

                    Deprecated in 2.0.0. Use cassandra.query.dict_factory()

                    +
                    + +
                    +
                    +cassandra.decoder.ordered_dict_factory()
                    +

                    Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/encoder.html b/master/api/cassandra/encoder.html new file mode 100644 index 0000000000..6452f8205c --- /dev/null +++ b/master/api/cassandra/encoder.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.encoder - Encoders for non-prepared Statements

                    +
                    +
                    +class cassandra.encoder.Encoder
                    +

                    A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

                    +
                    +
                    +mapping = None
                    +

                    A map of python types to encoder functions.

                    +
                    + +
                    +
                    +cql_encode_none()
                    +

                    Converts None to the string ‘NULL’.

                    +
                    + +
                    +
                    +cql_encode_object()
                    +

                    Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

                    +
                    + +
                    +
                    +cql_encode_all_types()
                    +

                    Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

                    +
                    + +
                    +
                    +cql_encode_sequence()
                    +

                    Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

                    +
                    + +
                    +
                    +cql_encode_str()
                    +

                    Escapes quotes in str objects.

                    +
                    + +
                    +
                    +cql_encode_unicode()
                    +

                    Converts unicode objects to UTF-8 encoded strings with quote escaping.

                    +
                    + +
                    +
                    +cql_encode_bytes()
                    +

                    Converts strings, buffers, and bytearrays into CQL blob literals.

                    +
                    + +
                    +
                    +cql_encode_datetime()
                    +

                    Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

                    +
                    + +
                    +
                    +cql_encode_date()
                    +

                    Converts a datetime.date object to a string with format +YYYY-MM-DD.

                    +
                    + +
                    +
                    +cql_encode_map_collection()
                    +

                    Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

                    +
                    + +
                    +
                    +cql_encode_list_collection()
                    +

                    Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

                    +
                    + +
                    +
                    +cql_encode_set_collection()
                    +

                    Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

                    +
                    + +
                    +
                    +cql_encode_tuple()
                    +

                    Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/graph.html b/master/api/cassandra/graph.html new file mode 100644 index 0000000000..8913bb61ff --- /dev/null +++ b/master/api/cassandra/graph.html @@ -0,0 +1,1099 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.graph - Graph Statements, Options, and Row Factories

                    +
                    +

                    Note

                    +

                    This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

                    +
                    +
                    +
                    +cassandra.graph.single_object_row_factory(column_names, rows)
                    +

                    returns the JSON string value of graph results

                    +
                    + +
                    +
                    +cassandra.graph.graph_result_row_factory(column_names, rows)
                    +

                    Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

                    +
                    + +
                    +
                    +cassandra.graph.graph_object_row_factory(column_names, rows)
                    +

                    Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

                    +
                    + +
                    +
                    +cassandra.graph.graph_graphson2_row_factory(cluster)
                    +

                    Row factory to deserialize GraphSON2 results.

                    +
                    + +
                    +
                    +cassandra.graph.graph_graphson3_row_factory(cluster)
                    +

                    Row factory to deserialize GraphSON3 results.

                    +
                    + +
                    +
                    +cassandra.graph.to_int(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Int.

                    +
                    + +
                    +
                    +cassandra.graph.to_bigint(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Bigint.

                    +
                    + +
                    +
                    +cassandra.graph.to_smallint(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Smallint.

                    +
                    + +
                    +
                    +cassandra.graph.to_float(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Float.

                    +
                    + +
                    +
                    +cassandra.graph.to_double(value)
                    +

                    Wraps a value to be explicitly serialized as a graphson Double.

                    +
                    + +
                    +
                    +class cassandra.graph.GraphProtocol
                    +
                    +
                    +GRAPHSON_1_0 = b'graphson-1.0'
                    +

                    GraphSON1

                    +
                    + +
                    +
                    +GRAPHSON_2_0 = b'graphson-2.0'
                    +

                    GraphSON2

                    +
                    + +
                    +
                    +GRAPHSON_3_0 = b'graphson-3.0'
                    +

                    GraphSON3

                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.GraphOptions(**kwargs)
                    +

                    Options for DSE Graph Query handler.

                    +
                    +
                    +graph_name
                    +

                    name of the targeted graph.

                    +
                    + +
                    +
                    +graph_source
                    +

                    choose the graph traversal source, configured on the server side.

                    +
                    + +
                    +
                    +graph_language
                    +

                    the language used in the queries (default “gremlin-groovy”)

                    +
                    + +
                    +
                    +graph_read_consistency_level
                    +

                    read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

                    +
                    + +
                    +
                    +graph_write_consistency_level
                    +

                    write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

                    +
                    + +
                    +
                    +is_default_source
                    +
                    + +
                    +
                    +is_analytics_source
                    +

                    True if graph_source is set to the server-defined analytics traversal source (‘a’)

                    +
                    + +
                    +
                    +is_graph_source
                    +

                    True if graph_source is set to the server-defined graph traversal source (‘g’)

                    +
                    + +
                    +
                    +set_source_default()
                    +

                    Sets graph_source to the server-defined default traversal source (‘default’)

                    +
                    + +
                    +
                    +set_source_analytics()
                    +

                    Sets graph_source to the server-defined analytic traversal source (‘a’)

                    +
                    + +
                    +
                    +set_source_graph()
                    +

                    Sets graph_source to the server-defined graph traversal source (‘g’)

                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                    +

                    Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

                    +

                    query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                    +

                    See Statement attributes for a description of the other parameters.

                    +
                    + +
                    +
                    +class cassandra.graph.Result(value)
                    +

                    Represents deserialized graph results. +Property and item getters are provided for convenience.

                    +
                    +
                    +value = None
                    +

                    Deserialized value from the result

                    +
                    + +
                    +
                    +as_vertex()
                    +

                    Return a Vertex parsed from this result

                    +

                    Raises TypeError if parsing fails (i.e. the result structure is not valid).

                    +
                    + +
                    +
                    +as_edge()
                    +

                    Return a Edge parsed from this result

                    +

                    Raises TypeError if parsing fails (i.e. the result structure is not valid).

                    +
                    + +
                    +
                    +as_path()
                    +

                    Return a Path parsed from this result

                    +

                    Raises TypeError if parsing fails (i.e. the result structure is not valid).

                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.Vertex(id, label, type, properties)
                    +

                    Represents a Vertex element from a graph query.

                    +

                    Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

                    +
                    + +
                    +
                    +class cassandra.graph.VertexProperty(label, value, properties=None)
                    +

                    Vertex properties have a top-level value and an optional dict of properties.

                    +
                    +
                    +label = None
                    +

                    label of the property

                    +
                    + +
                    +
                    +value = None
                    +

                    Value of the property

                    +
                    + +
                    +
                    +properties = None
                    +

                    dict of properties attached to the property

                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
                    +

                    Represents an Edge element from a graph query.

                    +

                    Attributes match initializer parameters.

                    +
                    + +
                    +
                    +class cassandra.graph.Path(labels, objects)
                    +

                    Represents a graph path.

                    +

                    Labels list is taken verbatim from the results.

                    +

                    Objects are either Result or Vertex/Edge for recognized types

                    +
                    +
                    +labels = None
                    +

                    List of labels in the path

                    +
                    + +
                    +
                    +objects = None
                    +

                    List of objects in the path

                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.GraphSON1Serializer
                    +

                    Serialize python objects to graphson types.

                    +
                    + +
                    +
                    +class cassandra.graph.GraphSON1Deserializer
                    +

                    Deserialize graphson1 types to python objects.

                    +
                    +
                    +classmethod deserialize_date(value)
                    +
                    + +
                    +
                    +classmethod deserialize_timestamp(value)
                    +
                    + +
                    +
                    +classmethod deserialize_time(value)
                    +
                    + +
                    +
                    +classmethod deserialize_duration(value)
                    +
                    + +
                    +
                    +classmethod deserialize_int(value)
                    +
                    + +
                    +
                    +classmethod deserialize_bigint(value)
                    +
                    + +
                    +
                    +classmethod deserialize_double(value)
                    +
                    + +
                    +
                    +classmethod deserialize_float(value)
                    +
                    + +
                    +
                    +classmethod deserialize_uuid(value)
                    +
                    + +
                    +
                    +classmethod deserialize_blob(value)
                    +
                    + +
                    +
                    +classmethod deserialize_decimal(value)
                    +
                    + +
                    +
                    +classmethod deserialize_point(value)
                    +
                    + +
                    +
                    +classmethod deserialize_linestring(value)
                    +
                    + +
                    +
                    +classmethod deserialize_polygon(value)
                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
                    +

                    GraphSON2 Reader that parse json and deserialize to python objects.

                    +
                    +
                    Parameters:
                    +

                    extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                    +
                    +
                    +
                    +
                    +read(json_data)
                    +

                    Read and deserialize json_data.

                    +
                    + +
                    +
                    +deserialize(obj)
                    +

                    Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

                    +
                    + +
                    + +
                    +
                    +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
                    +

                    GraphSON3 Reader that parse json and deserialize to python objects.

                    +
                    +
                    Parameters:
                    +
                      +
                    • context – A dict of the context, mostly used as context for udt deserialization.

                    • +
                    • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                    • +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/io/asyncioreactor.html b/master/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..8da17da39c --- /dev/null +++ b/master/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.io.asyncioreactor - asyncio Event Loop

                    +
                    +
                    +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
                    +

                    An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

                    +

                    Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

                    +
                    +
                    +classmethod initialize_reactor()
                    +

                    Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/io/asyncorereactor.html b/master/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..82d29ede4d --- /dev/null +++ b/master/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.io.asyncorereactor - asyncore Event Loop

                    +
                    +
                    +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
                    +

                    An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

                    +
                    +
                    +classmethod initialize_reactor()
                    +

                    Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                    +
                    + +
                    +
                    +classmethod handle_fork()
                    +

                    Called after a forking. This should cleanup any remaining reactor state +from the parent process.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/io/eventletreactor.html b/master/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..573165e7ff --- /dev/null +++ b/master/api/cassandra/io/eventletreactor.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.io.eventletreactor - eventlet-compatible Connection

                    +
                    +
                    +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
                    +

                    An implementation of Connection that utilizes eventlet.

                    +

                    This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

                    +
                    +
                    +classmethod initialize_reactor()
                    +

                    Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                    +
                    + +
                    +
                    +classmethod service_timeouts()
                    +

                    cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/io/geventreactor.html b/master/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..da916bbcfc --- /dev/null +++ b/master/api/cassandra/io/geventreactor.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.io.geventreactor - gevent-compatible Event Loop

                    +
                    +
                    +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
                    +

                    An implementation of Connection that utilizes gevent.

                    +

                    This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

                    +
                    +
                    +classmethod initialize_reactor()
                    +

                    Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/io/libevreactor.html b/master/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..13229da784 --- /dev/null +++ b/master/api/cassandra/io/libevreactor.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.io.libevreactor - libev Event Loop

                    +
                    +
                    +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
                    +

                    An implementation of Connection that uses libev for its event loop.

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/io/twistedreactor.html b/master/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..918e510643 --- /dev/null +++ b/master/api/cassandra/io/twistedreactor.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.io.twistedreactor - Twisted Event Loop

                    +
                    +
                    +class cassandra.io.twistedreactor.TwistedConnection
                    +

                    An implementation of Connection that uses +Twisted’s reactor as its event loop.

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/metadata.html b/master/api/cassandra/metadata.html new file mode 100644 index 0000000000..1fa1d11808 --- /dev/null +++ b/master/api/cassandra/metadata.html @@ -0,0 +1,1105 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.metadata - Schema and Ring Topology

                    +
                    +
                    +cassandra.metadata.cql_keywords
                    +

                    set() -> new empty set object +set(iterable) -> new set object

                    +

                    Build an unordered collection of unique elements.

                    +
                    + +
                    +
                    +cassandra.metadata.cql_keywords_unreserved
                    +

                    set() -> new empty set object +set(iterable) -> new set object

                    +

                    Build an unordered collection of unique elements.

                    +
                    + +
                    +
                    +cassandra.metadata.cql_keywords_reserved
                    +

                    set() -> new empty set object +set(iterable) -> new set object

                    +

                    Build an unordered collection of unique elements.

                    +
                    + +
                    +
                    +class cassandra.metadata.Metadata
                    +

                    Holds a representation of the cluster schema and topology.

                    +
                    +
                    +add_or_return_host(host)
                    +

                    Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

                    +
                    + +
                    +
                    +all_hosts()
                    +

                    Returns a list of all known Host instances in the cluster.

                    +
                    + +
                    +
                    +export_schema_as_string()
                    +

                    Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

                    +
                    + +
                    +
                    +get_host(endpoint_or_address, port=None)
                    +

                    Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

                    +
                    + +
                    +
                    +get_host_by_host_id(host_id)
                    +

                    Same as get_host() but use host_id for lookup.

                    +
                    + +
                    +
                    +get_replicas(keyspace, key)
                    +

                    Returns a list of Host instances that are replicas for a given +partition key.

                    +
                    + +
                    + +
                    +

                    Schemas

                    +
                    +
                    +class cassandra.metadata.KeyspaceMetadata
                    +

                    A representation of the schema for a single keyspace.

                    +
                    +
                    +as_cql_query()
                    +

                    Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

                    +
                    + +
                    +
                    +export_as_string()
                    +

                    Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.UserType
                    +

                    A user defined type, as created by CREATE TYPE statements.

                    +

                    User-defined types were introduced in Cassandra 2.1.

                    +
                    +

                    New in version 2.1.0.

                    +
                    +
                    +
                    +as_cql_query(formatted=False)
                    +

                    Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.Function
                    +

                    A user defined function, as created by CREATE FUNCTION statements.

                    +

                    User-defined functions were introduced in Cassandra 2.2

                    +
                    +

                    New in version 2.6.0.

                    +
                    +
                    +
                    +as_cql_query(formatted=False)
                    +

                    Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.Aggregate
                    +

                    A user defined aggregate function, as created by CREATE AGGREGATE statements.

                    +

                    Aggregate functions were introduced in Cassandra 2.2

                    +
                    +

                    New in version 2.6.0.

                    +
                    +
                    +
                    +as_cql_query(formatted=False)
                    +

                    Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.TableMetadata
                    +

                    A representation of the schema for a single table.

                    +
                    +
                    +as_cql_query(formatted=False)
                    +

                    Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

                    +
                    + +
                    +
                    +export_as_string()
                    +

                    Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

                    +
                    + +
                    +
                    +property is_cql_compatible
                    +

                    A boolean indicating if this table can be represented as CQL in export

                    +
                    + +
                    +
                    +property primary_key
                    +

                    A list of ColumnMetadata representing the components of +the primary key for this table.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.TableMetadataV3
                    +

                    For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

                    +
                    +
                    +property is_cql_compatible
                    +

                    A boolean indicating if this table can be represented as CQL in export

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.TableMetadataDSE68
                    +
                    +
                    +as_cql_query(formatted=False)
                    +

                    Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.ColumnMetadata
                    +

                    A representation of a single column in a table.

                    +
                    + +
                    +
                    +class cassandra.metadata.IndexMetadata
                    +

                    A representation of a secondary index on a column.

                    +
                    +
                    +as_cql_query()
                    +

                    Returns a CQL query that can be used to recreate this index.

                    +
                    + +
                    +
                    +export_as_string()
                    +

                    Returns a CQL query string that can be used to recreate this index.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.MaterializedViewMetadata
                    +

                    A representation of a materialized view on a table

                    +
                    +
                    +as_cql_query(formatted=False)
                    +

                    Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.VertexMetadata
                    +

                    A representation of a vertex on a table

                    +
                    + +
                    +
                    +class cassandra.metadata.EdgeMetadata
                    +

                    A representation of an edge on a table

                    +
                    + +
                    +
                    +

                    Tokens and Ring Topology

                    +
                    +
                    +class cassandra.metadata.TokenMap
                    +

                    Information about the layout of the ring.

                    +
                    +
                    +get_replicas(keyspace, token)
                    +

                    Get a set of Host instances representing all of the +replica nodes for a given Token.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.Token
                    +

                    Abstract class representing a token.

                    +
                    + +
                    +
                    +class cassandra.metadata.Murmur3Token(token)
                    +

                    A token for Murmur3Partitioner.

                    +

                    token is an int or string representing the token.

                    +
                    + +
                    +
                    +class cassandra.metadata.MD5Token(token)
                    +

                    A token for RandomPartitioner.

                    +
                    + +
                    +
                    +class cassandra.metadata.BytesToken(token)
                    +

                    A token for ByteOrderedPartitioner.

                    +
                    +
                    +classmethod from_string(token_string)
                    +

                    token_string should be the string representation from the server.

                    +
                    + +
                    + +
                    +
                    +cassandra.metadata.ReplicationStrategy
                    +

                    alias of _ReplicationStrategy

                    +
                    + +
                    +
                    +class cassandra.metadata.ReplicationFactor(all_replicas, transient_replicas=None)
                    +

                    Represent the replication factor of a keyspace.

                    +
                    + +
                    +
                    +class cassandra.metadata.SimpleStrategy(options_map)
                    +
                    +
                    +export_for_schema()
                    +

                    Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                    +
                    + +
                    +
                    +property replication_factor
                    +

                    The replication factor for this keyspace.

                    +

                    For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
                    +
                    +
                    +export_for_schema()
                    +

                    Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                    +
                    + +
                    + +
                    +
                    +class cassandra.metadata.LocalStrategy(options_map)
                    +
                    +
                    +export_for_schema()
                    +

                    Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                    +
                    + +
                    + +
                    +
                    +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
                    +

                    Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

                    +

                    If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

                    +

                    Example usage:

                    +
                    >>> result = group_keys_by_replica(
                    +...     session, "system", "peers",
                    +...     (("127.0.0.1", ), ("127.0.0.2", )))
                    +
                    +
                    +
                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/metrics.html b/master/api/cassandra/metrics.html new file mode 100644 index 0000000000..10109ce613 --- /dev/null +++ b/master/api/cassandra/metrics.html @@ -0,0 +1,767 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.metrics - Performance Metrics

                    +
                    +
                    +class cassandra.metrics.Metrics
                    +

                    A collection of timers and counters for various performance metrics.

                    +

                    Timer metrics are represented as floating point seconds.

                    +
                    +
                    +request_timer = None
                    +

                    A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

                    +
                      +
                    • count - number of requests that have been timed

                    • +
                    • min - min latency

                    • +
                    • max - max latency

                    • +
                    • mean - mean latency

                    • +
                    • stddev - standard deviation for latencies

                    • +
                    • median - median latency

                    • +
                    • 75percentile - 75th percentile latencies

                    • +
                    • 95percentile - 95th percentile latencies

                    • +
                    • 98percentile - 98th percentile latencies

                    • +
                    • 99percentile - 99th percentile latencies

                    • +
                    • 999percentile - 99.9th percentile latencies

                    • +
                    +
                    + +
                    +
                    +connection_errors = None
                    +

                    A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

                    +
                    + +
                    +
                    +write_timeouts = None
                    +

                    A greplin.scales.IntStat count of write requests that resulted +in a timeout.

                    +
                    + +
                    +
                    +read_timeouts = None
                    +

                    A greplin.scales.IntStat count of read requests that resulted +in a timeout.

                    +
                    + +
                    +
                    +unavailables = None
                    +

                    A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

                    +
                    + +
                    +
                    +other_errors = None
                    +

                    A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

                    +
                    + +
                    +
                    +retries = None
                    +

                    A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

                    +
                    + +
                    +
                    +ignores = None
                    +

                    A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

                    +
                    + +
                    +
                    +known_hosts = None
                    +

                    A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

                    +
                    + +
                    +
                    +connected_to = None
                    +

                    A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

                    +
                    + +
                    +
                    +open_connections = None
                    +

                    A greplin.scales.IntStat count of the number connections +the driver currently has open.

                    +
                    + +
                    +
                    +get_stats()
                    +

                    Returns the metrics for the registered cluster instance.

                    +
                    + +
                    +
                    +set_stats_name(stats_name)
                    +

                    Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/policies.html b/master/api/cassandra/policies.html new file mode 100644 index 0000000000..edb59a94ee --- /dev/null +++ b/master/api/cassandra/policies.html @@ -0,0 +1,1881 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.policies - Load balancing and Failure Handling Policies

                    +
                    +

                    Load Balancing

                    +
                    +
                    +class cassandra.policies.HostDistance
                    +

                    A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

                    +
                    +
                    +IGNORED = -1
                    +

                    A node with this distance should never be queried or have +connections opened to it.

                    +
                    + +
                    +
                    +LOCAL = 0
                    +

                    Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

                    +

                    This distance is typically used for nodes within the same +datacenter as the client.

                    +
                    + +
                    +
                    +REMOTE = 1
                    +

                    Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

                    +

                    This distance is typically used for nodes outside of the +datacenter that the client is running in.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.LoadBalancingPolicy
                    +

                    Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

                    +

                    In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

                    +

                    You may also use subclasses of LoadBalancingPolicy for +custom behavior.

                    +
                    +
                    +distance(host)
                    +

                    Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                    +
                    + +
                    +
                    +populate(cluster, hosts)
                    +

                    This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                    +
                    + +
                    +
                    +make_query_plan(working_keyspace=None, query=None)
                    +

                    Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                    +

                    Note that the query argument may be None when preparing +statements.

                    +

                    working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                    +
                    + +
                    +
                    +check_supported()
                    +

                    This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.RoundRobinPolicy
                    +

                    A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

                    +
                    +
                    +populate(cluster, hosts)
                    +

                    This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                    +
                    + +
                    +
                    +distance(host)
                    +

                    Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                    +
                    + +
                    +
                    +make_query_plan(working_keyspace=None, query=None)
                    +

                    Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                    +

                    Note that the query argument may be None when preparing +statements.

                    +

                    working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                    +
                    + +
                    +
                    +on_up(host)
                    +

                    Called when a node is marked up.

                    +
                    + +
                    +
                    +on_down(host)
                    +

                    Called when a node is marked down.

                    +
                    + +
                    +
                    +on_add(host)
                    +

                    Called when a node is added to the cluster. The newly added node +should be considered up.

                    +
                    + +
                    +
                    +on_remove(host)
                    +

                    Called when a node is removed from the cluster.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
                    +

                    Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

                    +

                    The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

                    +

                    used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

                    +
                    +
                    +populate(cluster, hosts)
                    +

                    This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                    +
                    + +
                    +
                    +distance(host)
                    +

                    Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                    +
                    + +
                    +
                    +make_query_plan(working_keyspace=None, query=None)
                    +

                    Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                    +

                    Note that the query argument may be None when preparing +statements.

                    +

                    working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                    +
                    + +
                    +
                    +on_up(host)
                    +

                    Called when a node is marked up.

                    +
                    + +
                    +
                    +on_down(host)
                    +

                    Called when a node is marked down.

                    +
                    + +
                    +
                    +on_add(host)
                    +

                    Called when a node is added to the cluster. The newly added node +should be considered up.

                    +
                    + +
                    +
                    +on_remove(host)
                    +

                    Called when a node is removed from the cluster.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
                    +

                    A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

                    +

                    This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

                    +

                    The hosts parameter should be a sequence of hosts to permit +connections to.

                    +
                    +
                    +populate(cluster, hosts)
                    +

                    This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                    +
                    + +
                    +
                    +distance(host)
                    +

                    Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                    +
                    + +
                    +
                    +on_up(host)
                    +

                    Called when a node is marked up.

                    +
                    + +
                    +
                    +on_add(host)
                    +

                    Called when a node is added to the cluster. The newly added node +should be considered up.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
                    +

                    A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

                    +

                    This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

                    +

                    If no routing_key is set on the query, the child +policy’s query plan will be used as is.

                    +
                    +
                    +shuffle_replicas = False
                    +

                    Yield local replicas in a random order.

                    +
                    + +
                    +
                    +populate(cluster, hosts)
                    +

                    This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                    +
                    + +
                    +
                    +check_supported()
                    +

                    This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

                    +
                    + +
                    +
                    +distance(*args, **kwargs)
                    +

                    Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                    +
                    + +
                    +
                    +make_query_plan(working_keyspace=None, query=None)
                    +

                    Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                    +

                    Note that the query argument may be None when preparing +statements.

                    +

                    working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                    +
                    + +
                    +
                    +on_up(*args, **kwargs)
                    +

                    Called when a node is marked up.

                    +
                    + +
                    +
                    +on_down(*args, **kwargs)
                    +

                    Called when a node is marked down.

                    +
                    + +
                    +
                    +on_add(*args, **kwargs)
                    +

                    Called when a node is added to the cluster. The newly added node +should be considered up.

                    +
                    + +
                    +
                    +on_remove(*args, **kwargs)
                    +

                    Called when a node is removed from the cluster.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
                    +

                    A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

                    +

                    This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

                    +
                    def address_is_ignored(host):
                    +    return host.address in [ignored_address0, ignored_address1]
                    +
                    +blacklist_filter_policy = HostFilterPolicy(
                    +    child_policy=RoundRobinPolicy(),
                    +    predicate=address_is_ignored
                    +)
                    +
                    +cluster = Cluster(
                    +    primary_host,
                    +    load_balancing_policy=blacklist_filter_policy,
                    +)
                    +
                    +
                    +

                    See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

                    +

                    Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

                    +
                    +
                    Parameters:
                    +
                      +
                    • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

                    • +
                    • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

                    • +
                    +
                    +
                    +
                    +
                    +predicate(host)
                    +

                    A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

                    +

                    This is a read-only value set in __init__, implemented as a +property.

                    +
                    + +
                    +
                    +distance(host)
                    +

                    Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

                    +
                    + +
                    +
                    +make_query_plan(working_keyspace=None, query=None)
                    +

                    Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

                    +

                    Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
                    +

                    A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

                    +

                    If no host is set on the query, the child policy’s query plan will be used as is.

                    +
                    +
                    +populate(cluster, hosts)
                    +

                    This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                    +
                    + +
                    +
                    +make_query_plan(working_keyspace=None, query=None)
                    +

                    Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                    +

                    Note that the query argument may be None when preparing +statements.

                    +

                    working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
                    +

                    Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

                    +
                    + +
                    +
                    +

                    Translating Server Node Addresses

                    +
                    +
                    +class cassandra.policies.AddressTranslator
                    +

                    Interface for translating cluster-defined endpoints.

                    +

                    The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

                    +

                    Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

                    +
                    +
                    +translate(addr)
                    +

                    Accepts the node ip address, and returns a translated address to be used connecting to this node.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.IdentityTranslator
                    +

                    Returns the endpoint with no translation

                    +
                    +
                    +translate(addr)
                    +

                    Accepts the node ip address, and returns a translated address to be used connecting to this node.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.EC2MultiRegionTranslator
                    +

                    Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

                    +
                    +
                    +translate(addr)
                    +

                    Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

                    +
                    + +
                    + +
                    +
                    +

                    Marking Hosts Up or Down

                    +
                    +
                    +class cassandra.policies.ConvictionPolicy(host)
                    +

                    A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

                    +

                    If custom behavior is needed, this class may be subclassed.

                    +

                    host is an instance of Host.

                    +
                    +
                    +add_failure(connection_exc)
                    +

                    Implementations should return True if the host should be +convicted, False otherwise.

                    +
                    + +
                    +
                    +reset()
                    +

                    Implementations should clear out any convictions or state regarding +the host.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.SimpleConvictionPolicy(host)
                    +

                    The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

                    +

                    host is an instance of Host.

                    +
                    +
                    +add_failure(connection_exc)
                    +

                    Implementations should return True if the host should be +convicted, False otherwise.

                    +
                    + +
                    +
                    +reset()
                    +

                    Implementations should clear out any convictions or state regarding +the host.

                    +
                    + +
                    + +
                    +
                    +

                    Reconnecting to Dead Hosts

                    +
                    +
                    +class cassandra.policies.ReconnectionPolicy
                    +

                    This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

                    +

                    If custom behavior is needed, this class may be subclassed.

                    +
                    +
                    +new_schedule()
                    +

                    This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
                    +

                    A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

                    +

                    delay should be a floating point number of seconds to wait inbetween +each attempt.

                    +

                    max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

                    +
                    +
                    +new_schedule()
                    +

                    This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
                    +

                    A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

                    +

                    A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

                    +

                    base_delay and max_delay should be in floating point units of +seconds.

                    +

                    max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

                    +
                    +
                    +new_schedule()
                    +

                    This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                    +
                    + +
                    + +
                    +
                    +

                    Retrying Failed Operations

                    +
                    +
                    +class cassandra.policies.WriteType
                    +

                    For usage with RetryPolicy, this describe a type +of write operation.

                    +
                    +
                    +SIMPLE = 0
                    +

                    A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

                    +
                    + +
                    +
                    +BATCH = 1
                    +

                    A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

                    +
                    + +
                    +
                    +UNLOGGED_BATCH = 2
                    +

                    A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

                    +
                    + +
                    +
                    +COUNTER = 3
                    +

                    A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

                    +
                    + +
                    +
                    +BATCH_LOG = 4
                    +

                    The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

                    +
                    + +
                    +
                    +CAS = 5
                    +

                    A lighweight-transaction write, such as “DELETE … IF EXISTS”.

                    +
                    + +
                    +
                    +VIEW = 6
                    +

                    This WriteType is only seen in results for requests that were unable to +complete MV operations.

                    +
                    + +
                    +
                    +CDC = 7
                    +

                    This WriteType is only seen in results for requests that were unable to +complete CDC operations.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.RetryPolicy
                    +

                    A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

                    +

                    To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

                    +

                    To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

                    +

                    If custom behavior is needed for retrying certain operations, +this class may be subclassed.

                    +
                    +
                    +RETRY = 0
                    +

                    This should be returned from the below methods if the operation +should be retried on the same connection.

                    +
                    + +
                    +
                    +RETHROW = 1
                    +

                    This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

                    +
                    + +
                    +
                    +IGNORE = 2
                    +

                    This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

                    +
                    + +
                    +
                    +RETRY_NEXT_HOST = 3
                    +

                    This should be returned from the below methods if the operation +should be retried on another connection.

                    +
                    + +
                    +
                    +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
                    +

                    This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                    +
                    + +
                    +
                    +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
                    +

                    This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    write_type is one of the WriteType enums describing the +type of write operation.

                    +

                    The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                    +
                    + +
                    +
                    +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
                    +

                    This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                    +

                    query is the Statement that failed.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                    +
                    + +
                    +
                    +on_request_error(query, consistency, error, retry_num)
                    +

                    This is called when an unexpected error happens. This can be in the +following situations:

                    +
                      +
                    • On a connection error

                    • +
                    • On server errors: overloaded, isBootstrapping, serverError, etc.

                    • +
                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    error the instance of the exception.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    The default, it triggers a retry on the next host in the query plan +with the same consistency level.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.FallthroughRetryPolicy
                    +

                    A retry policy that never retries and always propagates failures to +the application.

                    +
                    +
                    +on_read_timeout(*args, **kwargs)
                    +

                    This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                    +
                    + +
                    +
                    +on_write_timeout(*args, **kwargs)
                    +

                    This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    write_type is one of the WriteType enums describing the +type of write operation.

                    +

                    The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                    +
                    + +
                    +
                    +on_unavailable(*args, **kwargs)
                    +

                    This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                    +

                    query is the Statement that failed.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                    +
                    + +
                    +
                    +on_request_error(*args, **kwargs)
                    +

                    This is called when an unexpected error happens. This can be in the +following situations:

                    +
                      +
                    • On a connection error

                    • +
                    • On server errors: overloaded, isBootstrapping, serverError, etc.

                    • +
                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    error the instance of the exception.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    The default, it triggers a retry on the next host in the query plan +with the same consistency level.

                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
                    +

                    Deprecated: This retry policy will be removed in the next major release.

                    +

                    A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

                    +

                    BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

                    +

                    This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

                    +
                      +
                    • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

                    • +
                    • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

                    • +
                    • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

                    • +
                    +

                    The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

                    +
                      +
                    • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

                    • +
                    • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

                    • +
                    +

                    In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

                    +
                    +
                    +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
                    +

                    This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                    +
                    + +
                    +
                    +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
                    +

                    This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                    +

                    query is the Statement that timed out.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    write_type is one of the WriteType enums describing the +type of write operation.

                    +

                    The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                    +
                    + +
                    +
                    +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
                    +

                    This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                    +

                    query is the Statement that failed.

                    +

                    consistency is the ConsistencyLevel that the operation was +attempted at.

                    +

                    required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                    +

                    retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                    +

                    By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                    +
                    + +
                    + +
                    +
                    +

                    Retrying Idempotent Operations

                    +
                    +
                    +class cassandra.policies.SpeculativeExecutionPolicy
                    +

                    Interface for specifying speculative execution plans

                    +
                    +
                    +new_plan(keyspace, statement)
                    +

                    Returns

                    +
                    +
                    Parameters:
                    +
                      +
                    • keyspace

                    • +
                    • statement

                    • +
                    +
                    +
                    Returns:
                    +

                    +
                    +
                    +
                    + +
                    + +
                    +
                    +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
                    +

                    A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

                    +
                    +
                    +new_plan(keyspace, statement)
                    +

                    Returns

                    +
                    +
                    Parameters:
                    +
                      +
                    • keyspace

                    • +
                    • statement

                    • +
                    +
                    +
                    Returns:
                    +

                    +
                    +
                    +
                    + +
                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/pool.html b/master/api/cassandra/pool.html new file mode 100644 index 0000000000..cf54284b9c --- /dev/null +++ b/master/api/cassandra/pool.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.pool - Hosts and Connection Pools

                    +

                    Connection pooling and host management.

                    +
                    +
                    +class cassandra.pool.Host
                    +

                    Represents a single Cassandra node.

                    +
                    +
                    +property address
                    +

                    The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

                    +
                    + +
                    +
                    +property datacenter
                    +

                    The datacenter the node is in.

                    +
                    + +
                    +
                    +property rack
                    +

                    The rack the node is in.

                    +
                    + +
                    + +
                    +
                    +exception cassandra.pool.NoConnectionsAvailable
                    +

                    All existing connections to a given host are busy, or there are +no open connections.

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/protocol.html b/master/api/cassandra/protocol.html new file mode 100644 index 0000000000..2ccf5c6b2d --- /dev/null +++ b/master/api/cassandra/protocol.html @@ -0,0 +1,733 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.protocol - Protocol Features

                    +
                    +

                    Custom Payloads

                    +

                    Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

                    +

                    By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

                    +

                    See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

                    +
                    +
                    +class cassandra.protocol._ProtocolHandler
                    +

                    _ProtocolHander handles encoding and decoding messages.

                    +

                    This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

                    +

                    Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

                    +
                    +
                    +message_types_by_opcode = {default mapping}
                    +
                    + +
                    +
                    +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
                    +

                    Encodes a message using the specified frame parameters, and compressor

                    +
                    +
                    Parameters:
                    +
                      +
                    • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

                    • +
                    • stream_id – protocol stream id for the frame header

                    • +
                    • protocol_version – version for the frame header, and used encoding contents

                    • +
                    • compressor – optional compression function to be used on the body

                    • +
                    +
                    +
                    +
                    + +
                    +
                    +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
                    +

                    Decodes a native protocol message body

                    +
                    +
                    Parameters:
                    +
                      +
                    • protocol_version – version to use decoding contents

                    • +
                    • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

                    • +
                    • stream_id – native protocol stream id from the frame header

                    • +
                    • flags – native protocol flags bitmap from the header

                    • +
                    • opcode – native protocol opcode from the header

                    • +
                    • body – frame body

                    • +
                    • decompressor – optional decompression function to inflate the body

                    • +
                    +
                    +
                    Returns:
                    +

                    a message decoded from the body and frame attributes

                    +
                    +
                    +
                    + +
                    + +
                    +
                    +

                    Faster Deserialization

                    +

                    When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

                    +
                    from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
                    +from cassandra.query import tuple_factory
                    +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
                    +s.row_factory = tuple_factory  #required for Numpy results
                    +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
                    +
                    +
                    +

                    These protocol handlers comprise different parsers, and return results as described below:

                    +
                      +
                    • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

                    • +
                    • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

                    • +
                    • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

                    • +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/query.html b/master/api/cassandra/query.html new file mode 100644 index 0000000000..69e54999f7 --- /dev/null +++ b/master/api/cassandra/query.html @@ -0,0 +1,1040 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

                    +
                    +
                    +cassandra.query.tuple_factory(colnames, rows)
                    +

                    Returns each row as a tuple

                    +

                    Example:

                    +
                    >>> from cassandra.query import tuple_factory
                    +>>> session = cluster.connect('mykeyspace')
                    +>>> session.row_factory = tuple_factory
                    +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                    +>>> print rows[0]
                    +('Bob', 42)
                    +
                    +
                    +
                    +

                    Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                    +
                    +
                    + +
                    +
                    +cassandra.query.named_tuple_factory(colnames, rows)
                    +

                    Returns each row as a namedtuple. +This is the default row factory.

                    +

                    Example:

                    +
                    >>> from cassandra.query import named_tuple_factory
                    +>>> session = cluster.connect('mykeyspace')
                    +>>> session.row_factory = named_tuple_factory
                    +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                    +>>> user = rows[0]
                    +
                    +>>> # you can access field by their name:
                    +>>> print "name: %s, age: %d" % (user.name, user.age)
                    +name: Bob, age: 42
                    +
                    +>>> # or you can access fields by their position (like a tuple)
                    +>>> name, age = user
                    +>>> print "name: %s, age: %d" % (name, age)
                    +name: Bob, age: 42
                    +>>> name = user[0]
                    +>>> age = user[1]
                    +>>> print "name: %s, age: %d" % (name, age)
                    +name: Bob, age: 42
                    +
                    +
                    +
                    +

                    Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                    +
                    +
                    + +
                    +
                    +cassandra.query.dict_factory(colnames, rows)
                    +

                    Returns each row as a dict.

                    +

                    Example:

                    +
                    >>> from cassandra.query import dict_factory
                    +>>> session = cluster.connect('mykeyspace')
                    +>>> session.row_factory = dict_factory
                    +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                    +>>> print rows[0]
                    +{u'age': 42, u'name': u'Bob'}
                    +
                    +
                    +
                    +

                    Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                    +
                    +
                    + +
                    +
                    +cassandra.query.ordered_dict_factory(colnames, rows)
                    +

                    Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

                    +
                    +

                    Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                    +
                    +
                    + +
                    +
                    +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                    +

                    A simple, un-prepared query.

                    +

                    query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                    +

                    See Statement attributes for a description of the other parameters.

                    +
                    + +
                    +
                    +class cassandra.query.PreparedStatement
                    +

                    A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

                    +

                    A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

                    +

                    A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

                    +
                    +
                    +bind(values)
                    +

                    Creates and returns a BoundStatement instance using values.

                    +

                    See BoundStatement.bind() for rules on input values.

                    +
                    + +
                    + +
                    +
                    +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
                    +

                    A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

                    +

                    prepared_statement should be an instance of PreparedStatement.

                    +

                    See Statement attributes for a description of the other parameters.

                    +
                    +
                    +bind(values)
                    +

                    Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

                    +
                      +
                    • a sequence, even if you are only binding one value, or

                    • +
                    • a dict that relates 1-to-1 between dict keys and columns

                    • +
                    +
                    +

                    Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

                    +
                      +
                    • short sequences will be extended to match bind parameters with UNSET_VALUE

                    • +
                    • names may be omitted from a dict with UNSET_VALUE implied.

                    • +
                    +
                    +
                    +

                    Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

                    +
                    +
                    + +
                    +
                    +property routing_key
                    +

                    The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

                    +

                    If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

                    +
                    + +
                    + +
                    +
                    +class cassandra.query.Statement
                    +

                    An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

                    +
                    +
                    +property routing_key
                    +

                    The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

                    +

                    If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

                    +
                    + +
                    +
                    +property serial_consistency_level
                    +

                    The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

                    +

                    The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

                    +

                    The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

                    +

                    Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

                    +

                    See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    + +
                    + +
                    +
                    +cassandra.query.UNSET_VALUE
                    +

                    The base class of the class hierarchy.

                    +

                    When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                    +
                    + +
                    +
                    +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
                    +

                    A protocol-level batch of operations which are applied atomically +by default.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +

                    batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

                    +

                    retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

                    +

                    consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

                    +

                    custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

                    +

                    Example usage:

                    +
                    insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
                    +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
                    +
                    +for (name, age) in users_to_insert:
                    +    batch.add(insert_user, (name, age))
                    +
                    +session.execute(batch)
                    +
                    +
                    +

                    You can also mix different types of operations within a batch:

                    +
                    batch = BatchStatement()
                    +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
                    +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
                    +session.execute(batch)
                    +
                    +
                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    +

                    Changed in version 2.1.0: Added serial_consistency_level as a parameter

                    +
                    +
                    +

                    Changed in version 2.6.0: Added custom_payload as a parameter

                    +
                    +
                    +
                    +add(statement, parameters=None)
                    +

                    Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

                    +

                    Like with other statements, parameters must be a sequence, even +if there is only one item.

                    +
                    + +
                    +
                    +add_all(statements, parameters)
                    +

                    Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

                    +
                    + +
                    +
                    +clear()
                    +

                    This is a convenience method to clear a batch statement for reuse.

                    +

                    Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

                    +
                    + +
                    +
                    +serial_consistency_level = None
                    +
                    + +
                    + +
                    +
                    +class cassandra.query.BatchType
                    +

                    A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

                    +
                    +

                    New in version 2.0.0.

                    +
                    +
                    +
                    +LOGGED = BatchType.LOGGED
                    +
                    + +
                    +
                    +UNLOGGED = BatchType.UNLOGGED
                    +
                    + +
                    +
                    +COUNTER = BatchType.COUNTER
                    +
                    + +
                    + +
                    +
                    +class cassandra.query.ValueSequence(iterable=(), /)
                    +

                    A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

                    +

                    This is typically needed when supplying a list of keys to select. +For example:

                    +
                    >>> my_user_ids = ('alice', 'bob', 'charles')
                    +>>> query = "SELECT * FROM users WHERE user_id IN %s"
                    +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.query.QueryTrace
                    +

                    A trace of the duration and events that occurred when executing +an operation.

                    +
                    +
                    +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
                    +

                    Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

                    +

                    wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

                    +

                    query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

                    +
                    + +
                    + +
                    +
                    +class cassandra.query.TraceEvent
                    +

                    Representation of a single event within a query trace.

                    +
                    + +
                    +
                    +exception cassandra.query.TraceUnavailable
                    +

                    Raised when complete trace details cannot be fetched from Cassandra.

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/timestamps.html b/master/api/cassandra/timestamps.html new file mode 100644 index 0000000000..e81bebffd6 --- /dev/null +++ b/master/api/cassandra/timestamps.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.timestamps - Timestamp Generation

                    +
                    +
                    +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
                    +

                    An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

                    +
                    +

                    New in version 3.8.0.

                    +
                    +
                    +
                    +warn_on_drift = True
                    +

                    If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

                    +
                    + +
                    +
                    +warning_threshold = 1
                    +

                    This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

                    +
                    + +
                    +
                    +warning_interval = 1
                    +

                    This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

                    +
                    + +
                    +
                    +_next_timestamp(now, last)
                    +

                    Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

                    +
                    +
                    Parameters:
                    +
                      +
                    • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

                    • +
                    • last (int) – an integer representing the last timestamp returned by +this object

                    • +
                    +
                    +
                    +
                    + +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/cassandra/util.html b/master/api/cassandra/util.html new file mode 100644 index 0000000000..73e77dc974 --- /dev/null +++ b/master/api/cassandra/util.html @@ -0,0 +1,1083 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    cassandra.util - Utilities

                    +
                    +
                    +class cassandra.util.Date(value)
                    +

                    Idealized date: year, month, day

                    +

                    Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

                    +

                    Initializer value can be:

                    +
                      +
                    • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

                    • +
                    • datetime.date: built-in date

                    • +
                    • string_type: a string time of the form “yyyy-mm-dd”

                    • +
                    +
                    +
                    +date()
                    +

                    Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

                    +

                    ValueError is raised for Dates outside this range.

                    +
                    + +
                    +
                    +property seconds
                    +

                    Absolute seconds from epoch (can be negative)

                    +
                    + +
                    + +
                    +
                    +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
                    +

                    DSE DateRange Type

                    +
                    +
                    +lower_bound
                    +

                    DateRangeBound representing the lower bound of a bounded range.

                    +
                    + +
                    +
                    +upper_bound
                    +

                    DateRangeBound representing the upper bound of a bounded range.

                    +
                    + +
                    +
                    +value
                    +

                    DateRangeBound representing the value of a single-value range.

                    +
                    + +

                    As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

                    +
                    +
                    Parameters:
                    +
                    +
                    +
                    +
                    + +
                    +
                    +class cassandra.util.DateRangeBound(value, precision)
                    +

                    Represents a single date value and its precision for DateRange.

                    +
                    +
                    +milliseconds
                    +

                    Integer representing milliseconds since the UNIX epoch. May be negative.

                    +
                    + +
                    +
                    +precision
                    +

                    String representing the precision of a bound. Must be a valid +DateRangePrecision member.

                    +
                    + +

                    DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

                    +
                    +
                    Parameters:
                    +
                      +
                    • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

                    • +
                    • precision – a string representing precision

                    • +
                    +
                    +
                    +
                    +
                    +datetime()
                    +

                    Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

                    +
                    + +
                    +
                    +classmethod from_value(value)
                    +

                    Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

                    +
                    +
                    Parameters:
                    +

                    value – a dictlike or iterable object

                    +
                    +
                    +
                    + +
                    + +
                    +
                    +class cassandra.util.DateRangePrecision
                    +

                    An “enum” representing the valid values for DateRange.precision.

                    +
                    + +
                    +
                    +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
                    +

                    Represents a Distance geometry for DSE

                    +
                    +
                    +static from_wkt(s)
                    +

                    Parse a Distance geometry from a wkt string and return a new Distance object.

                    +
                    + +
                    + +
                    +
                    +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
                    +

                    Cassandra Duration Type

                    +
                    + +
                    +
                    +class cassandra.util.LineString(coords=())
                    +

                    Represents a linestring geometry for DSE

                    +

                    ‘coords`: a sequence of (x, y) coordinates of points in the linestring

                    +
                    +
                    +static from_wkt(s)
                    +

                    Parse a LineString geometry from a wkt string and return a new LineString object.

                    +
                    + +
                    + +
                    +
                    +class cassandra.util.OrderedMap(*args, **kwargs)
                    +

                    An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

                    +
                    >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
                    +...                  ({'three': 3, 'four': 4}, 'value2')])
                    +>>> list(od.keys())
                    +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
                    +>>> list(od.values())
                    +['value', 'value2']
                    +
                    +
                    +

                    These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

                    +
                    CREATE TABLE example (
                    +    ...
                    +    value map<frozen<map<int, int>>, double>
                    +    ...
                    +)
                    +
                    +
                    +

                    This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

                    +
                    + +
                    +
                    +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
                    +
                    + +
                    +
                    +class cassandra.util.Point(x=nan, y=nan)
                    +

                    Represents a point geometry for DSE

                    +
                    +
                    +static from_wkt(s)
                    +

                    Parse a Point geometry from a wkt string and return a new Point object.

                    +
                    + +
                    + +
                    +
                    +class cassandra.util.Polygon(exterior=(), interiors=None)
                    +

                    Represents a polygon geometry for DSE

                    +

                    ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

                    +
                    +
                    +static from_wkt(s)
                    +

                    Parse a Polygon geometry from a wkt string and return a new Polygon object.

                    +
                    + +
                    + +
                    +
                    +class cassandra.util.SortedSet(iterable=())
                    +

                    A sorted set based on sorted list

                    +

                    A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

                    +

                    #Not implemented: update functions, inplace operators

                    +
                    + +
                    +
                    +class cassandra.util.Time(value)
                    +

                    Idealized time, independent of day.

                    +

                    Up to nanosecond resolution

                    +

                    Initializer value can be:

                    +
                      +
                    • integer_type: absolute nanoseconds in the day

                    • +
                    • datetime.time: built-in time

                    • +
                    • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

                    • +
                    +
                    +
                    +property hour
                    +

                    The hour component of this time (0-23)

                    +
                    + +
                    +
                    +property minute
                    +

                    The minute component of this time (0-59)

                    +
                    + +
                    +
                    +property nanosecond
                    +

                    The fractional seconds component of the time, in nanoseconds

                    +
                    + +
                    +
                    +property second
                    +

                    The second component of this time (0-59)

                    +
                    + +
                    +
                    +time()
                    +

                    Return a built-in datetime.time (nanosecond precision truncated to micros).

                    +
                    + +
                    + +
                    +
                    +class cassandra.util.Version(version)
                    +

                    Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

                    +

                    TODO: when python2 support is removed, use packaging.version.

                    +
                    + +
                    +
                    +cassandra.util.datetime_from_timestamp(timestamp)
                    +

                    Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

                    +
                    +
                    Parameters:
                    +

                    timestamp – a unix timestamp, in seconds

                    +
                    +
                    +
                    + +
                    +
                    +cassandra.util.datetime_from_uuid1(uuid_arg)
                    +

                    Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

                    +
                    +
                    Parameters:
                    +

                    uuid_arg – a version 1 UUID

                    +
                    +
                    +
                    + +
                    +
                    +cassandra.util.max_uuid_from_time(timestamp)
                    +

                    Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

                    +

                    See uuid_from_time() for argument and return types.

                    +
                    + +
                    +
                    +cassandra.util.min_uuid_from_time(timestamp)
                    +

                    Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

                    +

                    See uuid_from_time() for argument and return types.

                    +
                    + +
                    +
                    +cassandra.util.ms_timestamp_from_datetime(dt)
                    +

                    Converts a datetime to a timestamp expressed in milliseconds.

                    +
                    +
                    Parameters:
                    +

                    dt – a datetime.datetime

                    +
                    +
                    +
                    + +
                    +
                    +cassandra.util.sortedset
                    +

                    alias of SortedSet

                    +
                    + +
                    +
                    +cassandra.util.unix_time_from_uuid1(uuid_arg)
                    +

                    Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

                    +
                    +
                    Parameters:
                    +

                    uuid_arg – a version 1 UUID

                    +
                    +
                    +
                    + +
                    +
                    +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
                    +

                    Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

                    +

                    Raises an OverflowError if the timestamp is out of range for +datetime.

                    +
                    +
                    Parameters:
                    +

                    timestamp – timestamp, in milliseconds

                    +
                    +
                    +
                    + +
                    +
                    +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
                    +

                    Converts a datetime or timestamp to a type 1 uuid.UUID.

                    +
                    +
                    Parameters:
                    +
                      +
                    • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

                    • +
                    • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

                    • +
                    • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

                    • +
                    +
                    +
                    Return type:
                    +

                    uuid.UUID

                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/api/index.html b/master/api/index.html new file mode 100644 index 0000000000..deef1f1607 --- /dev/null +++ b/master/api/index.html @@ -0,0 +1,873 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    API Documentation

                    +
                    +

                    Core Driver

                    +
                    + +
                    +
                    +
                    +

                    Object Mapper

                    + +
                    +
                    +

                    DataStax Graph

                    + +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/batches.html b/master/cqlengine/batches.html new file mode 100644 index 0000000000..5cc189a992 --- /dev/null +++ b/master/cqlengine/batches.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Batch Queries

                    +

                    cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

                    +
                    +

                    Batch Query General Use Pattern

                    +

                    You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

                    +
                    from cassandra.cqlengine.query import BatchQuery
                    +
                    +#using a context manager
                    +with BatchQuery() as b:
                    +    now = datetime.now()
                    +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
                    +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
                    +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
                    +
                    +# -- or --
                    +
                    +#manually
                    +b = BatchQuery()
                    +now = datetime.now()
                    +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
                    +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
                    +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
                    +b.execute()
                    +
                    +# updating in a batch
                    +
                    +b = BatchQuery()
                    +em1.description = "new description"
                    +em1.batch(b).save()
                    +em2.description = "another new description"
                    +em2.batch(b).save()
                    +b.execute()
                    +
                    +# deleting in a batch
                    +b = BatchQuery()
                    +ExampleModel.objects(id=some_id).batch(b).delete()
                    +ExampleModel.objects(id=some_id2).batch(b).delete()
                    +b.execute()
                    +
                    +
                    +

                    Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

                    +
                    with BatchQuery(execute_on_exception=True) as b:
                    +    LogEntry.batch(b).create(k=1, v=1)
                    +    mystery_function() # exception thrown in here
                    +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
                    +
                    +
                    +

                    If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

                    +
                    +
                    +

                    Batch Query Execution Callbacks

                    +

                    In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

                    +

                    Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

                    +

                    The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

                    +
                    def my_callback(*args, **kwargs):
                    +    pass
                    +
                    +batch = BatchQuery()
                    +
                    +batch.add_callback(my_callback)
                    +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
                    +
                    +# if you need reference to the batch within the callback,
                    +# just trap it in the arguments to be passed to the callback:
                    +batch.add_callback(my_callback, cqlengine_batch=batch)
                    +
                    +# once the batch executes...
                    +batch.execute()
                    +
                    +# the effect of the above scheduled callbacks will be similar to
                    +my_callback()
                    +my_callback('positional arg', named_arg='named arg value')
                    +my_callback(cqlengine_batch=batch)
                    +
                    +
                    +

                    Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

                    +
                    +

                    Logged vs Unlogged Batches

                    +

                    By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

                    +
                    from cassandra.cqlengine.query import BatchType
                    +with BatchQuery(batch_type=BatchType.Unlogged) as b:
                    +    LogEntry.batch(b).create(k=1, v=1)
                    +    LogEntry.batch(b).create(k=1, v=2)
                    +
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/connections.html b/master/cqlengine/connections.html new file mode 100644 index 0000000000..ae3b519cab --- /dev/null +++ b/master/cqlengine/connections.html @@ -0,0 +1,756 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Connections

                    +

                    Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

                    +
                    +

                    Register a new connection

                    +

                    To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

                    +
                    from cassandra.cqlengine import connection
                    +
                    +connection.setup(['127.0.0.1')
                    +connection.register_connection('cluster2', ['127.0.0.2'])
                    +
                    +
                    +

                    register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

                    +
                    from cassandra.cqlengine import connection
                    +from cassandra.cluster import Cluster
                    +
                    +session = Cluster(['127.0.0.1']).connect()
                    +connection.register_connection('cluster3', session=session)
                    +
                    +
                    +
                    +
                    +

                    Change the default connection

                    +

                    You can change the default cqlengine connection on registration:

                    +
                    from cassandra.cqlengine import connection
                    +
                    +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
                    +
                    +
                    +

                    or on the fly using set_default_connection()

                    +
                    connection.set_default_connection('cluster2')
                    +
                    +
                    +
                    +
                    +

                    Unregister a connection

                    +

                    You can unregister a connection using unregister_connection():

                    +
                    connection.unregister_connection('cluster2')
                    +
                    +
                    +
                    +
                    +

                    Management

                    +

                    When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

                    +
                    from cassandra.cqlengine import management
                    +
                    +keyspaces = ['ks1', 'ks2']
                    +conns = ['cluster1', 'cluster2']
                    +
                    +# registers your connections
                    +# ...
                    +
                    +# create all keyspaces on all connections
                    +for ks in keyspaces:
                    +    management.create_simple_keyspace(ks, connections=conns)
                    +
                    +# define your Automobile model
                    +# ...
                    +
                    +# sync your models
                    +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
                    +
                    +
                    +
                    +
                    +

                    Connection Selection

                    +

                    cqlengine will select the default connection, unless your specify a connection using one of the following methods.

                    +
                    +

                    Default Model Connection

                    +

                    You can specify a default connection per model:

                    +
                    class Automobile(Model):
                    +    __keyspace__ = 'test'
                    +    __connection__ = 'cluster2'
                    +    manufacturer = columns.Text(primary_key=True)
                    +    year = columns.Integer(primary_key=True)
                    +    model = columns.Text(primary_key=True)
                    +
                    +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
                    +
                    +
                    +
                    +
                    +

                    QuerySet and model instance

                    +

                    You can use the using() method to select a connection (or keyspace):

                    +
                    Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
                    +q = Automobile.objects.filter(manufacturer='Tesla')
                    +autos = q.using(keyspace='ks2', connection='cluster2').all()
                    +
                    +for auto in autos:
                    +    auto.using(connection='cluster1').save()
                    +
                    +
                    +
                    +
                    +

                    Context Manager

                    +

                    You can use the ContextQuery as well to select a connection:

                    +
                    with ContextQuery(Automobile, connection='cluster1') as A:
                    +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
                    +
                    +
                    +
                    +
                    +

                    BatchQuery

                    +

                    With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

                    +
                    with BatchQuery(connection='cluster1') as b:
                    +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
                    +
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/faq.html b/master/cqlengine/faq.html new file mode 100644 index 0000000000..a80299ede8 --- /dev/null +++ b/master/cqlengine/faq.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Frequently Asked Questions

                    +
                    +

                    Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

                    +

                    The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

                    +
                    +
                    +

                    How to preserve ordering in batch query?

                    +

                    Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

                    +
                      +
                    • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

                    • +
                    • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

                    • +
                    • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

                    • +
                    +

                    Below is an example to show this scenario.

                    +
                    class MyMode(Model):
                    +    id    = columns.Integer(primary_key=True)
                    +    count = columns.Integer()
                    +    text  = columns.Text()
                    +
                    +with BatchQuery() as b:
                    +   MyModel.batch(b).create(id=1, count=2, text='123')
                    +   MyModel.batch(b).create(id=1, count=3, text='111')
                    +
                    +assert MyModel.objects(id=1).first().count == 3
                    +assert MyModel.objects(id=1).first().text  == '123'
                    +
                    +
                    +

                    The largest value of count is 3, and the largest value of text would be ‘123’.

                    +

                    The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

                    +
                    with BatchQuery() as b:
                    +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
                    +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
                    +
                    +assert MyModel.objects(id=1).first().count == 3
                    +assert MyModel.objects(id=1).first().text  == '111'
                    +
                    +
                    +
                    +
                    +

                    How can I delete individual values from a row?

                    +

                    When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

                    +
                    class MyModel(Model):
                    +    id    = columns.Integer(primary_key=True)
                    +    text  = columns.Text()
                    +
                    +m = MyModel.create(id=1, text='We can delete this with None')
                    +assert MyModel.objects(id=1).first().text is not None
                    +
                    +m.update(text=None)
                    +assert MyModel.objects(id=1).first().text is None
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/models.html b/master/cqlengine/models.html new file mode 100644 index 0000000000..5088876f23 --- /dev/null +++ b/master/cqlengine/models.html @@ -0,0 +1,821 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Models

                    +

                    A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

                    +

                    Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

                    +

                    Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

                    +
                    +

                    Example Definitions

                    +

                    This example defines a Person table, with the columns first_name and last_name

                    +
                    from cassandra.cqlengine import columns
                    +from cassandra.cqlengine.models import Model
                    +
                    + class Person(Model):
                    +     id = columns.UUID(primary_key=True)
                    +     first_name  = columns.Text()
                    +     last_name = columns.Text()
                    +
                    +
                    +

                    The Person model would create this CQL table:

                    +
                    CREATE TABLE cqlengine.person (
                    +    id uuid,
                    +    first_name text,
                    +    last_name text,
                    +    PRIMARY KEY (id)
                    +);
                    +
                    +
                    +

                    Here’s an example of a comment table created with clustering keys, in descending order:

                    +
                    from cassandra.cqlengine import columns
                    +from cassandra.cqlengine.models import Model
                    +
                    +class Comment(Model):
                    +    photo_id = columns.UUID(primary_key=True)
                    +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
                    +    comment = columns.Text()
                    +
                    +
                    +

                    The Comment model’s create table would look like the following:

                    +
                    CREATE TABLE comment (
                    +  photo_id uuid,
                    +  comment_id timeuuid,
                    +  comment text,
                    +  PRIMARY KEY (photo_id, comment_id)
                    +) WITH CLUSTERING ORDER BY (comment_id DESC);
                    +
                    +
                    +

                    To sync the models to the database, you may do the following*:

                    +
                    from cassandra.cqlengine.management import sync_table
                    +sync_table(Person)
                    +sync_table(Comment)
                    +
                    +
                    +

                    *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

                    +

                    For examples on manipulating data and creating queries, see Making Queries

                    +
                    +
                    +

                    Manipulating model instances as dictionaries

                    +

                    Model instances can be accessed like dictionaries.

                    +
                    class Person(Model):
                    +    first_name  = columns.Text()
                    +    last_name = columns.Text()
                    +
                    +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
                    +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
                    +kevin['first_name']  # returns 'Kevin'
                    +kevin.keys()  # returns ['first_name', 'last_name']
                    +kevin.values()  # returns ['Kevin', 'Deldycke']
                    +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
                    +
                    +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
                    +
                    +
                    +
                    +
                    +

                    Extending Model Validation

                    +

                    Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

                    +

                    However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

                    +
                    class Member(Model):
                    +    person_id = UUID(primary_key=True)
                    +    name = Text(required=True)
                    +
                    +    def validate(self):
                    +        super(Member, self).validate()
                    +        if self.name == 'jon':
                    +            raise ValidationError('no jon\'s allowed')
                    +
                    +
                    +

                    Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

                    +
                    +
                    +

                    Model Inheritance

                    +

                    It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

                    +

                    For instance, suppose you want a table that stores rows of pets owned by an owner:

                    +
                    class Pet(Model):
                    +    __table_name__ = 'pet'
                    +    owner_id = UUID(primary_key=True)
                    +    pet_id = UUID(primary_key=True)
                    +    pet_type = Text(discriminator_column=True)
                    +    name = Text()
                    +
                    +    def eat(self, food):
                    +        pass
                    +
                    +    def sleep(self, time):
                    +        pass
                    +
                    +class Cat(Pet):
                    +    __discriminator_value__ = 'cat'
                    +    cuteness = Float()
                    +
                    +    def tear_up_couch(self):
                    +        pass
                    +
                    +class Dog(Pet):
                    +    __discriminator_value__ = 'dog'
                    +    fierceness = Float()
                    +
                    +    def bark_all_night(self):
                    +        pass
                    +
                    +
                    +

                    After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

                    +

                    To setup a model structure with inheritance, follow these steps

                    +
                      +
                    1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

                    2. +
                    3. Create subclass models, and define a unique __discriminator_value__ value on each

                    4. +
                    5. Run sync_table on each of the sub tables

                    6. +
                    +

                    About the discriminator value

                    +

                    The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

                    +
                    +
                    +

                    User Defined Types

                    +

                    cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

                    +
                    from cassandra.cqlengine.columns import *
                    +from cassandra.cqlengine.models import Model
                    +from cassandra.cqlengine.usertype import UserType
                    +
                    +class address(UserType):
                    +    street = Text()
                    +    zipcode = Integer()
                    +
                    +class users(Model):
                    +    __keyspace__ = 'account'
                    +    name = Text(primary_key=True)
                    +    addr = UserDefinedType(address)
                    +
                    +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
                    +user = users.objects(name="Joe")[0]
                    +print user.name, user.addr
                    +# Joe address(street=u'Easy St.', zipcode=99999)
                    +
                    +
                    +

                    UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

                    +

                    sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

                    +

                    Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

                    +

                    *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/queryset.html b/master/cqlengine/queryset.html new file mode 100644 index 0000000000..2bfbb51873 --- /dev/null +++ b/master/cqlengine/queryset.html @@ -0,0 +1,997 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Making Queries

                    +
                    +

                    Retrieving objects

                    +

                    Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

                    +
                    +

                    Retrieving all objects

                    +

                    The simplest query you can make is to return all objects from a table.

                    +

                    This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

                    +

                    Using the Person example model, we would get all Person objects like this:

                    +
                    all_objects = Person.objects.all()
                    +
                    +
                    +
                    +
                    +

                    Retrieving objects with filters

                    +

                    Typically, you’ll want to query only a subset of the records in your database.

                    +

                    That can be accomplished with the QuerySet’s .filter(\*\*) method.

                    +

                    For example, given the model definition:

                    +
                    class Automobile(Model):
                    +    manufacturer = columns.Text(primary_key=True)
                    +    year = columns.Integer(primary_key=True)
                    +    model = columns.Text()
                    +    price = columns.Decimal()
                    +    options = columns.Set(columns.Text)
                    +
                    +
                    +

                    …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +
                    +
                    +

                    You can also use the more convenient syntax:

                    +
                    q = Automobile.objects(Automobile.manufacturer == 'Tesla')
                    +
                    +
                    +

                    We can then further filter our query with another call to .filter

                    +
                    q = q.filter(year=2012)
                    +
                    +
                    +

                    Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

                    +
                    +
                    +
                    +

                    Accessing objects in a QuerySet

                    +

                    There are several methods for getting objects out of a queryset

                    +
                      +
                    • +
                      iterating over the queryset
                      for car in Automobile.objects.all():
                      +    #...do something to the car instance
                      +    pass
                      +
                      +
                      +
                      +
                      +
                    • +
                    • +
                      list index
                      q = Automobile.objects.all()
                      +q[0] #returns the first result
                      +q[1] #returns the second result
                      +
                      +
                      +
                      +

                      Note

                      +
                        +
                      • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

                      • +
                      • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                      • +
                      +
                      +
                      +
                      +
                    • +
                    • +
                      list slicing
                      q = Automobile.objects.all()
                      +q[1:] #returns all results except the first
                      +q[1:9] #returns a slice of the results
                      +
                      +
                      +
                      +

                      Note

                      +
                        +
                      • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

                      • +
                      • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                      • +
                      +
                      +
                      +
                      +
                    • +
                    • +
                      calling get() on the queryset
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year=2012)
                      +car = q.get()
                      +
                      +
                      +

                      this returns the object matching the queryset

                      +
                      +
                      +
                    • +
                    • +
                      calling first() on the queryset
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year=2012)
                      +car = q.first()
                      +
                      +
                      +

                      this returns the first value in the queryset

                      +
                      +
                      +
                    • +
                    +
                    +
                    +

                    Filtering Operators

                    +

                    Equal To

                    +

                    The default filtering operator.

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q = q.filter(year=2012)  #year == 2012
                    +
                    +
                    +

                    In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

                    +

                    in (__in)

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q = q.filter(year__in=[2011, 2012])
                    +
                    +
                    +

                    > (__gt)

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q = q.filter(year__gt=2010)  # year > 2010
                    +
                    +# or the nicer syntax
                    +
                    +q.filter(Automobile.year > 2010)
                    +
                    +
                    +

                    >= (__gte)

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q = q.filter(year__gte=2010)  # year >= 2010
                    +
                    +# or the nicer syntax
                    +
                    +q.filter(Automobile.year >= 2010)
                    +
                    +
                    +

                    < (__lt)

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q = q.filter(year__lt=2012)  # year < 2012
                    +
                    +# or...
                    +
                    +q.filter(Automobile.year < 2012)
                    +
                    +
                    +

                    <= (__lte)

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q = q.filter(year__lte=2012)  # year <= 2012
                    +
                    +q.filter(Automobile.year <= 2012)
                    +
                    +
                    +

                    CONTAINS (__contains)

                    +

                    The CONTAINS operator is available for all collection types (List, Set, Map).

                    +
                    q = Automobile.objects.filter(manufacturer='Tesla')
                    +q.filter(options__contains='backup camera').allow_filtering()
                    +
                    +
                    +

                    Note that we need to use allow_filtering() since the options column has no secondary index.

                    +

                    LIKE (__like)

                    +

                    The LIKE operator is available for text columns that have a SASI secondary index.

                    +
                    q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
                    +
                    +
                    +

                    IS NOT NULL (IsNotNull(column_name))

                    +

                    The IS NOT NULL operator is not yet supported for C*.

                    +
                    q = Automobile.objects.filter(IsNotNull('model'))
                    +
                    +
                    +

                    Limitations:

                    +
                      +
                    • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

                    • +
                    • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

                    • +
                    +
                    +
                    +

                    TimeUUID Functions

                    +

                    In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

                    +
                    +
                    +class cqlengine.queryset.MinTimeUUID(datetime)
                    +

                    returns the minimum time uuid value possible for the given datetime

                    +
                    + +
                    +
                    +class cqlengine.queryset.MaxTimeUUID(datetime)
                    +

                    returns the maximum time uuid value possible for the given datetime

                    +
                    + +

                    Example

                    +
                    class DataStream(Model):
                    +    id      = columns.UUID(partition_key=True)
                    +    time    = columns.TimeUUID(primary_key=True)
                    +    data    = columns.Bytes()
                    +
                    +min_time = datetime(1982, 1, 1)
                    +max_time = datetime(1982, 3, 9)
                    +
                    +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
                    +
                    +
                    +
                    +
                    +

                    Token Function

                    +

                    Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

                    +

                    See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

                    +

                    Example

                    +
                    class Items(Model):
                    +    id      = columns.Text(primary_key=True)
                    +    data    = columns.Bytes()
                    +
                    +query = Items.objects.all().limit(10)
                    +
                    +first_page = list(query);
                    +last = first_page[-1]
                    +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
                    +
                    +
                    +
                    +
                    +

                    QuerySets are immutable

                    +

                    When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

                    +

                    Example

                    +
                    #this produces 3 different querysets
                    +#q does not change after it's initial definition
                    +q = Automobiles.objects.filter(year=2012)
                    +tesla2012 = q.filter(manufacturer='Tesla')
                    +honda2012 = q.filter(manufacturer='Honda')
                    +
                    +
                    +
                    +
                    +

                    Ordering QuerySets

                    +

                    Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

                    +

                    However, you can set a column to order on with the .order_by(column_name) method.

                    +

                    Example

                    +
                    #sort ascending
                    +q = Automobiles.objects.all().order_by('year')
                    +#sort descending
                    +q = Automobiles.objects.all().order_by('-year')
                    +
                    +
                    +

                    Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

                    +

                    For instance, given our Automobile model, year is the only column we can order on.

                    +
                    +
                    +

                    Values Lists

                    +

                    There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

                    +
                    items = list(range(20))
                    +random.shuffle(items)
                    +for i in items:
                    +    TestModel.create(id=1, clustering_key=i)
                    +
                    +values = list(TestModel.objects.values_list('clustering_key', flat=True))
                    +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
                    +
                    +
                    +
                    +
                    +

                    Per Query Timeouts

                    +

                    By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

                    +
                    class Row(Model):
                    +    id = columns.Integer(primary_key=True)
                    +    name = columns.Text()
                    +
                    +
                    +

                    Fetch all objects with a timeout of 5 seconds

                    +
                    Row.objects().timeout(5).all()
                    +
                    +
                    +

                    Create a single row with a 50ms timeout

                    +
                    Row(id=1, name='Jon').timeout(0.05).create()
                    +
                    +
                    +

                    Delete a single row with no timeout

                    +
                    Row(id=1).timeout(None).delete()
                    +
                    +
                    +

                    Update a single row with no timeout

                    +
                    Row(id=1).timeout(None).update(name='Blake')
                    +
                    +
                    +

                    Batch query timeouts

                    +
                    with BatchQuery(timeout=10) as b:
                    +    Row(id=1, name='Jon').create()
                    +
                    +
                    +

                    NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

                    +
                    +
                    +

                    Default TTL and Per Query TTL

                    +

                    Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

                    +

                    Example:

                    +
                    class User(Model):
                    +    __options__ = {'default_time_to_live': 20}
                    +
                    +    user_id = columns.UUID(primary_key=True)
                    +    ...
                    +
                    +
                    +

                    You can set TTL per-query if needed. Here are a some examples:

                    +

                    Example:

                    +
                    class User(Model):
                    +    __options__ = {'default_time_to_live': 20}
                    +
                    +    user_id = columns.UUID(primary_key=True)
                    +    ...
                    +
                    +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
                    +
                    +user.ttl(30).update(age=21)            # Update the TTL to 30
                    +User.objects.ttl(10).create(user_id=1)  # TTL 10
                    +User(user_id=1, age=21).ttl(10).save()  # TTL 10
                    +
                    +
                    +
                    +
                    +

                    Named Tables

                    +

                    Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

                    +
                    from cassandra.cqlengine.connection import setup
                    +setup("127.0.0.1", "cqlengine_test")
                    +
                    +from cassandra.cqlengine.named import NamedTable
                    +user = NamedTable("cqlengine_test", "user")
                    +user.objects()
                    +user.objects()[0]
                    +
                    +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/third-party.html b/master/cqlengine/third-party.html new file mode 100644 index 0000000000..eca2693559 --- /dev/null +++ b/master/cqlengine/third-party.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Third party integrations

                    +
                    +

                    Celery

                    +

                    Here’s how, in substance, CQLengine can be plugged to Celery:

                    +
                    from celery import Celery
                    +from celery.signals import worker_process_init, beat_init
                    +from cassandra.cqlengine import connection
                    +from cassandra.cqlengine.connection import (
                    +    cluster as cql_cluster, session as cql_session)
                    +
                    +def cassandra_init(**kwargs):
                    +    """ Initialize a clean Cassandra connection. """
                    +    if cql_cluster is not None:
                    +        cql_cluster.shutdown()
                    +    if cql_session is not None:
                    +        cql_session.shutdown()
                    +    connection.setup()
                    +
                    +# Initialize worker context for both standard and periodic tasks.
                    +worker_process_init.connect(cassandra_init)
                    +beat_init.connect(cassandra_init)
                    +
                    +app = Celery()
                    +
                    +
                    +
                    +
                    +

                    uWSGI

                    +

                    This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

                    +
                    from cassandra.cqlengine import connection
                    +from cassandra.cqlengine.connection import (
                    +    cluster as cql_cluster, session as cql_session)
                    +
                    +try:
                    +    from uwsgidecorators import postfork
                    +except ImportError:
                    +    # We're not in a uWSGI context, no need to hook Cassandra session
                    +    # initialization to the postfork event.
                    +    pass
                    +else:
                    +    @postfork
                    +    def cassandra_init(**kwargs):
                    +        """ Initialize a new Cassandra session in the context.
                    +
                    +        Ensures that a new session is returned for every new request.
                    +        """
                    +        if cql_cluster is not None:
                    +            cql_cluster.shutdown()
                    +        if cql_session is not None:
                    +            cql_session.shutdown()
                    +        connection.setup()
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/cqlengine/upgrade-guide.html b/master/cqlengine/upgrade-guide.html new file mode 100644 index 0000000000..d3e208957a --- /dev/null +++ b/master/cqlengine/upgrade-guide.html @@ -0,0 +1,821 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Upgrade Guide

                    +

                    This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

                    +

                    THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

                    +
                    +

                    Functional Changes

                    +
                    +

                    List Prepend Reversing

                    +

                    Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

                    +
                    +
                    +

                    Date Column Type

                    +

                    The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

                    +
                    +
                    +
                    +

                    Remove cqlengine

                    +

                    To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

                    +

                    The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

                    +
                    +
                    +

                    Organization

                    +
                    +

                    Imports

                    +

                    cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

                    +
                    from cassandra.cqlengine import columns
                    +
                    +
                    +

                    is now:

                    +
                    from cassandra.cqlengine import columns
                    +
                    +
                    +
                    +
                    +

                    Package-Level Aliases

                    +

                    Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

                    +

                    Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

                    +

                    These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

                    +
                    +
                    +

                    Exceptions

                    +

                    The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

                    + + + + + + + + + + + + + + + + + + + + + + + + + + +

                    Exception class

                    New module

                    CQLEngineException

                    cassandra.cqlengine

                    ModelException

                    cassandra.cqlengine.models

                    ValidationError

                    cassandra.cqlengine

                    UndefinedKeyspaceException

                    cassandra.cqlengine.connection

                    LWTException

                    cassandra.cqlengine.query

                    IfNotExistsWithCounterColumn

                    cassandra.cqlengine.query

                    +
                    +
                    +

                    UnicodeMixin Consolidation

                    +

                    class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

                    +
                    +
                    +
                    +

                    API Deprecations

                    +

                    This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

                    +
                    +

                    Float/Double Overload

                    +

                    Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

                    +
                    +
                    +

                    Schema Management

                    +

                    cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

                    + +

                    cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

                    +
                    +
                    +

                    Model Inheritance

                    +

                    The names for class attributes controlling model inheritance are changing. Changes are as follows:

                    + +

                    The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

                    +

                    The example below shows a simple translation:

                    +

                    Before:

                    +
                    class Pet(Model):
                    +    __table_name__ = 'pet'
                    +    owner_id = UUID(primary_key=True)
                    +    pet_id = UUID(primary_key=True)
                    +    pet_type = Text(polymorphic_key=True)
                    +    name = Text()
                    +
                    +class Cat(Pet):
                    +    __polymorphic_key__ = 'cat'
                    +
                    +class Dog(Pet):
                    +    __polymorphic_key__ = 'dog'
                    +
                    +
                    +

                    After:

                    +
                    class Pet(models.Model):
                    +    __table_name__ = 'pet'
                    +    owner_id = UUID(primary_key=True)
                    +    pet_id = UUID(primary_key=True)
                    +    pet_type = Text(discriminator_column=True)
                    +    name = Text()
                    +
                    +class Cat(Pet):
                    +    __discriminator_value__ = 'cat'
                    +
                    +class Dog(Pet):
                    +    __discriminator_value__ = 'dog'
                    +
                    +
                    +
                    +
                    +

                    TimeUUID.from_datetime

                    +

                    This function is deprecated in favor of the core utility function uuid_from_time().

                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/dates-and-times.html b/master/dates-and-times.html new file mode 100644 index 0000000000..f9f2a4df16 --- /dev/null +++ b/master/dates-and-times.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Working with Dates and Times

                    +

                    This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

                    +
                    +

                    timestamps (Cassandra DateType)

                    +

                    Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

                    +
                    +

                    Write Path

                    +

                    When inserting timestamps, the driver handles serialization for the write path as follows:

                    +

                    If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

                    +
                      +
                    • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

                    • +
                    • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

                    • +
                    +

                    Note the second point above applies even to “local” times created using now():

                    +
                    >>> d = datetime.now()
                    +
                    +>>> print(d.tzinfo)
                    +None
                    +
                    +
                    +

                    These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

                    +

                    If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

                    +
                    +
                    +

                    Read Path

                    +

                    The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

                    +

                    The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

                    +
                    import pytz
                    +user_tz = pytz.timezone('US/Central')
                    +timestamp_naive = row.ts
                    +timestamp_utc = pytz.utc.localize(timestamp_naive)
                    +timestamp_presented = timestamp_utc.astimezone(user_tz)
                    +
                    +
                    +

                    This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

                    +
                    +
                    +
                    +

                    date, time (Cassandra DateType)

                    +

                    Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

                    +
                    +

                    Write Path

                    +

                    For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

                    +

                    For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

                    +
                    +
                    +

                    Read Path

                    +

                    The driver always returns custom types for date and time.

                    +

                    The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

                    +

                    The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/execution-profiles.html b/master/execution-profiles.html new file mode 100644 index 0000000000..92edd89992 --- /dev/null +++ b/master/execution-profiles.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Execution Profiles

                    +

                    Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

                    +

                    The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

                    +

                    An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

                    +

                    This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

                    +
                    +

                    Mapping Legacy Parameters to Profiles

                    +

                    Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

                    + +

                    When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

                    +
                    +
                    +

                    Using Execution Profiles

                    +
                    +

                    Default

                    +
                    from cassandra.cluster import Cluster
                    +cluster = Cluster()
                    +session = cluster.connect()
                    +local_query = 'SELECT rpc_address FROM system.local'
                    +for _ in cluster.metadata.all_hosts():
                    +    print session.execute(local_query)[0]
                    +
                    +
                    +
                    Row(rpc_address='127.0.0.2')
                    +Row(rpc_address='127.0.0.1')
                    +
                    +
                    +

                    The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

                    +
                    +
                    +

                    Initializing cluster with profiles

                    +
                    from cassandra.cluster import ExecutionProfile
                    +from cassandra.policies import WhiteListRoundRobinPolicy
                    +
                    +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
                    +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
                    +
                    +profiles = {'node1': node1_profile, 'node2': node2_profile}
                    +session = Cluster(execution_profiles=profiles).connect()
                    +for _ in cluster.metadata.all_hosts():
                    +    print session.execute(local_query, execution_profile='node1')[0]
                    +
                    +
                    +
                    Row(rpc_address='127.0.0.1')
                    +Row(rpc_address='127.0.0.1')
                    +
                    +
                    +
                    for _ in cluster.metadata.all_hosts():
                    +    print session.execute(local_query, execution_profile='node2')[0]
                    +
                    +
                    +
                    Row(rpc_address='127.0.0.2')
                    +Row(rpc_address='127.0.0.2')
                    +
                    +
                    +
                    for _ in cluster.metadata.all_hosts():
                    +    print session.execute(local_query)[0]
                    +
                    +
                    +
                    Row(rpc_address='127.0.0.2')
                    +Row(rpc_address='127.0.0.1')
                    +
                    +
                    +

                    Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

                    +
                    from cassandra.cluster import EXEC_PROFILE_DEFAULT
                    +profile = ExecutionProfile(request_timeout=30)
                    +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
                    +
                    +
                    +
                    +
                    +

                    Adding named profiles

                    +

                    New profiles can be added constructing from scratch, or deriving from default:

                    +
                    locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
                    +node1_profile = 'node1_whitelist'
                    +cluster.add_execution_profile(node1_profile, locked_execution)
                    +
                    +for _ in cluster.metadata.all_hosts():
                    +    print session.execute(local_query, execution_profile=node1_profile)[0]
                    +
                    +
                    +
                    Row(rpc_address='127.0.0.1')
                    +Row(rpc_address='127.0.0.1')
                    +
                    +
                    +

                    See Cluster.add_execution_profile() for details and optional parameters.

                    +
                    +
                    +

                    Passing a profile instance without mapping

                    +

                    We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

                    +
                    from cassandra.query import tuple_factory
                    +
                    +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
                    +
                    +print session.execute(local_query, execution_profile=tmp)[0]
                    +print session.execute(local_query, execution_profile='node1')[0]
                    +
                    +
                    +
                    ('127.0.0.1',)
                    +Row(rpc_address='127.0.0.1')
                    +
                    +
                    +

                    The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/faq.html b/master/faq.html new file mode 100644 index 0000000000..1d022680c9 --- /dev/null +++ b/master/faq.html @@ -0,0 +1,697 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Frequently Asked Questions

                    +

                    See also cqlengine FAQ

                    +
                    +

                    Why do connections or IO operations timeout in my WSGI application?

                    +

                    Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

                    +

                    To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

                    +
                    from flask import Flask
                    +from uwsgidecorators import postfork
                    +from cassandra.cluster import Cluster
                    +
                    +session = None
                    +prepared = None
                    +
                    +@postfork
                    +def connect():
                    +    global session, prepared
                    +    session = Cluster().connect()
                    +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
                    +
                    +app = Flask(__name__)
                    +
                    +@app.route('/')
                    +def server_version():
                    +    row = session.execute(prepared, ('local',))[0]
                    +    return row.release_version
                    +
                    +
                    +

                    uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

                    +
                    +
                    +

                    How do I trace a request?

                    +

                    Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

                    +
                    >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
                    +>>> result = future.result()
                    +>>> trace = future.get_query_trace()
                    +>>> for e in trace.events:
                    +>>>     print e.source_elapsed, e.description
                    +
                    +0:00:00.000077 Parsing select * from system.local
                    +0:00:00.000153 Preparing statement
                    +0:00:00.000309 Computing ranges to query
                    +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
                    +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
                    +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
                    +0:00:00.000669 Read 1 live and 0 tombstone cells
                    +0:00:00.000755 Scanned 1 rows and matched 1
                    +
                    +
                    +

                    trace is a QueryTrace object.

                    +
                    +
                    +

                    How do I determine the replicas for a query?

                    +

                    With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

                    +
                    >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
                    +>>> bound = prepared.bind((1,))
                    +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
                    +>>> for h in replicas:
                    +>>>   print h.address
                    +127.0.0.1
                    +127.0.0.2
                    +
                    +
                    +

                    replicas is a list of Host objects.

                    +
                    +
                    +

                    How does the driver manage request retries?

                    +

                    By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

                    +

                    Retries are presently attempted on the same coordinator, but this may change in the future.

                    +

                    Please see policies.RetryPolicy for further details.

                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/getting-started.html b/master/getting-started.html new file mode 100644 index 0000000000..e900a257eb --- /dev/null +++ b/master/getting-started.html @@ -0,0 +1,1108 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Getting Started

                    +

                    First, make sure you have the driver properly installed.

                    +
                    +

                    Connecting to a Cluster

                    +

                    Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

                    +

                    First, make sure you have the Cassandra driver properly installed.

                    +
                    +

                    Connecting to Cassandra

                    +

                    The simplest way to create a Cluster is like this:

                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster()
                    +
                    +
                    +

                    This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
                    +
                    +
                    +

                    The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

                    +

                    If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

                    +
                    from cassandra.cluster import Cluster
                    +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
                    +
                    +
                    +

                    Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

                    +
                    cluster = Cluster()
                    +session = cluster.connect()
                    +
                    +
                    +
                    +
                    +
                    +

                    Session Keyspace

                    +

                    The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

                    +
                    cluster = Cluster()
                    +session = cluster.connect('mykeyspace')
                    +
                    +
                    +

                    You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

                    +
                    session.set_keyspace('users')
                    +# or you can do this instead
                    +session.execute('USE users')
                    +
                    +
                    +
                    +
                    +

                    Execution Profiles

                    +

                    Profiles are passed in by execution_profiles dict.

                    +

                    In this case we can construct the base ExecutionProfile passing all attributes:

                    +
                    from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                    +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
                    +from cassandra.query import tuple_factory
                    +
                    +profile = ExecutionProfile(
                    +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
                    +    retry_policy=DowngradingConsistencyRetryPolicy(),
                    +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
                    +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
                    +    request_timeout=15,
                    +    row_factory=tuple_factory
                    +)
                    +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
                    +session = cluster.connect()
                    +
                    +print(session.execute("SELECT release_version FROM system.local").one())
                    +
                    +
                    +

                    Users are free to setup additional profiles to be used by name:

                    +
                    profile_long = ExecutionProfile(request_timeout=30)
                    +cluster = Cluster(execution_profiles={'long': profile_long})
                    +session = cluster.connect()
                    +session.execute(statement, execution_profile='long')
                    +
                    +
                    +

                    Also, parameters passed to Session.execute or attached to Statements are still honored as before.

                    +
                    +
                    +

                    Executing Queries

                    +

                    Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

                    +
                    rows = session.execute('SELECT name, age, email FROM users')
                    +for user_row in rows:
                    +    print user_row.name, user_row.age, user_row.email
                    +
                    +
                    +

                    This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

                    +

                    By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

                    +
                    rows = session.execute('SELECT name, age, email FROM users')
                    +for row in rows:
                    +    print row.name, row.age, row.email
                    +
                    +
                    +
                    rows = session.execute('SELECT name, age, email FROM users')
                    +for (name, age, email) in rows:
                    +    print name, age, email
                    +
                    +
                    +
                    rows = session.execute('SELECT name, age, email FROM users')
                    +for row in rows:
                    +    print row[0], row[1], row[2]
                    +
                    +
                    +

                    If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

                    +

                    As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

                    +
                    +
                    +

                    Prepared Statements

                    +

                    Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

                    +

                    To prepare a query, use Session.prepare():

                    +
                    user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
                    +
                    +users = []
                    +for user_id in user_ids_to_query:
                    +    user = session.execute(user_lookup_stmt, [user_id])
                    +    users.append(user)
                    +
                    +
                    +

                    prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

                    +

                    Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

                    +
                    +
                    +

                    Passing Parameters to CQL Queries

                    +

                    Although it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

                    +

                    Positional parameters are used with a %s placeholder. For example, +when you execute:

                    +
                    session.execute(
                    +    """
                    +    INSERT INTO users (name, credits, user_id)
                    +    VALUES (%s, %s, %s)
                    +    """,
                    +    ("John O'Reilly", 42, uuid.uuid1())
                    +)
                    +
                    +
                    +

                    It is translated to the following CQL query:

                    +
                    INSERT INTO users (name, credits, user_id)
                    +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
                    +
                    +
                    +

                    Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

                    +
                    session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
                    +
                    +
                    +

                    Instead, use %s for the age placeholder.

                    +

                    If you need to use a literal % character, use %%.

                    +

                    Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

                    +
                    session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
                    +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
                    +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
                    +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
                    +
                    +
                    +

                    Note that the second line is incorrect because in Python, single-element tuples +require a comma.

                    +

                    Named place-holders use the %(name)s form:

                    +
                    session.execute(
                    +    """
                    +    INSERT INTO users (name, credits, user_id, username)
                    +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
                    +    """,
                    +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
                    +)
                    +
                    +
                    +

                    Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

                    +

                    Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

                    +
                    +
                    +

                    Type Conversions

                    +

                    For non-prepared statements, Python types are cast to CQL literals in the +following way:

                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                    Python Type

                    CQL Literal Type

                    None

                    NULL

                    bool

                    boolean

                    float

                    +
                    float
                    +
                    double
                    +
                    +
                    +
                    int
                    +
                    long
                    +
                    +
                    +
                    int
                    +
                    bigint
                    +
                    varint
                    +
                    smallint
                    +
                    tinyint
                    +
                    counter
                    +
                    +

                    decimal.Decimal

                    decimal

                    +
                    str
                    +
                    unicode
                    +
                    +
                    +
                    ascii
                    +
                    varchar
                    +
                    text
                    +
                    +
                    +
                    buffer
                    +
                    bytearray
                    +
                    +

                    blob

                    date

                    date

                    datetime

                    timestamp

                    time

                    time

                    +
                    list
                    +
                    tuple
                    +
                    generator
                    +
                    +

                    list

                    +
                    set
                    +
                    frozenset
                    +
                    +

                    set

                    +
                    dict
                    +
                    OrderedDict
                    +
                    +

                    map

                    uuid.UUID

                    +
                    timeuuid
                    +
                    uuid
                    +
                    +
                    +
                    +
                    +

                    Asynchronous Queries

                    +

                    The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

                    +

                    The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

                    +
                    from cassandra import ReadTimeout
                    +
                    +query = "SELECT * FROM users WHERE user_id=%s"
                    +future = session.execute_async(query, [user_id])
                    +
                    +# ... do some other work
                    +
                    +try:
                    +    rows = future.result()
                    +    user = rows[0]
                    +    print user.name, user.age
                    +except ReadTimeout:
                    +    log.exception("Query timed out:")
                    +
                    +
                    +

                    This works well for executing many queries concurrently:

                    +
                    # build a list of futures
                    +futures = []
                    +query = "SELECT * FROM users WHERE user_id=%s"
                    +for user_id in ids_to_fetch:
                    +    futures.append(session.execute_async(query, [user_id])
                    +
                    +# wait for them to complete and use the results
                    +for future in futures:
                    +    rows = future.result()
                    +    print rows[0].name
                    +
                    +
                    +

                    Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

                    +
                    def handle_success(rows):
                    +    user = rows[0]
                    +    try:
                    +        process_user(user.name, user.age, user.id)
                    +    except Exception:
                    +        log.error("Failed to process user %s", user.id)
                    +        # don't re-raise errors in the callback
                    +
                    +def handle_error(exception):
                    +    log.error("Failed to fetch user info: %s", exception)
                    +
                    +
                    +future = session.execute_async(query)
                    +future.add_callbacks(handle_success, handle_error)
                    +
                    +
                    +
                    +
                    There are a few important things to remember when working with callbacks:
                      +
                    • Exceptions that are raised inside the callback functions will be logged and then ignored.

                    • +
                    • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

                    • +
                    +
                    +
                    +
                    +
                    +

                    Setting a Consistency Level

                    +

                    The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

                    +

                    By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

                    +
                    from cassandra import ConsistencyLevel
                    +from cassandra.query import SimpleStatement
                    +
                    +query = SimpleStatement(
                    +    "INSERT INTO users (name, age) VALUES (%s, %s)",
                    +    consistency_level=ConsistencyLevel.QUORUM)
                    +session.execute(query, ('John', 42))
                    +
                    +
                    +
                    +
                    +

                    Setting a Consistency Level with Prepared Statements

                    +

                    To specify a consistency level for prepared statements, you have two options.

                    +

                    The first is to set a default consistency level for every execution of the +prepared statement:

                    +
                    from cassandra import ConsistencyLevel
                    +
                    +cluster = Cluster()
                    +session = cluster.connect("mykeyspace")
                    +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
                    +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
                    +
                    +# these will both use QUORUM
                    +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
                    +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
                    +
                    +
                    +

                    The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

                    +
                    # override the QUORUM default
                    +user3_lookup = user_lookup_stmt.bind([user_id3])
                    +user3_lookup.consistency_level = ConsistencyLevel.ALL
                    +user3 = session.execute(user3_lookup)
                    +
                    +
                    +
                    +
                    +

                    Speculative Execution

                    +

                    Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

                    +

                    To enable speculative execution:

                    +
                      +
                    • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

                    • +
                    • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

                    • +
                    +

                    Example:

                    +
                    from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                    +from cassandra.policies import ConstantSpeculativeExecutionPolicy
                    +from cassandra.query import SimpleStatement
                    +
                    +# Configure the speculative execution policy
                    +ep = ExecutionProfile(
                    +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
                    +)
                    +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
                    +session = cluster.connect()
                    +
                    +# Mark the query idempotent
                    +query = SimpleStatement(
                    +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
                    +    is_idempotent=True
                    +)
                    +
                    +# Execute. A new query will be sent to the server every 0.5 second
                    +# until we receive a response, for a max number attempts of 10.
                    +session.execute(query)
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/index.html b/master/index.html new file mode 100644 index 0000000000..5a12861f77 --- /dev/null +++ b/master/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Python Driver for Scylla and Apache Cassandra®

                    +

                    A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

                    +

                    The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8.

                    +

                    This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

                    +

                    Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

                    +
                    +

                    Contents

                    +
                    +
                    Installation

                    How to install the driver.

                    +
                    +
                    Getting Started

                    A guide through the first steps of connecting to Scylla and executing queries

                    +
                    +
                    Scylla Specific Features

                    A list of feature available only on scylla-driver

                    +
                    +
                    Execution Profiles

                    An introduction to a more flexible way of configuring request execution

                    +
                    +
                    Lightweight Transactions (Compare-and-set)

                    Working with results of conditional requests

                    +
                    +
                    Object Mapper

                    Introduction to the integrated object mapper, cqlengine

                    +
                    +
                    Performance Notes

                    Tips for getting good performance.

                    +
                    +
                    Paging Large Queries

                    Notes on paging large query results

                    +
                    +
                    Security

                    An overview of the security features of the driver

                    +
                    +
                    Upgrading

                    A guide to upgrading versions of the driver

                    +
                    +
                    User Defined Types

                    Working with Scylla’s user-defined types (UDT)

                    +
                    +
                    Working with Dates and Times

                    Some discussion on the driver’s approach to working with timestamp, date, time types

                    +
                    +
                    ScyllaDB Cloud

                    Connect to ScyllaDB Cloud

                    +
                    +
                    ScyllaDB Cloud Serverless

                    Connect to ScyllaDB Cloud Serverless

                    +
                    +
                    CHANGELOG

                    Log of changes to the driver, organized by version.

                    +
                    +
                    Frequently Asked Questions

                    A collection of Frequently Asked Questions

                    +
                    +
                    API Documentation

                    The API documentation.

                    +
                    +
                    +
                    +
                    +
                    +
                    +

                    Getting Help

                    +

                    Visit the FAQ section in this documentation.

                    +

                    Please send questions to the Scylla user list.

                    +
                    +
                    +

                    Reporting Issues

                    +

                    Please report any bugs and make any feature requests on the Github project issues

                    +
                    + +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/installation.html b/master/installation.html new file mode 100644 index 0000000000..e25f91b23f --- /dev/null +++ b/master/installation.html @@ -0,0 +1,860 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Installation

                    +
                    +

                    Supported Platforms

                    +

                    Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

                    +

                    Linux, OSX, and Windows are supported.

                    +
                    +
                    +

                    Installation through pip

                    +

                    pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

                    +
                    pip install scylla-driver
                    +
                    +
                    +

                    You can use pip install --pre scylla-driver if you need to install a beta version.

                    +

                    *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

                    +
                    +
                    +

                    Verifying your Installation

                    +

                    To check if the installation was successful, you can run:

                    +
                    python -c 'import cassandra; print cassandra.__version__'
                    +
                    +
                    +

                    It should print something like “3.22.0”.

                    +
                    +
                    +

                    (Optional) Graph

                    +

                    The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

                    +
                    pip install scylla-driver[graph]
                    +
                    +
                    +
                    +
                    +

                    (Optional) Compression Support

                    +

                    Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

                    +

                    For lz4 support:

                    +
                    pip install lz4
                    +
                    +
                    +

                    For snappy support:

                    +
                    pip install python-snappy
                    +
                    +
                    +

                    (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

                    +
                    +
                    +

                    (Optional) Metrics Support

                    +

                    The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

                    +
                    pip install scales
                    +
                    +
                    +
                    +

                    Speeding Up Installation

                    +

                    By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

                    +

                    In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

                    +
                    $ # installing from source
                    +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
                    +$ # installing from pip
                    +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
                    +
                    +
                    +
                    +
                    +

                    OSX Installation Error

                    +

                    If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

                    +
                    clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
                    +
                    +
                    +

                    To fix this, re-run the installation with an extra compilation flag:

                    +
                    ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
                    +
                    +
                    +
                    +
                    +
                    +

                    Windows Installation Notes

                    +

                    Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

                    +

                    Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

                    +

                    It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

                    +
                    +
                    +

                    Manual Installation

                    +

                    You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

                    +

                    Once the dependencies are installed, simply run:

                    +
                    python setup.py install
                    +
                    +
                    +
                    +
                    +

                    (Optional) Non-python Dependencies

                    +

                    The driver has several optional features that have non-Python dependencies.

                    +
                    +

                    C Extensions

                    +

                    By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

                    +

                    When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

                    +

                    To compile the extensions, ensure that GCC and the Python headers are available.

                    +

                    On Ubuntu and Debian, this can be accomplished by running:

                    +
                    $ sudo apt-get install gcc python-dev
                    +
                    +
                    +

                    On RedHat and RedHat-based systems like CentOS and Fedora:

                    +
                    $ sudo yum install gcc python-devel
                    +
                    +
                    +

                    On OS X, homebrew installations of Python should provide the necessary headers.

                    +

                    See Windows Installation Notes for notes on configuring the build environment on Windows.

                    +
                    +

                    Cython-based Extensions

                    +

                    By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

                    +

                    This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

                    +
                    python setup.py install --no-cython
                    +
                    +
                    +

                    Alternatively, an environment variable can be used to switch this option regardless of +context:

                    +
                    CASS_DRIVER_NO_CYTHON=1 <your script here>
                    +- or, to disable all extensions:
                    +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
                    +
                    +
                    +

                    This method is required when using pip, which provides no other way of injecting user options in a single command:

                    +
                    CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
                    +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
                    +
                    +
                    +

                    The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

                    +

                    If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

                    +
                    sudo pip install six futures
                    +sudo pip install --install-option="--no-cython"
                    +
                    +
                    +
                    +
                    +
                    +

                    libev support

                    +

                    The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

                    +

                    If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

                    +
                    $ sudo apt-get install libev4 libev-dev
                    +
                    +
                    +

                    On RHEL/CentOS/Fedora:

                    +
                    $ sudo yum install libev libev-devel
                    +
                    +
                    +

                    If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

                    +
                    $ brew install libev
                    +
                    +
                    +

                    The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

                    +

                    If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

                    +
                    >>> from cassandra.io.libevreactor import LibevConnection
                    +>>> from cassandra.cluster import Cluster
                    +
                    +>>> cluster = Cluster()
                    +>>> cluster.connection_class = LibevConnection
                    +>>> session = cluster.connect()
                    +
                    +
                    +
                    +
                    +
                    +

                    (Optional) Configuring SSL

                    +

                    Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/lwt.html b/master/lwt.html new file mode 100644 index 0000000000..ccfde6e468 --- /dev/null +++ b/master/lwt.html @@ -0,0 +1,720 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Lightweight Transactions (Compare-and-set)

                    +

                    Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

                    +

                    For pertinent execution parameters, see Statement.serial_consistency_level.

                    +

                    This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

                    +
                    +

                    Specialized Results

                    +

                    The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

                    +

                    The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

                    +
                      +
                    • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

                    • +
                    • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

                    • +
                    • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

                    • +
                    +

                    How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

                    +
                    CREATE TABLE test.t (
                    +    k int PRIMARY KEY,
                    +    v int,
                    +    x int
                    +)
                    +
                    +
                    +

                    … the following sections show the expected result for a number of example statements, using the three base row factories.

                    +
                    +

                    named_tuple_factory (default)

                    +

                    The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

                    +
                    >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                    +Row(applied=True)
                    +
                    +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                    +Row(applied=False, k=0, v=0, x=None)
                    +
                    +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                    +Row(applied=True)
                    +
                    +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                    +Row(applied=False, v=1, x=2)
                    +
                    +
                    +
                    +
                    +

                    tuple_factory

                    +

                    This return type does not refer to names, but the boolean value applied is always present in position 0:

                    +
                    >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                    +(True,)
                    +
                    +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                    +(False, 0, 0, None)
                    +
                    +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                    +(True,)
                    +
                    +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                    +(False, 1, 2)
                    +
                    +
                    +
                    +
                    +

                    dict_factory

                    +

                    The retuned dict contains the [applied] key:

                    +
                    >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                    +{u'[applied]': True}
                    +
                    +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                    +{u'x': 2, u'[applied]': False, u'v': 1}
                    +
                    +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                    +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
                    +
                    +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                    +{u'[applied]': True}
                    +
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/object-mapper.html b/master/object-mapper.html new file mode 100644 index 0000000000..1e33811b31 --- /dev/null +++ b/master/object-mapper.html @@ -0,0 +1,717 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Object Mapper

                    +

                    cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

                    +

                    Jump to Getting Started

                    +
                    +

                    Contents

                    +
                    +
                    Upgrade Guide

                    For migrating projects from legacy cqlengine, to the integrated product

                    +
                    +
                    Models

                    Examples defining models, and mapping them to tables

                    +
                    +
                    Making Queries

                    Overview of query sets and filtering

                    +
                    +
                    Batch Queries

                    Working with batch mutations

                    +
                    +
                    Connections

                    Working with multiple sessions

                    +
                    +
                    API Documentation

                    Index of API documentation

                    +
                    +
                    Third party integrations

                    High-level examples in Celery and uWSGI

                    +
                    +
                    +

                    Frequently Asked Questions

                    +
                    +
                    +
                    +
                    +

                    Getting Started

                    +
                    import uuid
                    +from cassandra.cqlengine import columns
                    +from cassandra.cqlengine import connection
                    +from datetime import datetime
                    +from cassandra.cqlengine.management import sync_table
                    +from cassandra.cqlengine.models import Model
                    +
                    +#first, define a model
                    +class ExampleModel(Model):
                    +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
                    +    example_type    = columns.Integer(index=True)
                    +    created_at      = columns.DateTime()
                    +    description     = columns.Text(required=False)
                    +
                    +#next, setup the connection to your cassandra server(s)...
                    +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
                    +# the list of hosts will be passed to create a Cluster() instance
                    +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
                    +
                    +#...and create your CQL table
                    +>>> sync_table(ExampleModel)
                    +
                    +#now we can create some rows:
                    +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
                    +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
                    +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
                    +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
                    +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
                    +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
                    +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
                    +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
                    +
                    +#and now we can run some queries against our table
                    +>>> ExampleModel.objects.count()
                    +8
                    +>>> q = ExampleModel.objects(example_type=1)
                    +>>> q.count()
                    +4
                    +>>> for instance in q:
                    +>>>     print instance.description
                    +example5
                    +example6
                    +example7
                    +example8
                    +
                    +#here we are applying additional filtering to an existing query
                    +#query objects are immutable, so calling filter returns a new
                    +#query object
                    +>>> q2 = q.filter(example_id=em5.example_id)
                    +
                    +>>> q2.count()
                    +1
                    +>>> for instance in q2:
                    +>>>     print instance.description
                    +example5
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/objects.inv b/master/objects.inv new file mode 100644 index 0000000000..558d032065 Binary files /dev/null and b/master/objects.inv differ diff --git a/master/performance.html b/master/performance.html new file mode 100644 index 0000000000..0e05ec4cce --- /dev/null +++ b/master/performance.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Performance Notes

                    +

                    The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

                    +

                    Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

                    +

                    The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

                    +

                    Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

                    +
                    +

                    PyPy

                    +

                    PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

                    +
                    +
                    +

                    Cython Extensions

                    +

                    Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

                    +

                    See Installation for details on controlling this build.

                    +
                    +
                    +

                    multiprocessing

                    +

                    All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

                    +

                    Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

                    +

                    For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/py-modindex.html b/master/py-modindex.html new file mode 100644 index 0000000000..6c4f464de9 --- /dev/null +++ b/master/py-modindex.html @@ -0,0 +1,602 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + + + +
                    + + + + + +
                    + + +
                    +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/query-paging.html b/master/query-paging.html new file mode 100644 index 0000000000..aff03bd175 --- /dev/null +++ b/master/query-paging.html @@ -0,0 +1,725 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Paging Large Queries

                    +

                    Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

                    +
                    +

                    Controlling the Page Size

                    +

                    By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

                    +
                    +
                    +

                    Handling Paged Results

                    +

                    Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

                    +
                    from cassandra.query import SimpleStatement
                    +query = "SELECT * FROM users"  # users contains 100 rows
                    +statement = SimpleStatement(query, fetch_size=10)
                    +for user_row in session.execute(statement):
                    +    process_user(user_row)
                    +
                    +
                    +

                    Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

                    +

                    If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

                    +
                    +
                    +

                    Handling Paged Results with Callbacks

                    +

                    If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

                    +

                    Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

                    +
                    class PagedResultHandler(object):
                    +
                    +    def __init__(self, future):
                    +        self.error = None
                    +        self.finished_event = Event()
                    +        self.future = future
                    +        self.future.add_callbacks(
                    +            callback=self.handle_page,
                    +            errback=self.handle_err)
                    +
                    +    def handle_page(self, rows):
                    +        for row in rows:
                    +            process_row(row)
                    +
                    +        if self.future.has_more_pages:
                    +            self.future.start_fetching_next_page()
                    +        else:
                    +            self.finished_event.set()
                    +
                    +    def handle_error(self, exc):
                    +        self.error = exc
                    +        self.finished_event.set()
                    +
                    +future = session.execute_async("SELECT * FROM users")
                    +handler = PagedResultHandler(future)
                    +handler.finished_event.wait()
                    +if handler.error:
                    +    raise handler.error
                    +
                    +
                    +
                    +
                    +

                    Resume Paged Results

                    +

                    You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

                    +
                    from cassandra.query import SimpleStatement
                    +query = "SELECT * FROM users"
                    +statement = SimpleStatement(query, fetch_size=10)
                    +results = session.execute(statement)
                    +
                    +# save the paging_state somewhere and return current results
                    +web_session['paging_state'] = results.paging_state
                    +
                    +
                    +# resume the pagination sometime later...
                    +statement = SimpleStatement(query, fetch_size=10)
                    +ps = web_session['paging_state']
                    +results = session.execute(statement, paging_state=ps)
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/scylla-cloud-serverless.html b/master/scylla-cloud-serverless.html new file mode 100644 index 0000000000..bfd98168bf --- /dev/null +++ b/master/scylla-cloud-serverless.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + ScyllaDB Cloud Serverless | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    ScyllaDB Cloud Serverless

                    +

                    With ScyllaDB Cloud, you can deploy serverless databases. +The Python driver allows you to connect to a serverless database by utilizing the connection bundle you can download via the Connect>Python tab in the Cloud application. +The connection bundle is a YAML file with connection and credential information for your cluster.

                    +

                    Connecting to a ScyllaDB Cloud serverless database is very similar to a standard connection to a ScyllaDB database.

                    +

                    Here’s a short program that connects to a ScyllaDB Cloud serverless database and prints metadata about the cluster:

                    +
                    from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                    +from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy
                    +
                    +PATH_TO_BUNDLE_YAML = '/file/downloaded/from/cloud/connect-bundle.yaml'
                    +
                    +
                    +def get_cluster():
                    +    profile = ExecutionProfile(
                    +        load_balancing_policy=TokenAwarePolicy(
                    +            DCAwareRoundRobinPolicy(local_dc='us-east-1')
                    +        )
                    +    )
                    +
                    +    return Cluster(
                    +        execution_profiles={EXEC_PROFILE_DEFAULT: profile},
                    +        scylla_cloud=PATH_TO_BUNDLE_YAML,
                    +    )
                    +
                    +
                    +print('Connecting to cluster')
                    +cluster = get_cluster()
                    +session = cluster.connect()
                    +
                    +print('Connected to cluster', cluster.metadata.cluster_name)
                    +
                    +print('Getting metadata')
                    +for host in cluster.metadata.all_hosts():
                    +    print('Datacenter: {}; Host: {}; Rack: {}'.format(
                    +        host.datacenter, host.address, host.rack)
                    +    )
                    +
                    +cluster.shutdown()
                    +
                    +
                    +

                    By providing the scylla_cloud parameter to the Cluster constructor, +the driver can set up the connection based on the endpoint and credential information +stored in your downloaded ScyllaDB Cloud Serverless connection bundle.

                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/scylla-cloud.html b/master/scylla-cloud.html new file mode 100644 index 0000000000..df4f4bedd3 --- /dev/null +++ b/master/scylla-cloud.html @@ -0,0 +1,623 @@ + + + + + + + + + + + + + ScyllaDB Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    ScyllaDB Cloud

                    +

                    To connect to a ScyllaDB Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/scylla-specific.html b/master/scylla-specific.html new file mode 100644 index 0000000000..9c84f3652d --- /dev/null +++ b/master/scylla-specific.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Specific Features

                    +
                    +

                    Shard Awareness

                    +

                    scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

                    +

                    Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding

                    +

                    For using it you only need to enable TokenAwarePolicy on the Cluster

                    +

                    See the configuration of native_shard_aware_transport_port and native_shard_aware_transport_port_ssl on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
                    +
                    +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
                    +
                    +
                    +
                    +
                    +

                    New Cluster Helpers

                    +
                      +
                    • shard_aware_options

                      +

                      Setting it to dict(disable=True) would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections

                      +

                      Other option is to configure scylla by setting enable_shard_aware_drivers: false on scylla.yaml.

                      +
                    • +
                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster(shard_aware_options=dict(disable=True))
                    +session = cluster.connect()
                    +
                    +assert not cluster.is_shard_aware(), "Shard aware should be disabled"
                    +
                    +# or just disable the shard aware port logic
                    +cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True))
                    +session = cluster.connect()
                    +
                    +
                    +
                      +
                    • cluster.is_shard_aware()

                      +

                      New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

                      +
                    • +
                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster()
                    +session = cluster.connect()
                    +
                    +if cluster.is_shard_aware():
                    +    print("connected to a scylla cluster")
                    +
                    +
                    +
                      +
                    • cluster.shard_aware_stats()

                      +

                      New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

                      +
                    • +
                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster()
                    +session = cluster.connect()
                    +
                    +stats = cluster.shard_aware_stats()
                    +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
                    +    print("successfully connected to all shards of all scylla nodes")
                    +
                    +
                    +
                    +
                    +

                    New Error Types

                    +
                      +
                    • SCYLLA_RATE_LIMIT_ERROR Error

                      +

                      The ScyllaDB 5.1 introduced a feature called per-partition rate limiting. In case the (user defined) per-partition rate limit is exceeded, the database will start returning a Scylla-specific type of error: RateLimitReached.

                      +
                    • +
                    +
                    from cassandra import RateLimitReached
                    +from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster()
                    +session = cluster.connect()
                    +session.execute("""
                    +    CREATE KEYSPACE IF NOT EXISTS keyspace1
                    +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}
                    +""")
                    +
                    +session.execute("USE keyspace1")
                    +session.execute("""
                    +    CREATE TABLE tbl (pk int PRIMARY KEY, v int)
                    +    WITH per_partition_rate_limit = {'max_writes_per_second': 1}
                    +""")
                    +
                    +prepared = session.prepare("""
                    +    INSERT INTO tbl (pk, v) VALUES (?, ?)
                    +""")
                    +
                    +try:
                    +    for _ in range(1000):
                    +        self.session.execute(prepared.bind((123, 456)))
                    +except RateLimitReached:
                    +    raise
                    +
                    +
                    +
                    +
                    +

                    Tablet Awareness

                    +

                    scylla-driver is tablet aware, which mean that it is able to parse TABLETS_ROUTING_V1 extension to ProtocolFeatures, recieve tablet information send by Scylla in custom_payload part of RESULT message, and utilize it. +Thanks to that queries to tablet based tables are still shard aware.

                    +

                    Details on the scylla cql protocol extensions +https://github.com/scylladb/scylladb/blob/master/docs/dev/protocol-extensions.md#negotiate-sending-tablets-info-to-the-drivers

                    +

                    Details on the sending tablet information to the drivers +https://github.com/scylladb/scylladb/blob/master/docs/dev/protocol-extensions.md#sending-tablet-info-to-the-drivers

                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/search.html b/master/search.html new file mode 100644 index 0000000000..df8d8f9bb4 --- /dev/null +++ b/master/search.html @@ -0,0 +1,605 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + + + + + +
                    + + + + + +
                    + + +
                    +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/searchindex.js b/master/searchindex.js new file mode 100644 index 0000000000..61a093ae8f --- /dev/null +++ b/master/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third-party", "cqlengine/upgrade-guide", "dates-and-times", "execution-profiles", "faq", "getting-started", "index", "installation", "lwt", "object-mapper", "performance", "query-paging", "scylla-cloud", "scylla-cloud-serverless", "scylla-specific", "security", "upgrading", "user-defined-types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third-party.rst", "cqlengine/upgrade-guide.rst", "dates-and-times.rst", "execution-profiles.rst", "faq.rst", "getting-started.rst", "index.rst", "installation.rst", "lwt.rst", "object-mapper.rst", "performance.rst", "query-paging.rst", "scylla-cloud.rst", "scylla-cloud-serverless.rst", "scylla-specific.rst", "security.rst", "upgrading.rst", "user-defined-types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "ScyllaDB Cloud", "ScyllaDB Cloud Serverless", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"march": 0, "2023": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 55, 56], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 53, 54, 55, 56], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 53, 56], "profil": [0, 3, 4, 12, 14, 45, 52], "execute_concurr": [0, 4, 33, 49], "pr": 0, "1122": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "empti": [0, 2, 3, 25, 47], "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 53, 56], "page": [0, 1, 3, 45, 51], "1110": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 54, 55, 56], "re": [0, 27, 30, 37, 38, 39, 44, 46, 54, 56], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 53, 54], "stream": [0, 29], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 54, 56], "flight": [0, 5], "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 54, 55], "1114": 0, "asyncor": [0, 33, 46], "race": 0, "condit": [0, 1, 3, 8, 10, 30, 45], "caus": [0, 3, 10, 26, 37, 47], "log": [0, 3, 8, 27, 30, 31, 44, 45, 55], "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53, 54], "shutdown": [0, 3, 39, 52], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 52, 54, 55, 56], "1266": 0, "warn": [0, 1, 3, 31, 40, 55], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 53, 56], "trace": [0, 3, 33], "1103": 0, "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "mutabl": [0, 3], "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 54], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 53, 54, 55, 56], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 54, 55, 56], "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "1116": 0, "depend": [0, 2, 41, 43, 47, 49], "unittest2": 0, "1289": 0, "asyncio": [0, 33], "coroutin": 0, "annot": 0, "asyncioreactor": [0, 33], "pytthon": 0, "1290": 0, "typo": 0, "sourc": [0, 3, 15, 18, 45, 46], "file": [0, 40, 49, 52, 54], "1126": 0, "hostfilterpolicyinittest": 0, "1131": 0, "dontprepareonignoredhoststest": 0, "1287": 0, "integr": [0, 29, 40, 41, 45, 46, 48, 55], "simulacron": 0, "test_connect": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "1304": 0, "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 52, 54, 55], "test_single_interfac": 0, "py": [0, 46], "appear": [0, 47], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "c": [0, 6, 12, 25, 27, 38, 54], "1329": 0, "authent": [0, 1, 3, 33], "fraudul": 0, "1328": 0, "preparedstatementtest": 0, "test_fail_if_different_query_id_on_reprepar": 0, "unexpectedli": 0, "ptyhon": 0, "1327": 0, "refactor": [0, 41], "unittest": 0, "alias": 0, "compat": [0, 3, 18, 25, 33, 55], "1112": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56], "releas": [0, 9, 27, 40, 42, 54, 55], "well": [0, 27, 35, 44, 54], "2021": 0, "ensur": [0, 3, 4, 9, 27, 39, 46, 54], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55, 56], "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55, 56], "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 54, 55, 56], "invalid": [0, 1, 26, 30], "peer": [0, 5, 25], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54, 55], "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 53, 54], "system": [0, 5, 25, 38, 42, 43, 44, 46, 55], "1260": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 54, 55], "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 53], "v5": [0, 1], "checksum": 0, "1258": 0, "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 55], "mechan": [0, 2, 3, 27, 54], "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 53, 54, 56], "astra": 0, "1265": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 55], "reserv": 0, "keyword": [0, 3, 6, 7, 9, 10], "1269": 0, "drop": [0, 6, 8, 29], "1220": 0, "secur": [0, 45, 55], "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 54, 55], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53, 55, 56], "protocol_tl": [0, 54], "1264": 0, "june": 0, "2020": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 54, 55], "geomet": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 54, 55, 56], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 53, 54, 55, 56], "runtim": [0, 46, 49], "1237": 0, "use_default_tempdir": 0, "cloud": [0, 3, 27, 45], "config": [0, 54], "1245": 0, "tcp": 0, "flow": 0, "control": [0, 3, 4, 27, 30, 40, 49, 54], "libevreactor": [0, 3, 33, 46], "1248": 0, "unabl": [0, 27, 46], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 46, 48, 49, 51, 52, 54, 56], "ubuntu": [0, 46], "04": 0, "1238": 0, "plaintextauthprovid": [0, 2, 3, 33, 54, 55], "unicod": [0, 17, 44], "char": 0, "python3": 0, "1241": 0, "graph": [0, 3], "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 54], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 52, 53, 54, 55], "local_quorum": [0, 1, 44], "1240": 0, "t": [0, 9, 10, 15, 31, 37, 38, 41, 43, 44, 47, 49, 54, 55, 56], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 53, 55, 56], "boolean": [0, 1, 6, 25, 27, 44, 47], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 56], "fluent": [0, 33, 46, 55], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 54], "1239": 0, "elementmap": 0, "deseri": [0, 15, 18, 33, 41], "1233": 0, "bump": 0, "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 55, 56], "1243": 0, "gremlinpython": [0, 46], "1212": 0, "improv": [0, 1, 35, 49, 55], "core": [0, 3, 4, 38, 40, 46, 49], "1244": 0, "april": 0, "transient": 0, "replic": [0, 3, 8, 25, 40, 53], "1207": 0, "peers_v2": 0, "port": [0, 3, 5, 25, 44, 53], "discoveri": 0, "700": 0, "1228": 0, "februari": 0, "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 53, 54, 55], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 53, 54, 55], "resultset": [0, 3, 33, 50, 55], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44, 53], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 54, 55, 56], "schema": [0, 3, 9, 30, 33, 37, 44, 55], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 53, 54, 55], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 53, 55, 56], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 53, 55, 56], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "788": 0, "nativ": [0, 1, 15, 18, 29, 37, 45], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 55, 56], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4, 53], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 53], "1027": 0, "enabl": [0, 3, 10, 44, 53, 54, 55], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 55, 56], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 52, 54, 55], "numer": [0, 41], "wrapper": [0, 27, 30], "proper": [0, 39, 46], "definit": [0, 3, 6, 15, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 54], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "1057": 0, "bulkset": 0, "1060": 0, "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 56], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 54, 55], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 53, 54, 55, 56], "classic": 0, "1090": 0, "1039": 0, "expos": [0, 31, 55], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 15, 25, 26, 30, 32, 38, 45, 55], "1019": 0, "more": [0, 3, 4, 6, 9, 10, 15, 25, 27, 29, 31, 38, 40, 42, 44, 45, 49, 50, 54, 55], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 54], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 53, 54, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 55, 56], "1205": 0, "januari": 0, "unifi": 0, "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 55], "packag": [0, 2, 32, 41, 46, 48, 54, 55], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55, 56], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 53, 54, 55, 56], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 54], "twist": [0, 33, 44], "1161": 0, "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "1048": 0, "flexibl": [0, 45], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 55], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 54, 56], "mismatch": 0, "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 53, 55], "cqlengineexcept": [0, 40], "1166": 0, "messag": [0, 1, 2, 3, 5, 29, 53], "chunk": 0, "process": [0, 3, 4, 20, 43, 44, 46, 49, 53, 54, 55], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 55], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 53, 54], "1181": 0, "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 54], "certif": [0, 54], "hostnam": [0, 27, 54], "sslcontext": [0, 54], "check_hostnam": [0, 54], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 56], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 55], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 54], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 52, 53, 54, 55, 56], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 54, 55, 56], "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 54], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "about": [0, 3, 25, 30, 37, 41, 44, 46, 52, 54, 55], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 53, 54, 55], "balanc": [0, 3, 33, 42, 55], "polici": [0, 3, 33, 42, 43, 44, 52, 53, 55], "1177": 0, "publish": [0, 46, 54], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 55], "next": [0, 3, 21, 27, 42, 48, 50, 54], "major": [0, 27, 42, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 54, 55], "defaultloadbalancingpolici": [0, 27, 55], "1047": 0, "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 53, 54, 55], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 55], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 54], "unknown": [0, 15, 18, 46, 55], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 52, 54, 56], "819": 0, "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 52, 54, 56], "773": 0, "authprovid": [0, 2, 3, 33, 54], "transit": 0, "mode": 0, "831": 0, "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 54], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 55], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45, 53], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 55], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 54], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 54], "574": 0, "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 53, 55], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 55], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 54], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 53], "avail": [0, 3, 10, 30, 38, 45, 46, 53, 55], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 46, 47, 48, 49, 50, 52, 53, 54, 56], "runtimeerror": 0, "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 55], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 52, 53, 54, 56], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 53, 54], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 54, 55], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 54, 55], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53, 54], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 55], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 54, 55], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 55], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 55, 56], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 53, 54, 55], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "709": 0, "socket": [0, 5, 54], "associ": [0, 3, 55], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46, 52], "clean": [0, 39, 46, 55], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 52, 54, 55], "673": 0, "fqdn": [0, 54], "ip": [0, 3, 5, 27, 28, 44, 54], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 52, 54, 55, 56], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 56], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "around": [0, 9, 32, 40, 41, 55], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 54, 55], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 56], "789": 0, "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 54, 55, 56], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 54], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 54, 55], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 54, 55, 56], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 54], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 55], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 46, 48, 54, 55], "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 54], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 53], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44, 52], "1009": 0, "deadlock": [0, 4], "heartbeat": 0, "whilst": 0, "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 55], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 54], "1044": 0, "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 53, 54, 55], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 55], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 55], "1023": 0, "param": [0, 4, 13], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 15, 27, 33, 43, 46, 53], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 56], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 54, 55], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 56], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 55], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 53, 55, 56], "1093": 0, "incorrect": [0, 44], "compact": [0, 9], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53, 54], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 54], "1117": 0, "built": [0, 32, 42, 46, 49, 55], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 53, 55], "doesn": [0, 31, 55], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45, 53], "1127": 0, "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 54, 56], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 54], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41, 52, 53], "1079": 0, "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 54], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 54, 55], "1082": 0, "let": [0, 3, 55], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 52, 53, 54, 55], "sortedset": [0, 32, 33, 55], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 53, 55], "1068": 0, "ssl_context": [0, 3, 44, 54], "995": 0, "encrypt": [0, 54], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 15, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 53, 54, 56], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 53, 55, 56], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 55, 56], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 54, 55, 56], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 55], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55, 56], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 54], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 53, 54, 55], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 53, 55], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 54, 56], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 54, 55], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 55], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 55], "1015": 0, "septemb": 0, "logic": [0, 37, 53], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 53, 55], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43, 53], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 54], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 54, 55], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 54], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 54], "loop": [0, 3, 4, 21, 33, 44, 46, 54], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 54, 55], "subclass": [0, 1, 2, 3, 27, 30, 37, 54], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 55], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 54, 55], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 54, 55, 56], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 55], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 53], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 55], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 53, 54], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 54, 55], "cassandra_vers": 0, "910": 0, "kind": [0, 27, 55], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 55, 56], "915": 0, "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53, 54], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 56], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 54, 56], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 54, 56], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 55, 56], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 56], "865": 0, "deprecationwarn": [0, 55], "846": 0, "example_mapp": 0, "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 54, 55], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 54], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 54], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42, 52], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 55], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 55], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 55, 56], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 55], "810": 0, "833": 0, "juli": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 54, 55], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 55], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 54], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 54], "772": 0, "pool": [0, 1, 3, 33, 55], "739": 0, "murmur3": [0, 3, 46], "big": [0, 53], "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 55], "785": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 54], "464": 0, "inupt": 0, "microsecond": [0, 31, 55], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 53, 56], "705": 0, "get_query_trac": [0, 3, 43, 55], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 55], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44, 53], "drain": 0, "734": 0, "resulset": 0, "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 55], "grow": 0, "720": 0, "size": [0, 3, 10, 55], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 53, 54, 55, 56], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 54], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "callback": [0, 3, 10, 44, 49, 54], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 55], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 53, 54], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 55], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 53], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52, 53], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 55], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 55], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 52, 55], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 55], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 55], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 53, 54, 55, 56], "lead": [0, 34, 49, 55], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 56], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 54, 55], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 54, 55], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 54], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 55], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 55], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 56], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 55], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 55], "stat": [0, 26, 53], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 53, 55], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 54, 55], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 54, 55], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 55], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 55], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46, 53], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 53], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "569": 0, "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 54], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37, 52], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 55, 56], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49, 53], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "434": 0, "unicodedecodeerror": 0, "bop": 0, "559": 0, "565": 0, "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 53], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46, 53], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 55], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 54, 55], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 54, 55], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 54, 55], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 55], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 53, 55, 56], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 54], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 55], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 52, 54], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 53, 55], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 55], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 55], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 53, 54], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 53], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53, 54], "489": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": [0, 53], "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 55, 56], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 55], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55, 56], "might": [0, 3, 30, 50, 54], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 54, 56], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 54, 55], "access": [0, 3, 9, 26, 30, 37, 44, 55], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 54, 55], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 54, 55, 56], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 54, 55], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28, 52], "dc": [0, 3, 27, 55], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 55], "408": [0, 55], "400": [0, 55], "422": [0, 55], "292": [0, 55], "318": [0, 55], "368": [0, 55], "371": 0, "blist": 0, "soft": 0, "385": [0, 55], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44, 53], "178": [0, 30, 55], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "pagedresult": [0, 50, 55], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "397": 0, "398": 0, "extens": [0, 3, 27, 41, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 53, 56], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 55], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38, 53], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 55], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 55], "round": [0, 27, 32], "341": 0, "sizeti": 0, "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48, 53], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 55], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 54], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 55], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 54], "patch": [0, 21, 22, 41, 54], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 54], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 55], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 55], "243": 0, "kerbero": [0, 54], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 55], "192": [0, 3, 44], "set_keyspac": [0, 3, 27, 44, 56], "195": 0, "implicit": [0, 10, 55], "204": 0, "collis": 0, "sasl": [0, 2, 54], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 55], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44, 53], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 55], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 55], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41, 52], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27, 52], "contact_point": [0, 3, 7, 27, 54], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 55], "88": 0, "constructor": [0, 3, 6, 38, 52], "basi": [0, 55], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 53], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 53, 54, 55], "use_client_timestamp": [0, 1, 3, 55], "overrid": [0, 3, 9, 15, 18, 42, 44, 55], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 53, 56], "refer": [0, 10, 34, 40, 42, 47, 55], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 55], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 55], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 54, 55, 56], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 55], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 54, 55, 56], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 54], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 54, 55, 56], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 52, 54, 55], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 53], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 55], "help": [0, 38, 55], "done": [0, 3, 37, 41, 43, 54, 55], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 54, 55], "guarante": [0, 27, 30, 55], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 55, 56], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 54], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 53, 54, 55, 56], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 52, 54, 55, 56], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 53, 54, 55], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 55], "left": [0, 3, 4, 9, 41, 55], "place": [0, 40, 44, 55], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 55], "dict_factori": [0, 3, 7, 16, 30, 33, 55], "ordered_dict_factori": [0, 3, 16, 30, 33, 55], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 54, 55, 56], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 55], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 53, 55], "executor": 0, "becom": [0, 3, 8, 49, 55], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 54, 55], "lowercas": 0, "liter": [0, 15, 17, 18, 30, 41, 44, 55, 56], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 55], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 55, 56], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28, 52], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 54, 55], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 53, 54, 55], "never": [0, 27, 34, 47, 49, 55], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 55], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": 0, "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 54, 55], "main": [0, 3, 54, 56], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 49, 53, 54, 55], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 54, 55], "strong": 0, "garbag": [0, 55], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 55], "twice": 0, "had": [0, 40, 55], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 56], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 53], "parallel": 0, "sesssion": 0, "effort": [0, 40, 54], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 54], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 55], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 54], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 53], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 54], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 52, 54], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 53, 55, 56], "constant": [0, 54], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 55], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 52, 54, 55], "ONE": [1, 3, 10, 40, 55], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 56], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 54, 56], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 53, 54, 56], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 53, 56], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53, 54], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 55, 56], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 54, 56], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 54], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 55], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27, 52, 53], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 53], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 55], "higher": [1, 3, 4, 30, 54, 55], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 55], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 54], "author": [1, 54], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 55], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": [2, 53], "on_authentication_success": 2, "exact": 2, "natur": 2, "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 54], "usernam": [2, 44, 54], "password": [2, 54], "passwordauthent": [2, 54], "auth_provid": [2, 3, 54], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 54], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 53, 54, 55, 56], "servic": [2, 54], "someth": [2, 27, 37, 38, 46, 54], "qop": [2, 54], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 54], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 54], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "load_balancing_polici": [3, 27, 42, 44, 52, 53], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 53, 54, 55], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 54], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 54, 56], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44, 53], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 54, 55], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50, 53], "purpos": [3, 6], "register_user_typ": [3, 55, 56], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 54, 55], "whose": 3, "mykeyspac": [3, 30, 44, 55, 56], "street": [3, 11, 37, 55, 56], "zipcod": [3, 11, 37, 55, 56], "locat": [3, 40, 54, 56], "def": [3, 27, 34, 37, 39, 43, 44, 50, 52, 54, 55, 56], "self": [3, 15, 18, 37, 50, 53, 55, 56], "INTO": [3, 4, 30, 44, 47, 53, 56], "st": [3, 37, 56], "78723": [3, 56], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 53, 56], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44, 52], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 55], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 55], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 52, 54], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": 3, "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 54], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 55], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 55], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 56], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "24": 3, "appropri": [3, 37, 46, 54], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44, 52], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 55], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 54], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 54], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30, 53], "paging_st": [3, 50], "execute_a": [3, 54, 55], "placehold": [3, 15, 18, 30, 44, 56], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 54], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 55], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 56], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 54], "expir": 3, "exceed": [3, 4, 53], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 55], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 54], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "errback_kwarg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 54, 55], "backward": [3, 18, 25, 55], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 54], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 55, 56], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 55], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 52, 54], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 54], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 53], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42, 52, 53], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47, 52], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 54], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 54], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 53], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 53], "www": 6, "com": [6, 10, 53, 54], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 53], "durable_writ": 8, "simplestrategi": [8, 25, 53], "caution": [8, 37], "product": [8, 48, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 54, 55], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 53, 56], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 55], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 54], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 55], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 55], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 55], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 54], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 54], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 54], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 55], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 55], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "val": 15, "concis": 15, "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 55], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 54], "handle_fork": 20, "eventletconnect": [21, 33, 54], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 55], "twistedconnect": [24, 33, 54], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42, 52], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 55], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "replicationfactor": 25, "all_replica": 25, "transient_replica": 25, "options_map": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 54], "pmfstat": 26, "latenc": [26, 44, 53], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 54], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 53], "evenli": 27, "what": [27, 30, 37, 41, 54, 55, 56], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 52, 54], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 54], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 53, 55], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 54, 55], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 54, 55], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 54], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 54], "silent": 27, "idea": 27, "best": [27, 44, 51, 54], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 54], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 54], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 55], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 54], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "23": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "eventletreactor": 33, "twistedreactor": [33, 54], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 54], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 53], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 54], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 54, 55], "presist": 37, "pattern": [37, 49], "joe": [37, 54], "99999": 37, "ll": [38, 54], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 54], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 55], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44, 53], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 53], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 55], "scylla": [38, 40, 46, 51, 55], "21": 38, "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "26": 38, "17": [38, 54], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 55], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 55], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 55], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": [42, 53], "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 55, 56], "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 54], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 56], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49], "handle_success": 44, "rememb": 44, "user1": [44, 54], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "upgrad": [45, 48, 54], "scylladb": [45, 53], "serverless": 45, "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 55], "reinstal": 46, "22": 46, "abl": [46, 53], "snappi": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 54], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": [46, 53], "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 54], "mussei": [46, 54], "thorough": [46, 54], "outcom": 47, "pertin": 47, "reject": 47, "statu": [47, 53], "squar": 47, "bracket": 47, "AND": 47, "retun": 47, "jump": 48, "migrat": 48, "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 54], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "p": 50, "deploi": 52, "bundl": 52, "download": 52, "tab": 52, "veri": [52, 54], "program": 52, "path_to_bundle_yaml": 52, "get_clust": 52, "east": 52, "scylla_cloud": 52, "cluster_nam": 52, "onward": 53, "md": 53, "intranod": 53, "native_shard_aware_transport_port": 53, "native_shard_aware_transport_port_ssl": 53, "shard_aware_opt": 53, "enable_shard_aware_driv": 53, "is_shard_awar": 53, "disable_shardaware_port": 53, "shard_aware_stat": 53, "shards_count": 53, "scylla_rate_limit_error": 53, "rate": 53, "ratelimitreach": 53, "keyspace1": 53, "tbl": 53, "per_partition_rate_limit": 53, "max_writes_per_second": 53, "456": 53, "tablets_routing_v1": 53, "protocolfeatur": 53, "reciev": 53, "thank": 53, "get_credenti": 54, "host_address": 54, "1234": 54, "wrap_socket": 54, "create_default_context": 54, "server_hostnam": 54, "keystor": 54, "intruct": 54, "cert": 54, "understand": 54, "demonstr": 54, "deploy": 54, "client_encryption_opt": 54, "keystore_password": 54, "mystorepass": 54, "require_client_auth": 54, "verify_mod": 54, "cert_requir": 54, "load_verify_loc": 54, "rootca": 54, "crt": 54, "truststor": 54, "jk": 54, "truststore_password": 54, "pem": 54, "conf": 54, "gen_client_cert": 54, "eof": 54, "req": 54, "distinguished_nam": 54, "req_distinguished_nam": 54, "output_password": 54, "root_cert_pass": 54, "default_bit": 54, "2048": 54, "cert_countri": 54, "cert_org_nam": 54, "ou": 54, "cert_ou": 54, "cn": 54, "root": 54, "Then": 54, "openssl": 54, "newkei": 54, "rsa": 54, "keyout": 54, "csr": 54, "x509": 54, "root_ca_base_nam": 54, "cakei": 54, "passin": 54, "crt_sign": 54, "cert_valid": 54, "cacreateseri": 54, "load_cert_chain": 54, "certfil": 54, "keyfil": 54, "crypto": 54, "tlsv1_2_method": 54, "set_verifi": 54, "verify_p": 54, "lambda": 54, "_1": 54, "_2": 54, "_3": 54, "_4": 54, "use_certificate_fil": 54, "use_privatekey_fil": 54, "ca_cert": 54, "ssl_version": 54, "ssl_opt": 54, "my": 54, "cert_req": 54, "risen": 54, "advanc": 54, "dseplaintextauthprovid": 54, "act": 54, "permiss": 54, "grant": 54, "role": 54, "plain": 54, "authorization_id": 54, "ticket": 54, "kinit": 54, "offici": [54, 55], "dse_graph": 55, "swap": 55, "rework": 55, "mesh": 55, "afterward": 55, "got": 55, "row_list": 55, "first_result": 55, "variant": 55, "brought": 55, "overhaul": 55, "highlight": 55, "nomenclatur": 55, "keyspace_nam": 55, "031ebb0": 55, "refresh_": 55, "_metadata": 55, "419fcdf": 55, "submit_schema_refresh": 55, "574266d": 55, "cqltype": 55, "bb984ee": 55, "e16a073": 55, "cc94073": 55, "from_datetim": 55, "96489cc": 55, "a2d3a98": 55, "4bd5909": 55, "__polymorphic_": 55, "__discrimin": 55, "9d98c8e": 55, "79efe97": 55, "citi": 55, "zip": [55, 56], "though": 55, "notabl": 55, "simpler": 55, "unclean": 55, "tell": 56, "insert_stat": 56, "otherstuff": 56, "first_row": 56, "fine": 56, "unprepar": 56, "parameter": 56, "interpol": 56}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph": [[12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 3, 1, "", "ReplicationFactor"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 54, 55], "26": 0, "0": [0, 54, 55], "featur": [0, 29, 53, 55], "bug": 0, "fix": 0, "other": 0, "deprec": [0, 40, 55], "25": 0, "24": 0, "23": 0, "22": 0, "21": 0, "20": 0, "2": [0, 55], "1": [0, 55], "19": 0, "18": 0, "17": 0, "16": [0, 54], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 55], "x": [0, 55], "upgrad": [0, 40, 55], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 55], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 54, 55], "cluster": [3, 42, 44, 53, 55], "session": [3, 44, 55], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 55], "execut": [4, 34, 42, 44, 54, 55], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 55], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 53, 55, 56], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 56], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 55], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 56], "user": [11, 37, 55, 56], "defin": [11, 37, 55, 56], "datastax": [12, 13, 14, 15, 33], "graph": [12, 13, 14, 15, 18, 33, 46, 55], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 55], "format": 16, "encod": [17, 55], "non": [17, 46, 55], "prepar": [17, 30, 44, 55], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 54], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 54], "metadata": [25, 55], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 54], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 54, 55], "custom": [29, 54, 55], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 55], "trace": [30, 43, 55], "timestamp": [31, 41, 55], "gener": [31, 34], "api": [33, 40, 55], "document": 33, "core": 33, "driver": [33, 43, 45], "mapper": [33, 48], "us": [34, 42, 55, 56], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 56], "new": [35, 53], "chang": [35, 40, 55], "default": [35, 38, 42, 47, 55], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 55], "work": [36, 41, 55], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 55], "delet": 36, "individu": 36, "exampl": [37, 54], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 55], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 55], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 55], "organ": 40, "import": [40, 55], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": [42, 44], "legaci": 42, "paramet": [42, 44, 55], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 56], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "keyspac": 44, "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 55], "specul": 44, "python": [45, 46], "scylla": [45, 53], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 55], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 54], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": [46, 53], "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 55], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 55], "configur": [46, 54], "ssl": [46, 54], "lightweight": [47, 55], "transact": [47, 55], "compar": 47, "special": 47, "result": [47, 50, 55], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 55], "larg": 50, "control": 50, "size": 50, "resum": 50, "scylladb": [51, 52], "cloud": [51, 52], "serverless": 52, "specif": 53, "shard": 53, "awar": 53, "helper": 53, "tablet": 53, "secur": 54, "v1": 54, "No": 54, "ident": 54, "verif": 54, "client": [54, 55], "version": 54, "lower": 54, "dse": [54, 55], "unifi": 54, "proxi": 54, "login": 54, "modul": 55, "execute_async": 55, "now": 55, "local_on": 55, "normal": 55, "inform": 55, "attach": 55, "bind": 55, "ignor": 55, "extra": 55, "blist": 55, "soft": 55, "sever": 55, "v3": 55, "nativ": 55, "side": 55, "v2": 55, "automat": 55, "sasl": 55, "call": 55, "shutdown": 55, "udt": 56, "dict": 56, "them": 56}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "Model Inheritance": [[37, "model-inheritance"], [40, "model-inheritance"]], "User Defined Types": [[37, "user-defined-types"], [56, "user-defined-types"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "Frequently Asked Questions": [[36, "frequently-asked-questions"], [43, "frequently-asked-questions"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Execution Profiles": [[42, "execution-profiles"], [44, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Registering a UDT": [[56, "registering-a-udt"]], "Map a Class to a UDT": [[56, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[56, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[56, "using-udts-without-registering-them"]], "Upgrading": [[55, "upgrading"]], "Installation": [[55, "installation"], [46, "installation"]], "Import from the cassandra module": [[55, "import-from-the-cassandra-module"]], "dse-graph": [[55, "dse-graph"]], "Session.execute and Session.execute_async API": [[55, "session-execute-and-session-execute-async-api"]], "Deprecations": [[55, "deprecations"], [55, "id2"], [0, "deprecations"], [0, "id20"], [0, "id43"], [0, "id168"]], "Upgrading to 3.0": [[55, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[55, "default-consistency-is-now-local-one"]], "Execution API Updates": [[55, "execution-api-updates"]], "Result return normalization": [[55, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[55, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[55, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[55, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[55, "metadata-api-updates"]], "Several deprecated features are removed": [[55, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[55, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[55, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[55, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[55, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[55, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[55, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[55, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[55, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[55, "protocol-level-batch-statements"]], "SASL-based Authentication": [[55, "sasl-based-authentication"]], "Lightweight Transactions": [[55, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[55, "calling-cluster-shutdown"]], "Dependency Changes": [[55, "dependency-changes"]], "Contents": [[48, "contents"], [45, "contents"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Security": [[54, "security"]], "Authentication": [[54, "authentication"]], "Custom Authenticators": [[54, "custom-authenticators"]], "Protocol v1 Authentication": [[54, "protocol-v1-authentication"]], "SSL": [[54, "ssl"]], "SSL with Twisted or Eventlet": [[54, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[54, "ssl-configuration-examples"]], "No identity verification": [[54, "no-identity-verification"]], "Client verifies server": [[54, "client-verifies-server"]], "Server verifies client": [[54, "server-verifies-client"]], "Server verifies client and client verifies server": [[54, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[54, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[54, "ssl-with-twisted"]], "DSE Authentication": [[54, "dse-authentication"]], "DSE Unified Authentication": [[54, "dse-unified-authentication"]], "Proxy Login": [[54, "proxy-login"]], "Proxy Execute": [[54, "proxy-execute"]], "ScyllaDB Cloud Serverless": [[52, "scylladb-cloud-serverless"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "Connecting to a Cluster": [[44, "connecting-to-a-cluster"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Session Keyspace": [[44, "session-keyspace"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) Graph": [[46, "optional-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Scylla Specific Features": [[53, "scylla-specific-features"]], "Shard Awareness": [[53, "shard-awareness"]], "New Cluster Helpers": [[53, "new-cluster-helpers"]], "New Error Types": [[53, "new-error-types"]], "Tablet Awareness": [[53, "tablet-awareness"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "ScyllaDB Cloud": [[51, "scylladb-cloud"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "CHANGELOG": [[0, "changelog"]], "3.26.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id7"], [0, "id11"], [0, "id14"], [0, "id17"], [0, "id21"], [0, "id28"], [0, "id31"], [0, "id35"], [0, "id40"], [0, "id50"], [0, "id54"], [0, "id57"], [0, "id61"], [0, "id65"], [0, "id69"], [0, "id73"], [0, "id79"], [0, "id85"], [0, "id88"], [0, "id91"], [0, "id96"], [0, "id99"], [0, "id104"], [0, "id109"], [0, "id113"], [0, "id115"], [0, "id122"], [0, "id126"], [0, "id128"], [0, "id133"], [0, "id136"], [0, "id139"], [0, "id142"], [0, "id145"], [0, "id153"], [0, "id160"], [0, "id162"], [0, "id166"], [0, "id170"], [0, "id176"], [0, "id186"], [0, "id188"], [0, "id193"], [0, "id196"], [0, "id198"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id8"], [0, "id12"], [0, "id15"], [0, "id18"], [0, "id22"], [0, "id24"], [0, "id26"], [0, "id29"], [0, "id32"], [0, "id36"], [0, "id38"], [0, "id41"], [0, "id45"], [0, "id48"], [0, "id51"], [0, "id58"], [0, "id62"], [0, "id66"], [0, "id70"], [0, "id74"], [0, "id77"], [0, "id80"], [0, "id83"], [0, "id86"], [0, "id89"], [0, "id92"], [0, "id94"], [0, "id97"], [0, "id100"], [0, "id105"], [0, "id107"], [0, "id110"], [0, "id114"], [0, "id116"], [0, "id118"], [0, "id120"], [0, "id123"], [0, "id125"], [0, "id127"], [0, "id129"], [0, "id131"], [0, "id134"], [0, "id137"], [0, "id140"], [0, "id143"], [0, "id146"], [0, "id149"], [0, "id151"], [0, "id154"], [0, "id156"], [0, "id158"], [0, "id161"], [0, "id163"], [0, "id167"], [0, "id171"], [0, "id174"], [0, "id177"], [0, "id180"], [0, "id183"], [0, "id185"], [0, "id189"], [0, "id191"], [0, "id194"], [0, "id197"], [0, "id199"], [0, "id201"]], "Others": [[0, "others"], [0, "id5"], [0, "id9"], [0, "id19"]], "3.25.0": [[0, "id2"]], "3.24.0": [[0, "id6"]], "3.23.0": [[0, "id10"]], "3.22.0": [[0, "id13"]], "3.21.0": [[0, "id16"]], "Other": [[0, "other"], [0, "id33"], [0, "id42"], [0, "id46"], [0, "id52"], [0, "id55"], [0, "id59"], [0, "id63"], [0, "id67"], [0, "id71"], [0, "id75"], [0, "id81"], [0, "id111"], [0, "id147"], [0, "id152"], [0, "id164"], [0, "id172"], [0, "id178"], [0, "id181"], [0, "id184"], [0, "id187"], [0, "id190"], [0, "id192"], [0, "id195"], [0, "id200"]], "3.20.2": [[0, "id23"]], "3.20.1": [[0, "id25"]], "3.20.0": [[0, "id27"]], "3.19.0": [[0, "id30"]], "3.18.0": [[0, "id34"]], "3.17.1": [[0, "id37"]], "3.17.0": [[0, "id39"]], "3.16.0": [[0, "id44"]], "3.15.1": [[0, "id47"]], "3.15.0": [[0, "id49"]], "3.14.0": [[0, "id53"]], "3.13.0": [[0, "id56"]], "3.12.0": [[0, "id60"]], "3.11.0": [[0, "id64"]], "3.10.0": [[0, "id68"]], "3.9.0": [[0, "id72"]], "3.8.1": [[0, "id76"]], "3.8.0": [[0, "id78"]], "3.7.1": [[0, "id82"]], "3.7.0": [[0, "id84"]], "3.6.0": [[0, "id87"]], "3.5.0": [[0, "id90"]], "3.4.1": [[0, "id93"]], "3.4.0": [[0, "id95"]], "3.3.0": [[0, "id98"]], "3.2.2": [[0, "id101"]], "3.2.1": [[0, "id102"]], "3.2.0": [[0, "id103"]], "3.1.1": [[0, "id106"]], "3.1.0": [[0, "id108"]], "3.0.0": [[0, "id112"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id117"]], "2.7.1": [[0, "id119"]], "2.7.0": [[0, "id121"]], "2.6.0": [[0, "id124"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id130"]], "2.5.0": [[0, "id132"]], "2.1.4": [[0, "id135"]], "2.1.3": [[0, "id138"]], "2.1.2": [[0, "id141"]], "2.1.1": [[0, "id144"]], "2.1.0": [[0, "id148"]], "2.1.0c1": [[0, "id150"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id155"]], "2.0.1": [[0, "id157"]], "2.0.0": [[0, "id159"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id165"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id169"]], "1.1.1": [[0, "id173"]], "1.1.0": [[0, "id175"]], "1.0.2": [[0, "id179"]], "1.0.1": [[0, "id182"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationfactor (class in cassandra.metadata)": [[25, "cassandra.metadata.ReplicationFactor"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/master/security.html b/master/security.html new file mode 100644 index 0000000000..aa65110c1e --- /dev/null +++ b/master/security.html @@ -0,0 +1,1015 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Security

                    +

                    The two main security components you will use with the +Python driver are Authentication and SSL.

                    +
                    +

                    Authentication

                    +

                    Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

                    +

                    For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.auth import PlainTextAuthProvider
                    +
                    +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
                    +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
                    +
                    +
                    +
                    +

                    Custom Authenticators

                    +

                    If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

                    +
                    +
                    +

                    Protocol v1 Authentication

                    +

                    When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

                    +
                    from cassandra.cluster import Cluster
                    +
                    +def get_credentials(host_address):
                    +    return {'username': 'joe', 'password': '1234'}
                    +
                    +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
                    +
                    +
                    +
                    +
                    +
                    +

                    SSL

                    +

                    SSL should be used when client encryption is enabled in Cassandra.

                    +

                    To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

                    +

                    To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

                    +

                    If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

                    +

                    The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

                    + +

                    It might be also useful to learn about the different levels of identity verification to understand the examples:

                    + +
                    +

                    SSL with Twisted or Eventlet

                    +

                    Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

                    +
                    +
                    +

                    SSL Configuration Examples

                    +

                    Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

                    +
                    +

                    No identity verification

                    +

                    No identity verification at all. Note that this is not recommended for for production deployments.

                    +

                    The Cassandra configuration:

                    +
                    client_encryption_options:
                    +  enabled: true
                    +  keystore: /path/to/127.0.0.1.keystore
                    +  keystore_password: myStorePass
                    +  require_client_auth: false
                    +
                    +
                    +

                    The driver configuration:

                    +
                    from cassandra.cluster import Cluster, Session
                    +from ssl import SSLContext, PROTOCOL_TLS
                    +
                    +ssl_context = SSLContext(PROTOCOL_TLS)
                    +
                    +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                    +session = cluster.connect()
                    +
                    +
                    +
                    +
                    +

                    Client verifies server

                    +

                    Ensure the python driver verifies the identity of the server.

                    +

                    The Cassandra configuration:

                    +
                    client_encryption_options:
                    +  enabled: true
                    +  keystore: /path/to/127.0.0.1.keystore
                    +  keystore_password: myStorePass
                    +  require_client_auth: false
                    +
                    +
                    +

                    For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

                    +
                    from cassandra.cluster import Cluster, Session
                    +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                    +
                    +ssl_context = SSLContext(PROTOCOL_TLS)
                    +ssl_context.load_verify_locations('/path/to/rootca.crt')
                    +ssl_context.verify_mode = CERT_REQUIRED
                    +
                    +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                    +session = cluster.connect()
                    +
                    +
                    +

                    Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

                    +
                    from cassandra.cluster import Cluster, Session
                    +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                    +
                    +ssl_context = SSLContext(PROTOCOL_TLS)
                    +ssl_context.load_verify_locations('/path/to/rootca.crt')
                    +ssl_context.verify_mode = CERT_REQUIRED
                    +ssl_context.check_hostname = True
                    +ssl_options = {'server_hostname': '127.0.0.1'}
                    +
                    +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
                    +session = cluster.connect()
                    +
                    +
                    +
                    +
                    +

                    Server verifies client

                    +

                    If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

                    +

                    The cassandra configuration:

                    +
                    client_encryption_options:
                    +  enabled: true
                    +  keystore: /path/to/127.0.0.1.keystore
                    +  keystore_password: myStorePass
                    +  require_client_auth: true
                    +  truststore: /path/to/dse-truststore.jks
                    +  truststore_password: myStorePass
                    +
                    +
                    +

                    The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

                    +
                    cat > gen_client_cert.conf <<EOF
                    +[ req ]
                    +distinguished_name = req_distinguished_name
                    +prompt = no
                    +output_password = ${ROOT_CERT_PASS}
                    +default_bits = 2048
                    +
                    +[ req_distinguished_name ]
                    +C = ${CERT_COUNTRY}
                    +O = ${CERT_ORG_NAME}
                    +OU = ${CERT_OU}
                    +CN = client
                    +EOF
                    +
                    +
                    +

                    Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

                    +
                    openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
                    +
                    +
                    +

                    And generate the client signed certificate:

                    +
                    openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
                    +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
                    +
                    +
                    +

                    Finally, you can use that configuration with the following driver code:

                    +
                    from cassandra.cluster import Cluster, Session
                    +from ssl import SSLContext, PROTOCOL_TLS
                    +
                    +ssl_context = SSLContext(PROTOCOL_TLS)
                    +ssl_context.load_cert_chain(
                    +    certfile='/path/to/client.crt_signed',
                    +    keyfile='/path/to/client.key')
                    +
                    +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                    +session = cluster.connect()
                    +
                    +
                    +
                    +
                    +

                    Server verifies client and client verifies server

                    +

                    See the previous section for examples of Cassandra configuration and preparing +the client certificates.

                    +

                    The following driver code specifies that the connection should use two-way verification:

                    +
                    from cassandra.cluster import Cluster, Session
                    +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                    +
                    +ssl_context = SSLContext(PROTOCOL_TLS)
                    +ssl_context.load_verify_locations('/path/to/rootca.crt')
                    +ssl_context.verify_mode = CERT_REQUIRED
                    +ssl_context.load_cert_chain(
                    +    certfile='/path/to/client.crt_signed',
                    +    keyfile='/path/to/client.key')
                    +
                    +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                    +session = cluster.connect()
                    +
                    +
                    +

                    The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

                    +

                    Server verifies client and client verifies server using Twisted and pyOpenSSL

                    +
                    from OpenSSL import SSL, crypto
                    +from cassandra.cluster import Cluster
                    +from cassandra.io.twistedreactor import TwistedConnection
                    +
                    +ssl_context = SSL.Context(SSL.TLSv1_2_METHOD)
                    +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
                    +ssl_context.use_certificate_file('/path/to/client.crt_signed')
                    +ssl_context.use_privatekey_file('/path/to/client.key')
                    +ssl_context.load_verify_locations('/path/to/rootca.crt')
                    +
                    +cluster = Cluster(
                    +    contact_points=['127.0.0.1'],
                    +    connection_class=TwistedConnection,
                    +    ssl_context=ssl_context,
                    +    ssl_options={'check_hostname': True}
                    +)
                    +session = cluster.connect()
                    +
                    +
                    +

                    Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

                    +
                    +
                    +
                    +

                    Versions 3.16.0 and lower

                    +

                    To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

                    +

                    By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLS to match +Cassandra’s default protocol.

                    +

                    For example:

                    +
                    from cassandra.cluster import Cluster
                    +from ssl import PROTOCOL_TLS, CERT_REQUIRED
                    +
                    +ssl_opts = {
                    +    'ca_certs': '/path/to/my/ca.certs',
                    +    'ssl_version': PROTOCOL_TLS,
                    +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
                    +}
                    +cluster = Cluster(ssl_options=ssl_opts)
                    +
                    +
                    +

                    This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

                    +
                    +

                    SSL with Twisted

                    +

                    In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

                    +
                    +
                    +
                    +
                    +

                    DSE Authentication

                    +

                    When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

                    +
                    from cassandra.auth import DSEGSSAPIAuthProvider
                    +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
                    +cluster = Cluster(auth_provider=auth_provider)
                    +session = cluster.connect()
                    +
                    +
                    +

                    Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

                    +
                    +

                    DSE Unified Authentication

                    +

                    With DSE (>=5.1), unified Authentication allows you to:

                    +
                      +
                    • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

                    • +
                    • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

                    • +
                    +
                    +

                    Proxy Login

                    +

                    Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

                    +
                    GRANT PROXY.LOGIN on role user1 to server
                    +
                    +
                    +

                    then you can do the proxy authentication….

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.auth import SaslAuthProvider
                    +
                    +sasl_kwargs = {
                    +  "service": 'dse',
                    +  "mechanism":"PLAIN",
                    +  "username": 'server',
                    +  'password': 'server',
                    +  'authorization_id': 'user1'
                    +}
                    +
                    +auth_provider = SaslAuthProvider(**sasl_kwargs)
                    +c = Cluster(auth_provider=auth_provider)
                    +s = c.connect()
                    +s.execute(...)  # all requests will be executed as 'user1'
                    +
                    +
                    +

                    If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.auth import DSEGSSAPIAuthProvider
                    +
                    +# Ensure the kerberos ticket of the server user is set with the kinit utility.
                    +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
                    +                                      authorization_id='user1@DATASTAX.COM')
                    +c = Cluster(auth_provider=auth_provider)
                    +s = c.connect()
                    +s.execute(...)  # all requests will be executed as 'user1'
                    +
                    +
                    +
                    +
                    +

                    Proxy Execute

                    +

                    Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

                    +
                    GRANT PROXY.EXECUTE on role user1 to server
                    +
                    +
                    +

                    then you can do a proxy execute…

                    +
                    from cassandra.cluster import Cluster
                    +from cassandra.auth import DSEPlainTextAuthProvider,
                    +
                    +auth_provider = DSEPlainTextAuthProvider('server', 'server')
                    +
                    +c = Cluster(auth_provider=auth_provider)
                    +s = c.connect()
                    +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
                    +
                    +
                    +

                    Please see the official documentation for more details on the feature and configuration process.

                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/sitemap.xml b/master/sitemap.xml new file mode 100644 index 0000000000..c73ff5d8ec --- /dev/null +++ b/master/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade-guide.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-specific.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/dates-and-times.htmlhttps://python-driver.docs.scylladb.com/stable/execution-profiles.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/getting-started.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/user-defined-types.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third-party.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/object-mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query-paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-cloud-serverless.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/master/upgrading.html b/master/upgrading.html new file mode 100644 index 0000000000..4115560643 --- /dev/null +++ b/master/upgrading.html @@ -0,0 +1,1004 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrading

                    +
                    +
                    +
                    +

                    Installation

                    +

                    Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

                    +
                    pip install scylla-driver
                    +
                    +
                    +

                    If you need the Graph Fluent API (features provided by dse-graph):

                    +
                    pip install scylla-driver[graph]
                    +
                    +
                    +

                    See Installation for more details.

                    +
                    +
                    +

                    Import from the cassandra module

                    +

                    There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

                    +
                    from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
                    +from dse.auth import PlainTextAuthProvider
                    +from dse.policies import WhiteListRoundRobinPolicy
                    +
                    +# becomes
                    +
                    +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
                    +from cassandra.auth import PlainTextAuthProvider
                    +from cassandra.policies import WhiteListRoundRobinPolicy
                    +
                    +
                    +

                    Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

                    +
                    +
                    +

                    dse-graph

                    +

                    dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

                    +
                    from dse_graph import ..
                    +from dse_graph.query import ..
                    +
                    +# becomes
                    +
                    +from cassandra.datastax.graph.fluent import ..
                    +from cassandra.datastax.graph.fluent.query import ..
                    +
                    +
                    +

                    See fluent.

                    +
                    +
                    +

                    Session.execute and Session.execute_async API

                    +

                    Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

                    +

                    See Session.execute().

                    +
                    +
                    +

                    Deprecations

                    +

                    These changes are optional, but recommended:

                    +
                      +
                    • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

                    • +
                    • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

                    • +
                    +
                    +

                    Upgrading to 3.0

                    +

                    Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

                    +
                    +
                    +
                    +

                    Default consistency is now LOCAL_ONE

                    +

                    Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

                    +
                    +
                    +

                    Execution API Updates

                    +
                    +

                    Result return normalization

                    +

                    PYTHON-368

                    +

                    Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

                    +

                    Now, all results are returned as an iterable ResultSet.

                    +

                    The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

                    +
                    results = session.execute("SELECT * FROM system.local")
                    +for row in results:
                    +    process(row)
                    +
                    +
                    +

                    If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

                    +
                    results = session.execute("SELECT * FROM system.local")
                    +row_list = list(results)
                    +
                    +
                    +

                    For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

                    +
                    results = session.execute("SELECT * FROM system.local")
                    +first_result = results[0]  # materializes results, fetching all pages
                    +
                    +
                    +

                    This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

                    +
                    +
                    +

                    Trace information is not attached to executed Statements

                    +

                    PYTHON-318

                    +

                    Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

                    +

                    Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

                    +

                    ResponseFuture.get_query_trace()

                    +

                    ResponseFuture.get_all_query_traces()

                    +

                    ResultSet.get_query_trace()

                    +

                    ResultSet.get_all_query_traces()

                    +
                    +
                    +

                    Binding named parameters now ignores extra names

                    +

                    PYTHON-178

                    +

                    Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

                    +

                    Behavior in 3.0+ is to ignore extra names.

                    +
                    +
                    +
                    +

                    blist removed as soft dependency

                    +

                    PYTHON-385

                    +

                    Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

                    +

                    Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

                    +
                    +
                    +

                    Metadata API Updates

                    +

                    PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

                    +

                    Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

                    +

                    The present API is documented: cassandra.metadata. Changes highlighted below:

                    +
                      +
                    • All types are now exposed as CQL types instead of types derived from the internal server implementation

                    • +
                    • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

                    • +
                    • Some metadata attributes removed

                      +
                        +
                      • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

                      • +
                      • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

                      • +
                      +
                    • +
                    +
                    +
                    +

                    Several deprecated features are removed

                    +

                    PYTHON-292

                    +
                      +
                    • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

                    • +
                    • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

                    • +
                    • Cluster.submit_schema_refresh removed (574266d)

                    • +
                    • cqltypes time/date functions removed, use util entry points instead (bb984ee)

                    • +
                    • decoder module removed (e16a073)

                    • +
                    • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

                    • +
                    • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

                    • +
                    • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

                    • +
                    • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

                    • +
                    • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

                    • +
                    • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

                    • +
                    +
                    +

                    Upgrading to 2.1 from 2.0

                    +

                    Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

                    +

                    Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

                    +
                    +
                    +
                    +

                    Using the v3 Native Protocol

                    +

                    By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster(protocol_version=3)
                    +
                    +
                    +

                    Note that protocol version 3 is only supported by Cassandra 2.1+.

                    +

                    In future releases, the driver may default to using protocol version +3.

                    +
                    +
                    +

                    Working with User-Defined Types

                    +

                    Cassandra 2.1 introduced the ability to define new types:

                    +
                    USE KEYSPACE mykeyspace;
                    +
                    +CREATE TYPE address (street text, city text, zip int);
                    +
                    +
                    +

                    The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

                    +
                    cluster = Cluster()
                    +
                    +class Address(object):
                    +
                    +    def __init__(self, street, city, zipcode):
                    +        self.street = street
                    +        self.city = text
                    +        self.zipcode = zipcode
                    +
                    +cluster.register_user_type('mykeyspace', 'address', Address)
                    +
                    +
                    +

                    When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

                    +

                    If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

                    +

                    See User Defined Types for more details.

                    +
                    +
                    +

                    Customizing Encoders for Non-prepared Statements

                    +

                    Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

                    +
                    cluster = Cluster()
                    +session = cluster.connect()
                    +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
                    +
                    +
                    +

                    See Type Conversions for the table of default CQL literal conversions.

                    +
                    +
                    +

                    Using Client-Side Protocol-Level Timestamps

                    +

                    With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

                    +

                    When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

                    +
                    +

                    Upgrading to 2.0 from 1.x

                    +

                    Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

                    +
                    +
                    +
                    +

                    Using the v2 Native Protocol

                    +

                    By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster(protocol_version=2)
                    +
                    +
                    +

                    When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

                    +
                    from cassandra.cluster import Cluster
                    +
                    +cluster = Cluster(protocol_version=1)
                    +
                    +
                    +
                    +
                    +

                    Automatic Query Paging

                    +

                    Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

                    +

                    See Paging Large Queries for full details.

                    +
                    +
                    +

                    Protocol-Level Batch Statements

                    +

                    With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

                    +

                    See BatchStatement for details and usage examples.

                    +
                    +
                    +

                    SASL-based Authentication

                    +

                    Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

                    +
                    +
                    +

                    Lightweight Transactions

                    +

                    Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

                    +
                    +
                    +

                    Calling Cluster.shutdown()

                    +

                    In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

                    +
                    +
                    +

                    Deprecations

                    +

                    The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

                    + +
                    +
                    +

                    Dependency Changes

                    +

                    The following dependencies have officially been made optional:

                    +
                      +
                    • scales

                    • +
                    • blist

                    • +
                    +

                    And one new dependency has been added (to enable Python 3 support):

                    +
                      +
                    • six

                    • +
                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/master/user-defined-types.html b/master/user-defined-types.html new file mode 100644 index 0000000000..a0c33d1e9d --- /dev/null +++ b/master/user-defined-types.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for an unstable version of Scylla Python Driver. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    User Defined Types

                    +

                    Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

                    +
                    CREATE TYPE address (street text, zip int);
                    +
                    +
                    +

                    Version 2.1 of the Python driver adds support for user-defined types.

                    +
                    +

                    Registering a UDT

                    +

                    You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

                    +
                    +

                    Map a Class to a UDT

                    +
                    cluster = Cluster(protocol_version=3)
                    +session = cluster.connect()
                    +session.set_keyspace('mykeyspace')
                    +session.execute("CREATE TYPE address (street text, zipcode int)")
                    +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                    +
                    +# create a class to map to the "address" UDT
                    +class Address(object):
                    +
                    +    def __init__(self, street, zipcode):
                    +        self.street = street
                    +        self.zipcode = zipcode
                    +
                    +cluster.register_user_type('mykeyspace', 'address', Address)
                    +
                    +# insert a row using an instance of Address
                    +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
                    +                (0, Address("123 Main St.", 78723)))
                    +
                    +# results will include Address instances
                    +results = session.execute("SELECT * FROM users")
                    +row = results[0]
                    +print(row.id, row.location.street, row.location.zipcode)
                    +
                    +
                    +
                    +
                    +

                    Map a dict to a UDT

                    +
                    cluster = Cluster(protocol_version=3)
                    +session = cluster.connect()
                    +session.set_keyspace('mykeyspace')
                    +session.execute("CREATE TYPE address (street text, zipcode int)")
                    +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                    +
                    +cluster.register_user_type('mykeyspace', 'address', dict)
                    +
                    +# insert a row using a prepared statement and a tuple
                    +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
                    +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
                    +
                    +# results will include dict instances
                    +results = session.execute("SELECT * FROM users")
                    +row = results[0]
                    +print(row.id, row.location['street'], row.location['zipcode'])
                    +
                    +
                    +
                    +
                    +
                    +

                    Using UDTs Without Registering Them

                    +

                    Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

                    +

                    When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

                    +
                    cluster = Cluster(protocol_version=3)
                    +session = cluster.connect()
                    +session.set_keyspace('mykeyspace')
                    +session.execute("CREATE TYPE address (street text, zipcode int)")
                    +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                    +
                    +class Foo(object):
                    +
                    +    def __init__(self, street, zipcode, otherstuff):
                    +        self.street = street
                    +        self.zipcode = zipcode
                    +        self.otherstuff = otherstuff
                    +
                    +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
                    +
                    +# since we're using a prepared statement, we don't *have* to register
                    +# a class to map to the UDT to insert data.  The object just needs to have
                    +# "street" and "zipcode" attributes (which Foo does):
                    +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
                    +
                    +# when we query data, UDT columns that don't have a class registered
                    +# will be returned as namedtuples:
                    +results = session.execute("SELECT * FROM users")
                    +first_row = results[0]
                    +address = first_row.location
                    +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
                    +street = address.street
                    +zipcode = address.street
                    +
                    +
                    +

                    As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

                    +

                    * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

                    +
                    +
                    + + +
                    + + + + + + +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/stable/.buildinfo b/stable/.buildinfo new file mode 100644 index 0000000000..178c4e2e0d --- /dev/null +++ b/stable/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e84c6ce988dc6a43f9017029bd091a8a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/stable/.doctrees/CHANGELOG.doctree b/stable/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000..081385137d Binary files /dev/null and b/stable/.doctrees/CHANGELOG.doctree differ diff --git a/stable/.doctrees/api/cassandra.doctree b/stable/.doctrees/api/cassandra.doctree new file mode 100644 index 0000000000..43c716cca6 Binary files /dev/null and b/stable/.doctrees/api/cassandra.doctree differ diff --git a/stable/.doctrees/api/cassandra/auth.doctree b/stable/.doctrees/api/cassandra/auth.doctree new file mode 100644 index 0000000000..f7db6530c3 Binary files /dev/null and b/stable/.doctrees/api/cassandra/auth.doctree differ diff --git a/stable/.doctrees/api/cassandra/cluster.doctree b/stable/.doctrees/api/cassandra/cluster.doctree new file mode 100644 index 0000000000..c707c00519 Binary files /dev/null and b/stable/.doctrees/api/cassandra/cluster.doctree differ diff --git a/stable/.doctrees/api/cassandra/concurrent.doctree b/stable/.doctrees/api/cassandra/concurrent.doctree new file mode 100644 index 0000000000..6c5f9b5b05 Binary files /dev/null and b/stable/.doctrees/api/cassandra/concurrent.doctree differ diff --git a/stable/.doctrees/api/cassandra/connection.doctree b/stable/.doctrees/api/cassandra/connection.doctree new file mode 100644 index 0000000000..a6ae323493 Binary files /dev/null and b/stable/.doctrees/api/cassandra/connection.doctree differ diff --git a/stable/.doctrees/api/cassandra/cqlengine/columns.doctree b/stable/.doctrees/api/cassandra/cqlengine/columns.doctree new file mode 100644 index 0000000000..d64f68693e Binary files /dev/null and b/stable/.doctrees/api/cassandra/cqlengine/columns.doctree differ diff --git a/stable/.doctrees/api/cassandra/cqlengine/connection.doctree b/stable/.doctrees/api/cassandra/cqlengine/connection.doctree new file mode 100644 index 0000000000..b12aafe433 Binary files /dev/null and b/stable/.doctrees/api/cassandra/cqlengine/connection.doctree differ diff --git a/stable/.doctrees/api/cassandra/cqlengine/management.doctree b/stable/.doctrees/api/cassandra/cqlengine/management.doctree new file mode 100644 index 0000000000..854cbcc04a Binary files /dev/null and b/stable/.doctrees/api/cassandra/cqlengine/management.doctree differ diff --git a/stable/.doctrees/api/cassandra/cqlengine/models.doctree b/stable/.doctrees/api/cassandra/cqlengine/models.doctree new file mode 100644 index 0000000000..3314453e10 Binary files /dev/null and b/stable/.doctrees/api/cassandra/cqlengine/models.doctree differ diff --git a/stable/.doctrees/api/cassandra/cqlengine/query.doctree b/stable/.doctrees/api/cassandra/cqlengine/query.doctree new file mode 100644 index 0000000000..5bd9cb2dff Binary files /dev/null and b/stable/.doctrees/api/cassandra/cqlengine/query.doctree differ diff --git a/stable/.doctrees/api/cassandra/cqlengine/usertype.doctree b/stable/.doctrees/api/cassandra/cqlengine/usertype.doctree new file mode 100644 index 0000000000..4f9b7f82b0 Binary files /dev/null and b/stable/.doctrees/api/cassandra/cqlengine/usertype.doctree differ diff --git a/stable/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree b/stable/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree new file mode 100644 index 0000000000..c943ad53fe Binary files /dev/null and b/stable/.doctrees/api/cassandra/datastax/graph/fluent/index.doctree differ diff --git a/stable/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree b/stable/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree new file mode 100644 index 0000000000..7ae1238d5b Binary files /dev/null and b/stable/.doctrees/api/cassandra/datastax/graph/fluent/predicates.doctree differ diff --git a/stable/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree b/stable/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree new file mode 100644 index 0000000000..30acb1c98a Binary files /dev/null and b/stable/.doctrees/api/cassandra/datastax/graph/fluent/query.doctree differ diff --git a/stable/.doctrees/api/cassandra/datastax/graph/index.doctree b/stable/.doctrees/api/cassandra/datastax/graph/index.doctree new file mode 100644 index 0000000000..d3fe49c38b Binary files /dev/null and b/stable/.doctrees/api/cassandra/datastax/graph/index.doctree differ diff --git a/stable/.doctrees/api/cassandra/decoder.doctree b/stable/.doctrees/api/cassandra/decoder.doctree new file mode 100644 index 0000000000..bb6b1c2284 Binary files /dev/null and b/stable/.doctrees/api/cassandra/decoder.doctree differ diff --git a/stable/.doctrees/api/cassandra/encoder.doctree b/stable/.doctrees/api/cassandra/encoder.doctree new file mode 100644 index 0000000000..258d86e74a Binary files /dev/null and b/stable/.doctrees/api/cassandra/encoder.doctree differ diff --git a/stable/.doctrees/api/cassandra/graph.doctree b/stable/.doctrees/api/cassandra/graph.doctree new file mode 100644 index 0000000000..acf548ad29 Binary files /dev/null and b/stable/.doctrees/api/cassandra/graph.doctree differ diff --git a/stable/.doctrees/api/cassandra/io/asyncioreactor.doctree b/stable/.doctrees/api/cassandra/io/asyncioreactor.doctree new file mode 100644 index 0000000000..4b9515f5c6 Binary files /dev/null and b/stable/.doctrees/api/cassandra/io/asyncioreactor.doctree differ diff --git a/stable/.doctrees/api/cassandra/io/asyncorereactor.doctree b/stable/.doctrees/api/cassandra/io/asyncorereactor.doctree new file mode 100644 index 0000000000..b03963cbe4 Binary files /dev/null and b/stable/.doctrees/api/cassandra/io/asyncorereactor.doctree differ diff --git a/stable/.doctrees/api/cassandra/io/eventletreactor.doctree b/stable/.doctrees/api/cassandra/io/eventletreactor.doctree new file mode 100644 index 0000000000..1e12118b78 Binary files /dev/null and b/stable/.doctrees/api/cassandra/io/eventletreactor.doctree differ diff --git a/stable/.doctrees/api/cassandra/io/geventreactor.doctree b/stable/.doctrees/api/cassandra/io/geventreactor.doctree new file mode 100644 index 0000000000..34e337e08f Binary files /dev/null and b/stable/.doctrees/api/cassandra/io/geventreactor.doctree differ diff --git a/stable/.doctrees/api/cassandra/io/libevreactor.doctree b/stable/.doctrees/api/cassandra/io/libevreactor.doctree new file mode 100644 index 0000000000..9ad82668da Binary files /dev/null and b/stable/.doctrees/api/cassandra/io/libevreactor.doctree differ diff --git a/stable/.doctrees/api/cassandra/io/twistedreactor.doctree b/stable/.doctrees/api/cassandra/io/twistedreactor.doctree new file mode 100644 index 0000000000..96b479a3ec Binary files /dev/null and b/stable/.doctrees/api/cassandra/io/twistedreactor.doctree differ diff --git a/stable/.doctrees/api/cassandra/metadata.doctree b/stable/.doctrees/api/cassandra/metadata.doctree new file mode 100644 index 0000000000..556e64697c Binary files /dev/null and b/stable/.doctrees/api/cassandra/metadata.doctree differ diff --git a/stable/.doctrees/api/cassandra/metrics.doctree b/stable/.doctrees/api/cassandra/metrics.doctree new file mode 100644 index 0000000000..5b4c5823b6 Binary files /dev/null and b/stable/.doctrees/api/cassandra/metrics.doctree differ diff --git a/stable/.doctrees/api/cassandra/policies.doctree b/stable/.doctrees/api/cassandra/policies.doctree new file mode 100644 index 0000000000..8f23734a15 Binary files /dev/null and b/stable/.doctrees/api/cassandra/policies.doctree differ diff --git a/stable/.doctrees/api/cassandra/pool.doctree b/stable/.doctrees/api/cassandra/pool.doctree new file mode 100644 index 0000000000..22be5f624f Binary files /dev/null and b/stable/.doctrees/api/cassandra/pool.doctree differ diff --git a/stable/.doctrees/api/cassandra/protocol.doctree b/stable/.doctrees/api/cassandra/protocol.doctree new file mode 100644 index 0000000000..d8549f2978 Binary files /dev/null and b/stable/.doctrees/api/cassandra/protocol.doctree differ diff --git a/stable/.doctrees/api/cassandra/query.doctree b/stable/.doctrees/api/cassandra/query.doctree new file mode 100644 index 0000000000..b7521f668e Binary files /dev/null and b/stable/.doctrees/api/cassandra/query.doctree differ diff --git a/stable/.doctrees/api/cassandra/timestamps.doctree b/stable/.doctrees/api/cassandra/timestamps.doctree new file mode 100644 index 0000000000..f17db6b0cb Binary files /dev/null and b/stable/.doctrees/api/cassandra/timestamps.doctree differ diff --git a/stable/.doctrees/api/cassandra/util.doctree b/stable/.doctrees/api/cassandra/util.doctree new file mode 100644 index 0000000000..1f0e5f38cb Binary files /dev/null and b/stable/.doctrees/api/cassandra/util.doctree differ diff --git a/stable/.doctrees/api/index.doctree b/stable/.doctrees/api/index.doctree new file mode 100644 index 0000000000..7b6c45c18e Binary files /dev/null and b/stable/.doctrees/api/index.doctree differ diff --git a/stable/.doctrees/cqlengine/batches.doctree b/stable/.doctrees/cqlengine/batches.doctree new file mode 100644 index 0000000000..95aea5a556 Binary files /dev/null and b/stable/.doctrees/cqlengine/batches.doctree differ diff --git a/stable/.doctrees/cqlengine/connections.doctree b/stable/.doctrees/cqlengine/connections.doctree new file mode 100644 index 0000000000..83fd530ec0 Binary files /dev/null and b/stable/.doctrees/cqlengine/connections.doctree differ diff --git a/stable/.doctrees/cqlengine/faq.doctree b/stable/.doctrees/cqlengine/faq.doctree new file mode 100644 index 0000000000..1f6dabda29 Binary files /dev/null and b/stable/.doctrees/cqlengine/faq.doctree differ diff --git a/stable/.doctrees/cqlengine/models.doctree b/stable/.doctrees/cqlengine/models.doctree new file mode 100644 index 0000000000..f075bcbc25 Binary files /dev/null and b/stable/.doctrees/cqlengine/models.doctree differ diff --git a/stable/.doctrees/cqlengine/queryset.doctree b/stable/.doctrees/cqlengine/queryset.doctree new file mode 100644 index 0000000000..47ddd293fe Binary files /dev/null and b/stable/.doctrees/cqlengine/queryset.doctree differ diff --git a/stable/.doctrees/cqlengine/third-party.doctree b/stable/.doctrees/cqlengine/third-party.doctree new file mode 100644 index 0000000000..66b89604c8 Binary files /dev/null and b/stable/.doctrees/cqlengine/third-party.doctree differ diff --git a/stable/.doctrees/cqlengine/upgrade-guide.doctree b/stable/.doctrees/cqlengine/upgrade-guide.doctree new file mode 100644 index 0000000000..85ee707d1e Binary files /dev/null and b/stable/.doctrees/cqlengine/upgrade-guide.doctree differ diff --git a/stable/.doctrees/dates-and-times.doctree b/stable/.doctrees/dates-and-times.doctree new file mode 100644 index 0000000000..4eb6f8902a Binary files /dev/null and b/stable/.doctrees/dates-and-times.doctree differ diff --git a/stable/.doctrees/environment.pickle b/stable/.doctrees/environment.pickle new file mode 100644 index 0000000000..0f00bec039 Binary files /dev/null and b/stable/.doctrees/environment.pickle differ diff --git a/stable/.doctrees/execution-profiles.doctree b/stable/.doctrees/execution-profiles.doctree new file mode 100644 index 0000000000..b816f4e861 Binary files /dev/null and b/stable/.doctrees/execution-profiles.doctree differ diff --git a/stable/.doctrees/faq.doctree b/stable/.doctrees/faq.doctree new file mode 100644 index 0000000000..99fda588af Binary files /dev/null and b/stable/.doctrees/faq.doctree differ diff --git a/stable/.doctrees/getting-started.doctree b/stable/.doctrees/getting-started.doctree new file mode 100644 index 0000000000..c7d4af0b78 Binary files /dev/null and b/stable/.doctrees/getting-started.doctree differ diff --git a/stable/.doctrees/index.doctree b/stable/.doctrees/index.doctree new file mode 100644 index 0000000000..9c8fb60865 Binary files /dev/null and b/stable/.doctrees/index.doctree differ diff --git a/stable/.doctrees/installation.doctree b/stable/.doctrees/installation.doctree new file mode 100644 index 0000000000..e09e52ce52 Binary files /dev/null and b/stable/.doctrees/installation.doctree differ diff --git a/stable/.doctrees/lwt.doctree b/stable/.doctrees/lwt.doctree new file mode 100644 index 0000000000..eb78074c76 Binary files /dev/null and b/stable/.doctrees/lwt.doctree differ diff --git a/stable/.doctrees/object-mapper.doctree b/stable/.doctrees/object-mapper.doctree new file mode 100644 index 0000000000..049f668da2 Binary files /dev/null and b/stable/.doctrees/object-mapper.doctree differ diff --git a/stable/.doctrees/performance.doctree b/stable/.doctrees/performance.doctree new file mode 100644 index 0000000000..235281b309 Binary files /dev/null and b/stable/.doctrees/performance.doctree differ diff --git a/stable/.doctrees/query-paging.doctree b/stable/.doctrees/query-paging.doctree new file mode 100644 index 0000000000..32f01a3303 Binary files /dev/null and b/stable/.doctrees/query-paging.doctree differ diff --git a/stable/.doctrees/scylla-cloud-serverless.doctree b/stable/.doctrees/scylla-cloud-serverless.doctree new file mode 100644 index 0000000000..b7a96719a0 Binary files /dev/null and b/stable/.doctrees/scylla-cloud-serverless.doctree differ diff --git a/stable/.doctrees/scylla-cloud.doctree b/stable/.doctrees/scylla-cloud.doctree new file mode 100644 index 0000000000..8d1558ee62 Binary files /dev/null and b/stable/.doctrees/scylla-cloud.doctree differ diff --git a/stable/.doctrees/scylla-specific.doctree b/stable/.doctrees/scylla-specific.doctree new file mode 100644 index 0000000000..a7c6e328be Binary files /dev/null and b/stable/.doctrees/scylla-specific.doctree differ diff --git a/stable/.doctrees/security.doctree b/stable/.doctrees/security.doctree new file mode 100644 index 0000000000..b1be06a844 Binary files /dev/null and b/stable/.doctrees/security.doctree differ diff --git a/stable/.doctrees/upgrading.doctree b/stable/.doctrees/upgrading.doctree new file mode 100644 index 0000000000..76881f2a8f Binary files /dev/null and b/stable/.doctrees/upgrading.doctree differ diff --git a/stable/.doctrees/user-defined-types.doctree b/stable/.doctrees/user-defined-types.doctree new file mode 100644 index 0000000000..0b781ba039 Binary files /dev/null and b/stable/.doctrees/user-defined-types.doctree differ diff --git a/stable/.nojekyll b/stable/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/stable/404.html b/stable/404.html new file mode 100644 index 0000000000..6cf0e7dc90 --- /dev/null +++ b/stable/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                    +

                    404

                    +

                    The ScyllaDB monster ate your page!

                    +

                    + Home +

                    +
                    + + + \ No newline at end of file diff --git a/stable/CHANGELOG.html b/stable/CHANGELOG.html new file mode 100644 index 0000000000..2738945603 --- /dev/null +++ b/stable/CHANGELOG.html @@ -0,0 +1,2942 @@ + + + + + + + + + + + + + CHANGELOG | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + + + +
                    + +
                    + +
                    +

                    CHANGELOG

                    +
                    +

                    3.26.0

                    +

                    March 13, 2023

                    +
                    +

                    Features

                    +
                      +
                    • Add support for execution profiles in execute_concurrent (PR 1122)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Handle empty non-final result pages (PR 1110)

                    • +
                    • Do not re-use stream IDs for in-flight requests (PR 1114)

                    • +
                    • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

                    • +
                    +
                    +
                    +

                    Others

                    +
                      +
                    • Fix deprecation warning in query tracing (PR 1103)

                    • +
                    • Remove mutable default values from some tests (PR 1116)

                    • +
                    • Remove dependency on unittest2 (PYTHON-1289)

                    • +
                    • Fix deprecation warnings for asyncio.coroutine annotation in asyncioreactor (PYTTHON-1290)

                    • +
                    • Fix typos in source files (PR 1126)

                    • +
                    • HostFilterPolicyInitTest fix for Python 3.11 (PR 1131)

                    • +
                    • Fix for DontPrepareOnIgnoredHostsTest (PYTHON-1287)

                    • +
                    • tests.integration.simulacron.test_connection failures (PYTHON-1304)

                    • +
                    • tests.integration.standard.test_single_interface.py appears to be failing for C* 4.0 (PYTHON-1329)

                    • +
                    • Authentication tests appear to be failing fraudulently (PYTHON-1328)

                    • +
                    • PreparedStatementTests.test_fail_if_different_query_id_on_reprepare() failing unexpectedly (PTYHON-1327)

                    • +
                    • Refactor deprecated unittest aliases for Python 3.11 compatibility (PR 1112)

                    • +
                    +
                    +
                    +

                    Deprecations

                    +
                      +
                    • This release removes support for Python 2.7.x as well as Python 3.5.x and 3.6.x

                    • +
                    +
                    +
                    +
                    +

                    3.25.0

                    +

                    March 18, 2021

                    +
                    +

                    Features

                    +
                      +
                    • Ensure the driver can connect when invalid peer hosts are in system.peers (PYTHON-1260)

                    • +
                    • Implement protocol v5 checksumming (PYTHON-1258)

                    • +
                    • Fix the default cqlengine connection mechanism to work with Astra (PYTHON-1265)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Asyncore race condition cause logging exception on shutdown (PYTHON-1266)

                    • +
                    • Update list of reserved keywords (PYTHON-1269)

                    • +
                    +
                    +
                    +

                    Others

                    +
                      +
                    • Drop Python 3.4 support (PYTHON-1220)

                    • +
                    • Update security documentation and examples to use PROTOCOL_TLS (PYTHON-1264)

                    • +
                    +
                    +
                    +
                    +

                    3.24.0

                    +

                    June 18, 2020

                    +
                    +

                    Features

                    +
                      +
                    • Make geomet an optional dependency at runtime (PYTHON-1237)

                    • +
                    • Add use_default_tempdir cloud config options (PYTHON-1245)

                    • +
                    • Tcp flow control for libevreactor (PYTHON-1248)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Unable to connect to a cloud cluster using Ubuntu 20.04 (PYTHON-1238)

                    • +
                    • PlainTextAuthProvider fails with unicode chars and Python3 (PYTHON-1241)

                    • +
                    • [GRAPH] Graph execution profiles consistency level are not set to LOCAL_QUORUM with a cloud cluster (PYTHON-1240)

                    • +
                    • [GRAPH] Can’t write data in a Boolean field using the Fluent API (PYTHON-1239)

                    • +
                    • [GRAPH] Fix elementMap() result deserialization (PYTHON-1233)

                    • +
                    +
                    +
                    +

                    Others

                    +
                      +
                    • Bump geomet dependency version to 0.2 (PYTHON-1243)

                    • +
                    • Bump gremlinpython dependency version to 3.4.6 (PYTHON-1212)

                    • +
                    • Improve fluent graph documentation for core graphs (PYTHON-1244)

                    • +
                    +
                    +
                    +
                    +

                    3.23.0

                    +

                    April 6, 2020

                    +
                    +

                    Features

                    +
                      +
                    • Transient Replication Support (PYTHON-1207)

                    • +
                    • Support system.peers_v2 and port discovery for C* 4.0 (PYTHON-700)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Asyncore logging exception on shutdown (PYTHON-1228)

                    • +
                    +
                    +
                    +
                    +

                    3.22.0

                    +

                    February 26, 2020

                    +
                    +

                    Features

                    +
                      +
                    • Add all() function to the ResultSet API (PYTHON-1203)

                    • +
                    • Parse new schema metadata in NGDG and generate table edges CQL syntax (PYTHON-996)

                    • +
                    • Add GraphSON3 support (PYTHON-788)

                    • +
                    • Use GraphSON3 as default for Native graphs (PYTHON-1004)

                    • +
                    • Add Tuple and UDT types for native graph (PYTHON-1005)

                    • +
                    • Add Duration type for native graph (PYTHON-1000)

                    • +
                    • Add gx:ByteBuffer graphson type support for Blob field (PYTHON-1027)

                    • +
                    • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

                    • +
                    • Provide numerical wrappers to ensure proper graphson schema definition (PYTHON-1051)

                    • +
                    • Resolve the row_factory automatically for native graphs (PYTHON-1056)

                    • +
                    • Add g:TraversalMetrics/g:Metrics graph deserializers (PYTHON-1057)

                    • +
                    • Add g:BulkSet graph deserializers (PYTHON-1060)

                    • +
                    • Update Graph Engine names and the way to create a Classic/Native Graph (PYTHON-1090)

                    • +
                    • Update Native to Core Graph Engine

                    • +
                    • Add graphson3 and native graph support (PYTHON-1039)

                    • +
                    • Enable Paging Through DSE Driver for Gremlin Traversals (PYTHON-1045)

                    • +
                    • Expose filter predicates for cql collections (PYTHON-1019)

                    • +
                    • Add g:TraversalMetrics/Metrics deserializers (PYTHON-1057)

                    • +
                    • Make graph metadata handling more robust (PYTHON-1204)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Make sure to only query the native_transport_address column with DSE (PYTHON-1205)

                    • +
                    +
                    +
                    +
                    +

                    3.21.0

                    +

                    January 15, 2020

                    +
                    +

                    Features

                    +
                      +
                    • Unified driver: merge core and DSE drivers into a single package (PYTHON-1130)

                    • +
                    • Add Python 3.8 support (PYTHON-1189)

                    • +
                    • Allow passing ssl context for Twisted (PYTHON-1161)

                    • +
                    • Ssl context and cloud support for Eventlet (PYTHON-1162)

                    • +
                    • Cloud Twisted support (PYTHON-1163)

                    • +
                    • Add additional_write_policy and read_repair to system schema parsing (PYTHON-1048)

                    • +
                    • Flexible version parsing (PYTHON-1174)

                    • +
                    • Support NULL in collection deserializer (PYTHON-1123)

                    • +
                    • [GRAPH] Ability to execute Fluent Graph queries asynchronously (PYTHON-1129)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Handle prepared id mismatch when repreparing on the fly (PYTHON-1124)

                    • +
                    • re-raising the CQLEngineException will fail on Python 3 (PYTHON-1166)

                    • +
                    • asyncio message chunks can be processed discontinuously (PYTHON-1185)

                    • +
                    • Reconnect attempts persist after downed node removed from peers (PYTHON-1181)

                    • +
                    • Connection fails to validate ssl certificate hostname when SSLContext.check_hostname is set (PYTHON-1186)

                    • +
                    • ResponseFuture._set_result crashes on connection error when used with PrepareMessage (PYTHON-1187)

                    • +
                    • Insights fail to serialize the startup message when the SSL Context is from PyOpenSSL (PYTHON-1192)

                    • +
                    +
                    +
                    +

                    Others

                    +
                      +
                    • The driver has a new dependency: geomet. It comes from the dse-driver unification and +is used to support DSE geo types.

                    • +
                    • Remove *read_repair_chance table options (PYTHON-1140)

                    • +
                    • Avoid warnings about unspecified load balancing policy when connecting to a cloud cluster (PYTHON-1177)

                    • +
                    • Add new DSE CQL keywords (PYTHON-1122)

                    • +
                    • Publish binary wheel distributions (PYTHON-1013)

                    • +
                    +
                    +
                    +

                    Deprecations

                    +
                      +
                    • DSELoadBalancingPolicy will be removed in the next major, consider using +the DefaultLoadBalancingPolicy.

                    • +
                    +

                    Merged from dse-driver:

                    +
                    +
                    +

                    Features

                    +
                      +
                    • Insights integration (PYTHON-1047)

                    • +
                    • Graph execution profiles should preserve their graph_source when graph_options is overridden (PYTHON-1021)

                    • +
                    • Add NodeSync metadata (PYTHON-799)

                    • +
                    • Add new NodeSync failure values (PYTHON-934)

                    • +
                    • DETERMINISTIC and MONOTONIC Clauses for Functions and Aggregates (PYTHON-955)

                    • +
                    • GraphOptions should show a warning for unknown parameters (PYTHON-819)

                    • +
                    • DSE protocol version 2 and continous paging backpressure (PYTHON-798)

                    • +
                    • GraphSON2 Serialization/Deserialization Support (PYTHON-775)

                    • +
                    • Add graph-results payload option for GraphSON format (PYTHON-773)

                    • +
                    • Create an AuthProvider for the DSE transitional mode (PYTHON-831)

                    • +
                    • Implement serializers for the Graph String API (PYTHON-778)

                    • +
                    • Provide deserializers for GraphSON types (PYTHON-782)

                    • +
                    • Add Graph DurationType support (PYTHON-607)

                    • +
                    • Support DSE DateRange type (PYTHON-668)

                    • +
                    • RLAC CQL output for materialized views (PYTHON-682)

                    • +
                    • Add Geom Types wkt deserializer

                    • +
                    • DSE Graph Client timeouts in custom payload (PYTHON-589)

                    • +
                    • Make DSEGSSAPIAuthProvider accept principal name (PYTHON-574)

                    • +
                    • Add config profiles to DSE graph execution (PYTHON-570)

                    • +
                    • DSE Driver version checking (PYTHON-568)

                    • +
                    • Distinct default timeout for graph queries (PYTHON-477)

                    • +
                    • Graph result parsing for known types (PYTHON-479,487)

                    • +
                    • Distinct read/write CL for graph execution (PYTHON-509)

                    • +
                    • Target graph analytics query to spark master when available (PYTHON-510)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Continuous paging sessions raise RuntimeError when results are not entirely consumed (PYTHON-1054)

                    • +
                    • GraphSON Property deserializer should return a dict instead of a set (PYTHON-1033)

                    • +
                    • ResponseFuture.has_more_pages may hold the wrong value (PYTHON-946)

                    • +
                    • DETERMINISTIC clause in AGGREGATE misplaced in CQL generation (PYTHON-963)

                    • +
                    • graph module import cause a DLL issue on Windows due to its cythonizing failure (PYTHON-900)

                    • +
                    • Update date serialization to isoformat in graph (PYTHON-805)

                    • +
                    • DateRange Parse Error (PYTHON-729)

                    • +
                    • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

                    • +
                    • metadata.get_host returning None unexpectedly (PYTHON-709)

                    • +
                    • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

                    • +
                    • Resolve FQDN from ip address and use that as host passed to SASLClient (PYTHON-566)

                    • +
                    • Geospatial type implementations don’t handle ‘EMPTY’ values. (PYTHON-481)

                    • +
                    • Correctly handle other types in geo type equality (PYTHON-508)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Add tests around cqlengine and continuous paging (PYTHON-872)

                    • +
                    • Add an abstract GraphStatement to handle different graph statements (PYTHON-789)

                    • +
                    • Write documentation examples for DSE 2.0 features (PYTHON-732)

                    • +
                    • DSE_V1 protocol should not include all of protocol v5 (PYTHON-694)

                    • +
                    +
                    +
                    +
                    +

                    3.20.2

                    +

                    November 19, 2019

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix import error for old python installation without SSLContext (PYTHON-1183)

                    • +
                    +
                    +
                    +
                    +

                    3.20.1

                    +

                    November 6, 2019

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • ValueError: too many values to unpack (expected 2)” when there are two dashes in server version number (PYTHON-1172)

                    • +
                    +
                    +
                    +
                    +

                    3.20.0

                    +

                    October 28, 2019

                    +
                    +

                    Features

                    +
                      +
                    • DataStax Astra Support (PYTHON-1074)

                    • +
                    • Use 4.0 schema parser in 4 alpha and snapshot builds (PYTHON-1158)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Connection setup methods prevent using ExecutionProfile in cqlengine (PYTHON-1009)

                    • +
                    • Driver deadlock if all connections dropped by heartbeat whilst request in flight and request times out (PYTHON-1044)

                    • +
                    • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

                    • +
                    +
                    +
                    +
                    +

                    3.19.0

                    +

                    August 26, 2019

                    +
                    +

                    Features

                    +
                      +
                    • Add Python 3.7 support (PYTHON-1016)

                    • +
                    • Future-proof Mapping imports (PYTHON-1023)

                    • +
                    • Include param values in cqlengine logging (PYTHON-1105)

                    • +
                    • NTS Token Replica Map Generation is slow (PYTHON-622)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • as_cql_query UDF/UDA parameters incorrectly includes “frozen” if arguments are collections (PYTHON-1031)

                    • +
                    • cqlengine does not currently support combining TTL and TIMESTAMP on INSERT (PYTHON-1093)

                    • +
                    • Fix incorrect metadata for compact counter tables (PYTHON-1100)

                    • +
                    • Call ConnectionException with correct kwargs (PYTHON-1117)

                    • +
                    • Can’t connect to clusters built from source because version parsing doesn’t handle ‘x.y-SNAPSHOT’ (PYTHON-1118)

                    • +
                    • Discovered node doesn´t honor the configured Cluster port on connection (PYTHON-1127)

                    • +
                    • Exception when use pk__token__gt filter In python 3.7 (PYTHON-1121)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Remove invalid warning in set_session when we initialize a default connection (PYTHON-1104)

                    • +
                    • Set the proper default ExecutionProfile.row_factory value (PYTHON-1119)

                    • +
                    +
                    +
                    +
                    +

                    3.18.0

                    +

                    May 27, 2019

                    +
                    +

                    Features

                    +
                      +
                    • Abstract Host Connection information (PYTHON-1079)

                    • +
                    • Improve version parsing to support a non-integer 4th component (PYTHON-1091)

                    • +
                    • Expose on_request_error method in the RetryPolicy (PYTHON-1064)

                    • +
                    • Add jitter to ExponentialReconnectionPolicy (PYTHON-1065)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix error when preparing queries with beta protocol v5 (PYTHON-1081)

                    • +
                    • Accept legacy empty strings as column names (PYTHON-1082)

                    • +
                    • Let util.SortedSet handle uncomparable elements (PYTHON-1087)

                    • +
                    +
                    +
                    +
                    +

                    3.17.1

                    +

                    May 2, 2019

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Socket errors EAGAIN/EWOULDBLOCK are not handled properly and cause timeouts (PYTHON-1089)

                    • +
                    +
                    +
                    +
                    +

                    3.17.0

                    +

                    February 19, 2019

                    +
                    +

                    Features

                    +
                      +
                    • Send driver name and version in startup message (PYTHON-1068)

                    • +
                    • Add Cluster ssl_context option to enable SSL (PYTHON-995)

                    • +
                    • Allow encrypted private keys for 2-way SSL cluster connections (PYTHON-995)

                    • +
                    • Introduce new method ConsistencyLevel.is_serial (PYTHON-1067)

                    • +
                    • Add Session.get_execution_profile (PYTHON-932)

                    • +
                    • Add host kwarg to Session.execute/execute_async APIs to send a query to a specific node (PYTHON-993)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • NoHostAvailable when all hosts are up and connectable (PYTHON-891)

                    • +
                    • Serial consistency level is not used (PYTHON-1007)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Fail faster on incorrect lz4 import (PYTHON-1042)

                    • +
                    • Bump Cython dependency version to 0.29 (PYTHON-1036)

                    • +
                    • Expand Driver SSL Documentation (PYTHON-740)

                    • +
                    +
                    +
                    +

                    Deprecations

                    +
                      +
                    • Using Cluster.ssl_options to enable SSL is deprecated and will be removed in +the next major release, use ssl_context.

                    • +
                    • DowngradingConsistencyRetryPolicy is deprecated and will be +removed in the next major release. (PYTHON-937)

                    • +
                    +
                    +
                    +
                    +

                    3.16.0

                    +

                    November 12, 2018

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Improve and fix socket error-catching code in nonblocking-socket reactors (PYTHON-1024)

                    • +
                    • Non-ASCII characters in schema break CQL string generation (PYTHON-1008)

                    • +
                    • Fix OSS driver’s virtual table support against DSE 6.0.X and future server releases (PYTHON-1020)

                    • +
                    • ResultSet.one() fails if the row_factory is using a generator (PYTHON-1026)

                    • +
                    • Log profile name on attempt to create existing profile (PYTHON-944)

                    • +
                    • Cluster instantiation fails if any contact points’ hostname resolution fails (PYTHON-895)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Fix tests when RF is not maintained if we decomission a node (PYTHON-1017)

                    • +
                    • Fix wrong use of ResultSet indexing (PYTHON-1015)

                    • +
                    +
                    +
                    +
                    +

                    3.15.1

                    +

                    September 6, 2018

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • C* 4.0 schema-parsing logic breaks running against DSE 6.0.X (PYTHON-1018)

                    • +
                    +
                    +
                    +
                    +

                    3.15.0

                    +

                    August 30, 2018

                    +
                    +

                    Features

                    +
                      +
                    • Parse Virtual Keyspace Metadata (PYTHON-992)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Tokenmap.get_replicas returns the wrong value if token coincides with the end of the range (PYTHON-978)

                    • +
                    • Python Driver fails with “more than 255 arguments” python exception when > 255 columns specified in query response (PYTHON-893)

                    • +
                    • Hang in integration.standard.test_cluster.ClusterTests.test_set_keyspace_twice (PYTHON-998)

                    • +
                    • Asyncore reactors should use a global variable instead of a class variable for the event loop (PYTHON-697)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Use global variable for libev loops so it can be subclassed (PYTHON-973)

                    • +
                    • Update SchemaParser for V4 (PYTHON-1006)

                    • +
                    • Bump Cython dependency version to 0.28 (PYTHON-1012)

                    • +
                    +
                    +
                    +
                    +

                    3.14.0

                    +

                    April 17, 2018

                    +
                    +

                    Features

                    +
                      +
                    • Add one() function to the ResultSet API (PYTHON-947)

                    • +
                    • Create an utility function to fetch concurrently many keys from the same replica (PYTHON-647)

                    • +
                    • Allow filter queries with fields that have an index managed outside of cqlengine (PYTHON-966)

                    • +
                    • Twisted SSL Support (PYTHON-343)

                    • +
                    • Support IS NOT NULL operator in cqlengine (PYTHON-968)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Fix Broken Links in Docs (PYTHON-916)

                    • +
                    • Reevaluate MONKEY_PATCH_LOOP in test codebase (PYTHON-903)

                    • +
                    • Remove CASS_SERVER_VERSION and replace it for CASSANDRA_VERSION in tests (PYTHON-910)

                    • +
                    • Refactor CASSANDRA_VERSION to a some kind of version object (PYTHON-915)

                    • +
                    • Log warning when driver configures an authenticator, but server does not request authentication (PYTHON-940)

                    • +
                    • Warn users when using the deprecated Session.default_consistency_level (PYTHON-953)

                    • +
                    • Add DSE smoke test to OSS driver tests (PYTHON-894)

                    • +
                    • Document long compilation times and workarounds (PYTHON-868)

                    • +
                    • Improve error for batch WriteTimeouts (PYTHON-941)

                    • +
                    • Deprecate ResultSet indexing (PYTHON-945)

                    • +
                    +
                    +
                    +
                    +

                    3.13.0

                    +

                    January 30, 2018

                    +
                    +

                    Features

                    +
                      +
                    • cqlengine: LIKE filter operator (PYTHON-512)

                    • +
                    • Support cassandra.query.BatchType with cqlengine BatchQuery (PYTHON-888)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • AttributeError: ‘NoneType’ object has no attribute ‘add_timer’ (PYTHON-862)

                    • +
                    • Support retry_policy in PreparedStatement (PYTHON-861)

                    • +
                    • __del__ method in Session is throwing an exception (PYTHON-813)

                    • +
                    • LZ4 import issue with recent versions (PYTHON-897)

                    • +
                    • ResponseFuture._connection can be None when returning request_id (PYTHON-853)

                    • +
                    • ResultSet.was_applied doesn’t support batch with LWT statements (PYTHON-848)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • cqlengine: avoid warning when unregistering connection on shutdown (PYTHON-865)

                    • +
                    • Fix DeprecationWarning of log.warn (PYTHON-846)

                    • +
                    • Fix example_mapper.py for python3 (PYTHON-860)

                    • +
                    • Possible deadlock on cassandra.concurrent.execute_concurrent (PYTHON-768)

                    • +
                    • Add some known deprecated warnings for 4.x (PYTHON-877)

                    • +
                    • Remove copyright dates from copyright notices (PYTHON-863)

                    • +
                    • Remove “Experimental” tag from execution profiles documentation (PYTHON-840)

                    • +
                    • request_timer metrics descriptions are slightly incorrect (PYTHON-885)

                    • +
                    • Remove “Experimental” tag from cqlengine connections documentation (PYTHON-892)

                    • +
                    • Set in documentation default consistency for operations is LOCAL_ONE (PYTHON-901)

                    • +
                    +
                    +
                    +
                    +

                    3.12.0

                    +

                    November 6, 2017

                    +
                    +

                    Features

                    +
                      +
                    • Send keyspace in QUERY, PREPARE, and BATCH messages (PYTHON-678)

                    • +
                    • Add IPv4Address/IPv6Address support for inet types (PYTHON-751)

                    • +
                    • WriteType.CDC and VIEW missing (PYTHON-794)

                    • +
                    • Warn on Cluster init if contact points are specified but LBP isn’t (legacy mode) (PYTHON-812)

                    • +
                    • Warn on Cluster init if contact points are specified but LBP isn’t (exection profile mode) (PYTHON-838)

                    • +
                    • Include hash of result set metadata in prepared stmt id (PYTHON-808)

                    • +
                    • Add NO_COMPACT startup option (PYTHON-839)

                    • +
                    • Add new exception type for CDC (PYTHON-837)

                    • +
                    • Allow 0ms in ConstantSpeculativeExecutionPolicy (PYTHON-836)

                    • +
                    • Add asyncio reactor (PYTHON-507)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Both _set_final_exception/result called for the same ResponseFuture (PYTHON-630)

                    • +
                    • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

                    • +
                    • Not create two sessions by default in CQLEngine (PYTHON-814)

                    • +
                    • Bug when subclassing AyncoreConnection (PYTHON-827)

                    • +
                    • Error at cleanup when closing the asyncore connections (PYTHON-829)

                    • +
                    • Fix sites where sessions can change during iteration (PYTHON-793)

                    • +
                    • cqlengine: allow min_length=0 for Ascii and Text column types (PYTHON-735)

                    • +
                    • Rare exception when “sys.exit(0)” after query timeouts (PYTHON-752)

                    • +
                    • Dont set the session keyspace when preparing statements (PYTHON-843)

                    • +
                    • Use of DCAwareRoundRobinPolicy raises NoHostAvailable exception (PYTHON-781)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Remove DeprecationWarning when using WhiteListRoundRobinPolicy (PYTHON-810)

                    • +
                    • Bump Cython dependency version to 0.27 (PYTHON-833)

                    • +
                    +
                    +
                    +
                    +

                    3.11.0

                    +

                    July 24, 2017

                    +
                    +

                    Features

                    +
                      +
                    • Add idle_heartbeat_timeout cluster option to tune how long to wait for heartbeat responses. (PYTHON-762)

                    • +
                    • Add HostFilterPolicy (PYTHON-761)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • is_idempotent flag is not propagated from PreparedStatement to BoundStatement (PYTHON-736)

                    • +
                    • Fix asyncore hang on exit (PYTHON-767)

                    • +
                    • Driver takes several minutes to remove a bad host from session (PYTHON-762)

                    • +
                    • Installation doesn’t always fall back to no cython in Windows (PYTHON-763)

                    • +
                    • Avoid to replace a connection that is supposed to shutdown (PYTHON-772)

                    • +
                    • request_ids may not be returned to the pool (PYTHON-739)

                    • +
                    • Fix murmur3 on big-endian systems (PYTHON-653)

                    • +
                    • Ensure unused connections are closed if a Session is deleted by the GC (PYTHON-774)

                    • +
                    • Fix .values_list by using db names internally (cqlengine) (PYTHON-785)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Bump Cython dependency version to 0.25.2 (PYTHON-754)

                    • +
                    • Fix DeprecationWarning when using lz4 (PYTHON-769)

                    • +
                    • Deprecate WhiteListRoundRobinPolicy (PYTHON-759)

                    • +
                    • Improve upgrade guide for materializing pages (PYTHON-464)

                    • +
                    • Documentation for time/date specifies timestamp inupt as microseconds (PYTHON-717)

                    • +
                    • Point to DSA Slack, not IRC, in docs index

                    • +
                    +
                    +
                    +
                    +

                    3.10.0

                    +

                    May 24, 2017

                    +
                    +

                    Features

                    +
                      +
                    • Add Duration type to cqlengine (PYTHON-750)

                    • +
                    • Community PR review: Raise error on primary key update only if its value changed (PYTHON-705)

                    • +
                    • get_query_trace() contract is ambiguous (PYTHON-196)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Queries using speculative execution policy timeout prematurely (PYTHON-755)

                    • +
                    • Fix map where results are not consumed (PYTHON-749)

                    • +
                    • Driver fails to encode Duration’s with large values (PYTHON-747)

                    • +
                    • UDT values are not updated correctly in CQLEngine (PYTHON-743)

                    • +
                    • UDT types are not validated in CQLEngine (PYTHON-742)

                    • +
                    • to_python is not implemented for types columns.Type and columns.Date in CQLEngine (PYTHON-741)

                    • +
                    • Clients spin infinitely trying to connect to a host that is drained (PYTHON-734)

                    • +
                    • Resulset.get_query_trace returns empty trace sometimes (PYTHON-730)

                    • +
                    • Memory grows and doesn’t get removed (PYTHON-720)

                    • +
                    • Fix RuntimeError caused by change dict size during iteration (PYTHON-708)

                    • +
                    • fix ExponentialReconnectionPolicy may throw OverflowError problem (PYTHON-707)

                    • +
                    • Avoid using nonexistent prepared statement in ResponseFuture (PYTHON-706)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Update README (PYTHON-746)

                    • +
                    • Test python versions 3.5 and 3.6 (PYTHON-737)

                    • +
                    • Docs Warning About Prepare select * (PYTHON-626)

                    • +
                    • Increase Coverage in CqlEngine Test Suite (PYTHON-505)

                    • +
                    • Example SSL connection code does not verify server certificates (PYTHON-469)

                    • +
                    +
                    +
                    +
                    +

                    3.9.0

                    +
                    +

                    Features

                    +
                      +
                    • cqlengine: remove elements by key from a map (PYTHON-688)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • improve error handling when connecting to non-existent keyspace (PYTHON-665)

                    • +
                    • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

                    • +
                    • rare flake on integration.standard.test_cluster.ClusterTests.test_clone_shared_lbp (PYTHON-727)

                    • +
                    • MontonicTimestampGenerator.__init__ ignores class defaults (PYTHON-728)

                    • +
                    • race where callback or errback for request may not be called (PYTHON-733)

                    • +
                    • cqlengine: model.update() should not update columns with a default value that hasn’t changed (PYTHON-657)

                    • +
                    • cqlengine: field value manager’s explicit flag is True when queried back from cassandra (PYTHON-719)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Connection not closed in example_mapper (PYTHON-723)

                    • +
                    • Remove mention of pre-2.0 C* versions from OSS 3.0+ docs (PYTHON-710)

                    • +
                    +
                    +
                    +
                    +

                    3.8.1

                    +

                    March 16, 2017

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • implement __le__/__ge__/__ne__ on some custom types (PYTHON-714)

                    • +
                    • Fix bug in eventlet and gevent reactors that could cause hangs (PYTHON-721)

                    • +
                    • Fix DecimalType regression (PYTHON-724)

                    • +
                    +
                    +
                    +
                    +

                    3.8.0

                    +
                    +

                    Features

                    +
                      +
                    • Quote index names in metadata CQL generation (PYTHON-616)

                    • +
                    • On column deserialization failure, keep error message consistent between python and cython (PYTHON-631)

                    • +
                    • TokenAwarePolicy always sends requests to the same replica for a given key (PYTHON-643)

                    • +
                    • Added cql types to result set (PYTHON-648)

                    • +
                    • Add __len__ to BatchStatement (PYTHON-650)

                    • +
                    • Duration Type for Cassandra (PYTHON-655)

                    • +
                    • Send flags with PREPARE message in v5 (PYTHON-684)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Potential Timing issue if application exits prior to session pool initialization (PYTHON-636)

                    • +
                    • “Host X.X.X.X has been marked down” without any exceptions (PYTHON-640)

                    • +
                    • NoHostAvailable or OperationTimedOut when using execute_concurrent with a generator that inserts into more than one table (PYTHON-642)

                    • +
                    • ResponseFuture creates Timers and don’t cancel them even when result is received which leads to memory leaks (PYTHON-644)

                    • +
                    • Driver cannot connect to Cassandra version > 3 (PYTHON-646)

                    • +
                    • Unable to import model using UserType without setuping connection since 3.7 (PYTHON-649)

                    • +
                    • Don’t prepare queries on ignored hosts on_up (PYTHON-669)

                    • +
                    • Sockets associated with sessions not getting cleaned up on session.shutdown() (PYTHON-673)

                    • +
                    • Make client timestamps strictly monotonic (PYTHON-676)

                    • +
                    • cassandra.cqlengine.connection.register_connection broken when hosts=None (PYTHON-692)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Create a cqlengine doc section explaining None semantics (PYTHON-623)

                    • +
                    • Resolve warnings in documentation generation (PYTHON-645)

                    • +
                    • Cython dependency (PYTHON-686)

                    • +
                    • Drop Support for Python 2.6 (PYTHON-690)

                    • +
                    +
                    +
                    +
                    +

                    3.7.1

                    +

                    October 26, 2016

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Cython upgrade has broken stable version of cassandra-driver (PYTHON-656)

                    • +
                    +
                    +
                    +
                    +

                    3.7.0

                    +

                    September 13, 2016

                    +
                    +

                    Features

                    +
                      +
                    • Add v5 protocol failure map (PYTHON-619)

                    • +
                    • Don’t return from initial connect on first error (PYTHON-617)

                    • +
                    • Indicate failed column when deserialization fails (PYTHON-361)

                    • +
                    • Let Cluster.refresh_nodes force a token map rebuild (PYTHON-349)

                    • +
                    • Refresh UDTs after “keyspace updated” event with v1/v2 protocol (PYTHON-106)

                    • +
                    • EC2 Address Resolver (PYTHON-198)

                    • +
                    • Speculative query retries (PYTHON-218)

                    • +
                    • Expose paging state in API (PYTHON-200)

                    • +
                    • Don’t mark host down while one connection is active (PYTHON-498)

                    • +
                    • Query request size information (PYTHON-284)

                    • +
                    • Avoid quadratic ring processing with invalid replication factors (PYTHON-379)

                    • +
                    • Improve Connection/Pool creation concurrency on startup (PYTHON-82)

                    • +
                    • Add beta version native protocol flag (PYTHON-614)

                    • +
                    • cqlengine: Connections: support of multiple keyspaces and sessions (PYTHON-613)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Race when adding a pool while setting keyspace (PYTHON-628)

                    • +
                    • Update results_metadata when prepared statement is reprepared (PYTHON-621)

                    • +
                    • CQL Export for Thrift Tables (PYTHON-213)

                    • +
                    • cqlengine: default value not applied to UserDefinedType (PYTHON-606)

                    • +
                    • cqlengine: columns are no longer hashable (PYTHON-618)

                    • +
                    • cqlengine: remove clustering keys from where clause when deleting only static columns (PYTHON-608)

                    • +
                    +
                    +
                    +
                    +

                    3.6.0

                    +

                    August 1, 2016

                    +
                    +

                    Features

                    +
                      +
                    • Handle null values in NumpyProtocolHandler (PYTHON-553)

                    • +
                    • Collect greplin scales stats per cluster (PYTHON-561)

                    • +
                    • Update mock unit test dependency requirement (PYTHON-591)

                    • +
                    • Handle Missing CompositeType metadata following C* upgrade (PYTHON-562)

                    • +
                    • Improve Host.is_up state for HostDistance.IGNORED hosts (PYTHON-551)

                    • +
                    • Utilize v2 protocol’s ability to skip result set metadata for prepared statement execution (PYTHON-71)

                    • +
                    • Return from Cluster.connect() when first contact point connection(pool) is opened (PYTHON-105)

                    • +
                    • cqlengine: Add ContextQuery to allow cqlengine models to switch the keyspace context easily (PYTHON-598)

                    • +
                    • Standardize Validation between Ascii and Text types in Cqlengine (PYTHON-609)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix geventreactor with SSL support (PYTHON-600)

                    • +
                    • Don’t downgrade protocol version if explicitly set (PYTHON-537)

                    • +
                    • Nonexistent contact point tries to connect indefinitely (PYTHON-549)

                    • +
                    • Execute_concurrent can exceed max recursion depth in failure mode (PYTHON-585)

                    • +
                    • Libev loop shutdown race (PYTHON-578)

                    • +
                    • Include aliases in DCT type string (PYTHON-579)

                    • +
                    • cqlengine: Comparison operators for Columns (PYTHON-595)

                    • +
                    • cqlengine: disentangle default_time_to_live table option from model query default TTL (PYTHON-538)

                    • +
                    • cqlengine: pk__token column name issue with the equality operator (PYTHON-584)

                    • +
                    • cqlengine: Fix “__in” filtering operator converts True to string “True” automatically (PYTHON-596)

                    • +
                    • cqlengine: Avoid LWTExceptions when updating columns that are part of the condition (PYTHON-580)

                    • +
                    • cqlengine: Cannot execute a query when the filter contains all columns (PYTHON-599)

                    • +
                    • cqlengine: routing key computation issue when a primary key column is overriden by model inheritance (PYTHON-576)

                    • +
                    +
                    +
                    +
                    +

                    3.5.0

                    +

                    June 27, 2016

                    +
                    +

                    Features

                    +
                      +
                    • Optional Execution Profiles for the core driver (PYTHON-569)

                    • +
                    • API to get the host metadata associated with the control connection node (PYTHON-583)

                    • +
                    • Expose CDC option in table metadata CQL (PYTHON-593)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Clean up Asyncore socket map when fork is detected (PYTHON-577)

                    • +
                    • cqlengine: QuerySet only() is not respected when there are deferred fields (PYTHON-560)

                    • +
                    +
                    +
                    +
                    +

                    3.4.1

                    +

                    May 26, 2016

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Gevent connection closes on IO timeout (PYTHON-573)

                    • +
                    • “dictionary changed size during iteration” with Python 3 (PYTHON-572)

                    • +
                    +
                    +
                    +
                    +

                    3.4.0

                    +

                    May 24, 2016

                    +
                    +

                    Features

                    +
                      +
                    • Include DSE version and workload in Host data (PYTHON-555)

                    • +
                    • Add a context manager to Cluster and Session (PYTHON-521)

                    • +
                    • Better Error Message for Unsupported Protocol Version (PYTHON-157)

                    • +
                    • Make the error message explicitly state when an error comes from the server (PYTHON-412)

                    • +
                    • Short Circuit meta refresh on topo change if NEW_NODE already exists (PYTHON-557)

                    • +
                    • Show warning when the wrong config is passed to SimpleStatement (PYTHON-219)

                    • +
                    • Return namedtuple result pairs from execute_concurrent (PYTHON-362)

                    • +
                    • BatchStatement should enforce batch size limit in a better way (PYTHON-151)

                    • +
                    • Validate min/max request thresholds for connection pool scaling (PYTHON-220)

                    • +
                    • Handle or warn about multiple hosts with the same rpc_address (PYTHON-365)

                    • +
                    • Write docs around working with datetime and timezones (PYTHON-394)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • High CPU utilization when using asyncore event loop (PYTHON-239)

                    • +
                    • Fix CQL Export for non-ASCII Identifiers (PYTHON-447)

                    • +
                    • Make stress scripts Python 2.6 compatible (PYTHON-434)

                    • +
                    • UnicodeDecodeError when unicode characters in key in BOP (PYTHON-559)

                    • +
                    • WhiteListRoundRobinPolicy should resolve hosts (PYTHON-565)

                    • +
                    • Cluster and Session do not GC after leaving scope (PYTHON-135)

                    • +
                    • Don’t wait for schema agreement on ignored nodes (PYTHON-531)

                    • +
                    • Reprepare on_up with many clients causes node overload (PYTHON-556)

                    • +
                    • None inserted into host map when control connection node is decommissioned (PYTHON-548)

                    • +
                    • weakref.ref does not accept keyword arguments (github #585)

                    • +
                    +
                    +
                    +
                    +

                    3.3.0

                    +

                    May 2, 2016

                    +
                    +

                    Features

                    +
                      +
                    • Add an AddressTranslator interface (PYTHON-69)

                    • +
                    • New Retry Policy Decision - try next host (PYTHON-285)

                    • +
                    • Don’t mark host down on timeout (PYTHON-286)

                    • +
                    • SSL hostname verification (PYTHON-296)

                    • +
                    • Add C* version to metadata or cluster objects (PYTHON-301)

                    • +
                    • Options to Disable Schema, Token Metadata Processing (PYTHON-327)

                    • +
                    • Expose listen_address of node we get ring information from (PYTHON-332)

                    • +
                    • Use A-record with multiple IPs for contact points (PYTHON-415)

                    • +
                    • Custom consistency level for populating query traces (PYTHON-435)

                    • +
                    • Normalize Server Exception Types (PYTHON-443)

                    • +
                    • Propagate exception message when DDL schema agreement fails (PYTHON-444)

                    • +
                    • Specialized exceptions for metadata refresh methods failure (PYTHON-527)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Resolve contact point hostnames to avoid duplicate hosts (PYTHON-103)

                    • +
                    • GeventConnection stalls requests when read is a multiple of the input buffer size (PYTHON-429)

                    • +
                    • named_tuple_factory breaks with duplicate “cleaned” col names (PYTHON-467)

                    • +
                    • Connection leak if Cluster.shutdown() happens during reconnection (PYTHON-482)

                    • +
                    • HostConnection.borrow_connection does not block when all request ids are used (PYTHON-514)

                    • +
                    • Empty field not being handled by the NumpyProtocolHandler (PYTHON-550)

                    • +
                    +
                    +
                    +
                    +

                    3.2.2

                    +

                    April 19, 2016

                    +
                      +
                    • Fix counter save-after-no-update (PYTHON-547)

                    • +
                    +
                    +
                    +

                    3.2.1

                    +

                    April 13, 2016

                    +
                      +
                    • Introduced an update to allow deserializer compilation with recently released Cython 0.24 (PYTHON-542)

                    • +
                    +
                    +
                    +

                    3.2.0

                    +

                    April 12, 2016

                    +
                    +

                    Features

                    +
                      +
                    • cqlengine: Warn on sync_schema type mismatch (PYTHON-260)

                    • +
                    • cqlengine: Automatically defer fields with the ‘=’ operator (and immutable values) in select queries (PYTHON-520)

                    • +
                    • cqlengine: support non-equal conditions for LWT (PYTHON-528)

                    • +
                    • cqlengine: sync_table should validate the primary key composition (PYTHON-532)

                    • +
                    • cqlengine: token-aware routing for mapper statements (PYTHON-535)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Deleting a column in a lightweight transaction raises a SyntaxException #325 (PYTHON-249)

                    • +
                    • cqlengine: make Token function works with named tables/columns #86 (PYTHON-272)

                    • +
                    • comparing models with datetime fields fail #79 (PYTHON-273)

                    • +
                    • cython date deserializer integer math should be aligned with CPython (PYTHON-480)

                    • +
                    • db_field is not always respected with UpdateStatement (PYTHON-530)

                    • +
                    • Sync_table fails on column.Set with secondary index (PYTHON-533)

                    • +
                    +
                    +
                    +
                    +

                    3.1.1

                    +

                    March 14, 2016

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • cqlengine: Fix performance issue related to additional “COUNT” queries (PYTHON-522)

                    • +
                    +
                    +
                    +
                    +

                    3.1.0

                    +

                    March 10, 2016

                    +
                    +

                    Features

                    +
                      +
                    • Pass name of server auth class to AuthProvider (PYTHON-454)

                    • +
                    • Surface schema agreed flag for DDL statements (PYTHON-458)

                    • +
                    • Automatically convert float and int to Decimal on serialization (PYTHON-468)

                    • +
                    • Eventlet Reactor IO improvement (PYTHON-495)

                    • +
                    • Make pure Python ProtocolHandler available even when Cython is present (PYTHON-501)

                    • +
                    • Optional Cython deserializer for bytes as bytearray (PYTHON-503)

                    • +
                    • Add Session.default_serial_consistency_level (github #510)

                    • +
                    • cqlengine: Expose prior state information via cqlengine LWTException (github #343, PYTHON-336)

                    • +
                    • cqlengine: Collection datatype “contains” operators support (Cassandra 2.1) #278 (PYTHON-258)

                    • +
                    • cqlengine: Add DISTINCT query operator (PYTHON-266)

                    • +
                    • cqlengine: Tuple cqlengine api (PYTHON-306)

                    • +
                    • cqlengine: Add support for UPDATE/DELETE … IF EXISTS statements (PYTHON-432)

                    • +
                    • cqlengine: Allow nested container types (PYTHON-478)

                    • +
                    • cqlengine: Add ability to set query’s fetch_size and limit (PYTHON-323)

                    • +
                    • cqlengine: Internalize default keyspace from successive set_session (PYTHON-486)

                    • +
                    • cqlengine: Warn when Model.create() on Counters (to be deprecated) (PYTHON-333)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Bus error (alignment issues) when running cython on some ARM platforms (PYTHON-450)

                    • +
                    • Overflow when decoding large collections (cython) (PYTHON-459)

                    • +
                    • Timer heap comparison issue with Python 3 (github #466)

                    • +
                    • Cython deserializer date overflow at 2^31 - 1 (PYTHON-452)

                    • +
                    • Decode error encountered when cython deserializing large map results (PYTHON-459)

                    • +
                    • Don’t require Cython for build if compiler or Python header not present (PYTHON-471)

                    • +
                    • Unorderable types in task scheduling with Python 3 (h(PYTHON-473)

                    • +
                    • cqlengine: Fix crash when updating a UDT column with a None value (github #467)

                    • +
                    • cqlengine: Race condition in ..connection.execute with lazy_connect (PYTHON-310)

                    • +
                    • cqlengine: doesn’t support case sensitive column family names (PYTHON-337)

                    • +
                    • cqlengine: UserDefinedType mandatory in create or update (PYTHON-344)

                    • +
                    • cqlengine: db_field breaks UserType (PYTHON-346)

                    • +
                    • cqlengine: UDT badly quoted (PYTHON-347)

                    • +
                    • cqlengine: Use of db_field on primary key prevents querying except while tracing. (PYTHON-351)

                    • +
                    • cqlengine: DateType.deserialize being called with one argument vs two (PYTHON-354)

                    • +
                    • cqlengine: Querying without setting up connection now throws AttributeError and not CQLEngineException (PYTHON-395)

                    • +
                    • cqlengine: BatchQuery multiple time executing execute statements. (PYTHON-445)

                    • +
                    • cqlengine: Better error for management functions when no connection set (PYTHON-451)

                    • +
                    • cqlengine: Handle None values for UDT attributes in cqlengine (PYTHON-470)

                    • +
                    • cqlengine: Fix inserting None for model save (PYTHON-475)

                    • +
                    • cqlengine: EQ doesn’t map to a QueryOperator (setup race condition) (PYTHON-476)

                    • +
                    • cqlengine: class.MultipleObjectsReturned has DoesNotExist as base class (PYTHON-489)

                    • +
                    • cqlengine: Typo in cqlengine UserType __len__ breaks attribute assignment (PYTHON-502)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • cqlengine: a major improvement on queryset has been introduced. It +is a lot more efficient to iterate large datasets: the rows are +now fetched on demand using the driver pagination.

                    • +
                    • cqlengine: the queryset len() and count() behaviors have changed. It +now executes a “SELECT COUNT(*)” of the query rather than returning +the size of the internal result_cache (loaded rows). On large +queryset, you might want to avoid using them due to the performance +cost. Note that trying to access objects using list index/slicing +with negative indices also requires a count to be +executed.

                    • +
                    +
                    +
                    +
                    +

                    3.0.0

                    +

                    November 24, 2015

                    +
                    +

                    Features

                    +
                      +
                    • Support datetime.date objects as a DateType (PYTHON-212)

                    • +
                    • Add Cluster.update_view_metadata (PYTHON-407)

                    • +
                    • QueryTrace option to populate partial trace sessions (PYTHON-438)

                    • +
                    • Attach column names to ResultSet (PYTHON-439)

                    • +
                    • Change default consistency level to LOCAL_ONE

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Properly SerDes nested collections when protocol_version < 3 (PYTHON-215)

                    • +
                    • Evict UDTs from UserType cache on change (PYTHON-226)

                    • +
                    • Make sure query strings are always encoded UTF-8 (PYTHON-334)

                    • +
                    • Track previous value of columns at instantiation in CQLengine (PYTHON-348)

                    • +
                    • UDT CQL encoding does not work for unicode values (PYTHON-353)

                    • +
                    • NetworkTopologyStrategy#make_token_replica_map does not account for multiple racks in a DC (PYTHON-378)

                    • +
                    • Cython integer overflow on decimal type deserialization (PYTHON-433)

                    • +
                    • Query trace: if session hasn’t been logged, query trace can throw exception (PYTHON-442)

                    • +
                    +
                    +
                    +
                    +

                    3.0.0rc1

                    +

                    November 9, 2015

                    +
                    +

                    Features

                    +
                      +
                    • Process Modernized Schema Tables for Cassandra 3.0 (PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422)

                    • +
                    • Remove deprecated features (PYTHON-292)

                    • +
                    • Don’t assign trace data to Statements (PYTHON-318)

                    • +
                    • Normalize results return (PYTHON-368)

                    • +
                    • Process Materialized View Metadata/Events (PYTHON-371)

                    • +
                    • Remove blist as soft dependency (PYTHON-385)

                    • +
                    • Change default consistency level to LOCAL_QUORUM (PYTHON-416)

                    • +
                    • Normalize CQL query/export in metadata model (PYTHON-405)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Implementation of named arguments bind is non-pythonic (PYTHON-178)

                    • +
                    • CQL encoding is incorrect for NaN and Infinity floats (PYTHON-282)

                    • +
                    • Protocol downgrade issue with C* 2.0.x, 2.1.x, and python3, with non-default logging (PYTHON-409)

                    • +
                    • ValueError when accessing usertype with non-alphanumeric field names (PYTHON-413)

                    • +
                    • NumpyProtocolHandler does not play well with PagedResult (PYTHON-430)

                    • +
                    +
                    +
                    +
                    +

                    2.7.2

                    +

                    September 14, 2015

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Resolve CQL export error for UDF with zero parameters (PYTHON-392)

                    • +
                    • Remove futures dep. for Python 3 (PYTHON-393)

                    • +
                    • Avoid Python closure in cdef (supports earlier Cython compiler) (PYTHON-396)

                    • +
                    • Unit test runtime issues (PYTHON-397,398)

                    • +
                    +
                    +
                    +
                    +

                    2.7.1

                    +

                    August 25, 2015

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Explicitly include extension source files in Manifest

                    • +
                    +
                    +
                    +
                    +

                    2.7.0

                    +

                    August 25, 2015

                    +

                    Cython is introduced, providing compiled extensions for core modules, and +extensions for optimized results deserialization.

                    +
                    +

                    Features

                    +
                      +
                    • General Performance Improvements for Throughput (PYTHON-283)

                    • +
                    • Improve synchronous request performance with Timers (PYTHON-108)

                    • +
                    • Enable C Extensions for PyPy Runtime (PYTHON-357)

                    • +
                    • Refactor SerDes functionality for pluggable interface (PYTHON-313)

                    • +
                    • Cython SerDes Extension (PYTHON-377)

                    • +
                    • Accept iterators/generators for execute_concurrent() (PYTHON-123)

                    • +
                    • cythonize existing modules (PYTHON-342)

                    • +
                    • Pure Python murmur3 implementation (PYTHON-363)

                    • +
                    • Make driver tolerant of inconsistent metadata (PYTHON-370)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Drop Events out-of-order Cause KeyError on Processing (PYTHON-358)

                    • +
                    • DowngradingConsistencyRetryPolicy doesn’t check response count on write timeouts (PYTHON-338)

                    • +
                    • Blocking connect does not use connect_timeout (PYTHON-381)

                    • +
                    • Properly protect partition key in CQL export (PYTHON-375)

                    • +
                    • Trigger error callbacks on timeout (PYTHON-294)

                    • +
                    +
                    +
                    +
                    +

                    2.6.0

                    +

                    July 20, 2015

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Output proper CQL for compact tables with no clustering columns (PYTHON-360)

                    • +
                    +
                    +
                    +
                    +

                    2.6.0c2

                    +

                    June 24, 2015

                    +
                    +

                    Features

                    +
                      +
                    • Automatic Protocol Version Downgrade (PYTHON-240)

                    • +
                    • cqlengine Python 2.6 compatibility (PYTHON-288)

                    • +
                    • Double-dollar string quote UDF body (PYTHON-345)

                    • +
                    • Set models.DEFAULT_KEYSPACE when calling set_session (github #352)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Avoid stall while connecting to mixed version cluster (PYTHON-303)

                    • +
                    • Make SSL work with AsyncoreConnection in python 2.6.9 (PYTHON-322)

                    • +
                    • Fix Murmur3Token.from_key() on Windows (PYTHON-331)

                    • +
                    • Fix cqlengine TimeUUID rounding error for Windows (PYTHON-341)

                    • +
                    • Avoid invalid compaction options in CQL export for non-SizeTiered (PYTHON-352)

                    • +
                    +
                    +
                    +
                    +

                    2.6.0c1

                    +

                    June 4, 2015

                    +

                    This release adds support for Cassandra 2.2 features, including version +4 of the native protocol.

                    +
                    +

                    Features

                    +
                      +
                    • Default load balancing policy to TokenAware(DCAware) (PYTHON-160)

                    • +
                    • Configuration option for connection timeout (PYTHON-206)

                    • +
                    • Support User Defined Function and Aggregate metadata in C* 2.2 (PYTHON-211)

                    • +
                    • Surface request client in QueryTrace for C* 2.2+ (PYTHON-235)

                    • +
                    • Implement new request failure messages in protocol v4+ (PYTHON-238)

                    • +
                    • Metadata model now maps index meta by index name (PYTHON-241)

                    • +
                    • Support new types in C* 2.2: date, time, smallint, tinyint (PYTHON-245, 295)

                    • +
                    • cqle: add Double column type and remove Float overload (PYTHON-246)

                    • +
                    • Use partition key column information in prepared response for protocol v4+ (PYTHON-277)

                    • +
                    • Support message custom payloads in protocol v4+ (PYTHON-280, PYTHON-329)

                    • +
                    • Deprecate refresh_schema and replace with functions for specific entities (PYTHON-291)

                    • +
                    • Save trace id even when trace complete times out (PYTHON-302)

                    • +
                    • Warn when registering client UDT class for protocol < v3 (PYTHON-305)

                    • +
                    • Support client warnings returned with messages in protocol v4+ (PYTHON-315)

                    • +
                    • Ability to distinguish between NULL and UNSET values in protocol v4+ (PYTHON-317)

                    • +
                    • Expose CQL keywords in API (PYTHON-324)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • IPv6 address support on Windows (PYTHON-20)

                    • +
                    • Convert exceptions during automatic re-preparation to nice exceptions (PYTHON-207)

                    • +
                    • cqle: Quote keywords properly in table management functions (PYTHON-244)

                    • +
                    • Don’t default to GeventConnection when gevent is loaded, but not monkey-patched (PYTHON-289)

                    • +
                    • Pass dynamic host from SaslAuthProvider to SaslAuthenticator (PYTHON-300)

                    • +
                    • Make protocol read_inet work for Windows (PYTHON-309)

                    • +
                    • cqle: Correct encoding for nested types (PYTHON-311)

                    • +
                    • Update list of CQL keywords used quoting identifiers (PYTHON-319)

                    • +
                    • Make ConstantReconnectionPolicy work with infinite retries (github #327, PYTHON-325)

                    • +
                    • Accept UUIDs with uppercase hex as valid in cqlengine (github #335)

                    • +
                    +
                    +
                    +
                    +

                    2.5.1

                    +

                    April 23, 2015

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix thread safety in DC-aware load balancing policy (PYTHON-297)

                    • +
                    • Fix race condition in node/token rebuild (PYTHON-298)

                    • +
                    • Set and send serial consistency parameter (PYTHON-299)

                    • +
                    +
                    +
                    +
                    +

                    2.5.0

                    +

                    March 30, 2015

                    +
                    +

                    Features

                    +
                      +
                    • Integrated cqlengine object mapping package

                    • +
                    • Utility functions for converting timeuuids and datetime (PYTHON-99)

                    • +
                    • Schema metadata fetch window randomized, config options added (PYTHON-202)

                    • +
                    • Support for new Date and Time Cassandra types (PYTHON-190)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix index target for collection indexes (full(), keys()) (PYTHON-222)

                    • +
                    • Thread exception during GIL cleanup (PYTHON-229)

                    • +
                    • Workaround for rounding anomaly in datetime.utcfromtime (Python 3.4) (PYTHON-230)

                    • +
                    • Normalize text serialization for lookup in OrderedMap (PYTHON-231)

                    • +
                    • Support reading CompositeType data (PYTHON-234)

                    • +
                    • Preserve float precision in CQL encoding (PYTHON-243)

                    • +
                    +
                    +
                    +
                    +

                    2.1.4

                    +

                    January 26, 2015

                    +
                    +

                    Features

                    +
                      +
                    • SaslAuthenticator for Kerberos support (PYTHON-109)

                    • +
                    • Heartbeat for network device keepalive and detecting failures on idle connections (PYTHON-197)

                    • +
                    • Support nested, frozen collections for Cassandra 2.1.3+ (PYTHON-186)

                    • +
                    • Schema agreement wait bypass config, new call for synchronous schema refresh (PYTHON-205)

                    • +
                    • Add eventlet connection support (PYTHON-194)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Schema meta fix for complex thrift tables (PYTHON-191)

                    • +
                    • Support for ‘unknown’ replica placement strategies in schema meta (PYTHON-192)

                    • +
                    • Resolve stream ID leak on set_keyspace (PYTHON-195)

                    • +
                    • Remove implicit timestamp scaling on serialization of numeric timestamps (PYTHON-204)

                    • +
                    • Resolve stream id collision when using SASL auth (PYTHON-210)

                    • +
                    • Correct unhexlify usage for user defined type meta in Python3 (PYTHON-208)

                    • +
                    +
                    +
                    +
                    +

                    2.1.3

                    +

                    December 16, 2014

                    +
                    +

                    Features

                    +
                      +
                    • INFO-level log confirmation that a connection was opened to a node that was marked up (PYTHON-116)

                    • +
                    • Avoid connecting to peer with incomplete metadata (PYTHON-163)

                    • +
                    • Add SSL support to gevent reactor (PYTHON-174)

                    • +
                    • Use control connection timeout in wait for schema agreement (PYTHON-175)

                    • +
                    • Better consistency level representation in unavailable+timeout exceptions (PYTHON-180)

                    • +
                    • Update schema metadata processing to accommodate coming schema modernization (PYTHON-185)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Support large negative timestamps on Windows (PYTHON-119)

                    • +
                    • Fix schema agreement for clusters with peer rpc_addres 0.0.0.0 (PYTHON-166)

                    • +
                    • Retain table metadata following keyspace meta refresh (PYTHON-173)

                    • +
                    • Use a timeout when preparing a statement for all nodes (PYTHON-179)

                    • +
                    • Make TokenAware routing tolerant of statements with no keyspace (PYTHON-181)

                    • +
                    • Update add_collback to store/invoke multiple callbacks (PYTHON-182)

                    • +
                    • Correct routing key encoding for composite keys (PYTHON-184)

                    • +
                    • Include compression option in schema export string when disabled (PYTHON-187)

                    • +
                    +
                    +
                    +
                    +

                    2.1.2

                    +

                    October 16, 2014

                    +
                    +

                    Features

                    +
                      +
                    • Allow DCAwareRoundRobinPolicy to be constructed without a local_dc, defaulting +instead to the DC of a contact_point (PYTHON-126)

                    • +
                    • Set routing key in BatchStatement.add() if none specified in batch (PYTHON-148)

                    • +
                    • Improved feedback on ValueError using named_tuple_factory with invalid column names (PYTHON-122)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Make execute_concurrent compatible with Python 2.6 (PYTHON-159)

                    • +
                    • Handle Unauthorized message on schema_triggers query (PYTHON-155)

                    • +
                    • Pure Python sorted set in support of UDTs nested in collections (PYTON-167)

                    • +
                    • Support CUSTOM index metadata and string export (PYTHON-165)

                    • +
                    +
                    +
                    +
                    +

                    2.1.1

                    +

                    September 11, 2014

                    +
                    +

                    Features

                    +
                      +
                    • Detect triggers and include them in CQL queries generated to recreate +the schema (github-189)

                    • +
                    • Support IPv6 addresses (PYTHON-144) (note: basic functionality added; Windows +platform not addressed (PYTHON-20))

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix NetworkTopologyStrategy.export_for_schema (PYTHON-120)

                    • +
                    • Keep timeout for paged results (PYTHON-150)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Add frozen<> type modifier to UDTs and tuples to handle CASSANDRA-7857

                    • +
                    +
                    +
                    +
                    +

                    2.1.0

                    +

                    August 7, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Correctly serialize and deserialize null values in tuples and +user-defined types (PYTHON-110)

                    • +
                    • Include additional header and lib dirs, allowing libevwrapper to build +against Homebrew and Mac Ports installs of libev (PYTHON-112 and 804dea3)

                    • +
                    +
                    +
                    +
                    +

                    2.1.0c1

                    +

                    July 25, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Properly specify UDTs for columns in CREATE TABLE statements

                    • +
                    • Avoid moving retries to a new host when using request ID zero (PYTHON-88)

                    • +
                    • Don’t ignore fetch_size arguments to Statement constructors (github-151)

                    • +
                    • Allow disabling automatic paging on a per-statement basis when it’s +enabled by default for the session (PYTHON-93)

                    • +
                    • Raise ValueError when tuple query parameters for prepared statements +have extra items (PYTHON-98)

                    • +
                    • Correctly encode nested tuples and UDTs for non-prepared statements (PYTHON-100)

                    • +
                    • Raise TypeError when a string is used for contact_points (github #164)

                    • +
                    • Include User Defined Types in KeyspaceMetadata.export_as_string() (PYTHON-96)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Return list collection columns as python lists instead of tuples +now that tuples are a specific Cassandra type

                    • +
                    +
                    +
                    +
                    +

                    2.1.0b1

                    +

                    July 11, 2014

                    +

                    This release adds support for Cassandra 2.1 features, including version +3 of the native protocol.

                    +
                    +

                    Features

                    +
                      +
                    • When using the v3 protocol, only one connection is opened per-host, and +throughput is improved due to reduced pooling overhead and lock contention.

                    • +
                    • Support for user-defined types (Cassandra 2.1+)

                    • +
                    • Support for tuple type in (limited usage Cassandra 2.0.9, full usage +in Cassandra 2.1)

                    • +
                    • Protocol-level client-side timestamps (see Session.use_client_timestamp)

                    • +
                    • Overridable type encoding for non-prepared statements (see Session.encoders)

                    • +
                    • Configurable serial consistency levels for batch statements

                    • +
                    • Use io.BytesIO for reduced CPU consumption (github #143)

                    • +
                    • Support Twisted as a reactor. Note that a Twisted-compatible +API is not exposed (so no Deferreds), this is just a reactor +implementation. (github #135, PYTHON-8)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix references to xrange that do not go through “six” in libevreactor and +geventreactor (github #138)

                    • +
                    • Make BoundStatements inherit fetch_size from their parent +PreparedStatement (PYTHON-80)

                    • +
                    • Clear reactor state in child process after forking to prevent errors with +multiprocessing when the parent process has connected a Cluster before +forking (github #141)

                    • +
                    • Don’t share prepared statement lock across Cluster instances

                    • +
                    • Format CompositeType and DynamicCompositeType columns correctly in +CREATE TABLE statements.

                    • +
                    • Fix cassandra.concurrent behavior when dealing with automatic paging +(PYTHON-81)

                    • +
                    • Properly defunct connections after protocol errors

                    • +
                    • Avoid UnicodeDecodeError when query string is unicode (PYTHON-76)

                    • +
                    • Correctly capture dclocal_read_repair_chance for tables and +use it when generating CREATE TABLE statements (PYTHON-84)

                    • +
                    • Avoid race condition with AsyncoreConnection that may cause messages +to fail to be written until a new message is pushed

                    • +
                    • Make sure cluster.metadata.partitioner and cluster.metadata.token_map +are populated when all nodes in the cluster are included in the +contact points (PYTHON-90)

                    • +
                    • Make Murmur3 hash match Cassandra’s hash for all values (PYTHON-89, +github #147)

                    • +
                    • Don’t attempt to reconnect to hosts that should be ignored (according +to the load balancing policy) when a notification is received that the +host is down.

                    • +
                    • Add CAS WriteType, avoiding KeyError on CAS write timeout (PYTHON-91)

                    • +
                    +
                    +
                    +
                    +

                    2.0.2

                    +

                    June 10, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Add six to requirements.txt

                    • +
                    • Avoid KeyError during schema refresh when a keyspace is dropped +and TokenAwarePolicy is not in use

                    • +
                    • Avoid registering multiple atexit cleanup functions when the +asyncore event loop is restarted multiple times

                    • +
                    • Delay initialization of reactors in order to avoid problems +with shared state when using multiprocessing (PYTHON-60)

                    • +
                    • Add python-six to debian dependencies, move python-blist to recommends

                    • +
                    • Fix memory leak when libev connections are created and +destroyed (github #93)

                    • +
                    • Ensure token map is rebuilt when hosts are removed from the cluster

                    • +
                    +
                    +
                    +
                    +

                    2.0.1

                    +

                    May 28, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix check for Cluster.is_shutdown in in @run_in_executor +decorator

                    • +
                    +
                    +
                    +
                    +

                    2.0.0

                    +

                    May 28, 2014

                    +
                    +

                    Features

                    +
                      +
                    • Make libev C extension Python3-compatible (PYTHON-70)

                    • +
                    • Support v2 protocol authentication (PYTHON-73, github #125)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix murmur3 C extension compilation under Python3.4 (github #124)

                    • +
                    +
                    +
                    +

                    Merged From 1.x

                    +
                    +

                    Features

                    +
                      +
                    • Add Session.default_consistency_level (PYTHON-14)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Don’t strip trailing underscores from column names when using the +named_tuple_factory (PYTHON-56)

                    • +
                    • Ensure replication factors are ints for NetworkTopologyStrategy +to avoid TypeErrors (github #120)

                    • +
                    • Pass WriteType instance to RetryPolicy.on_write_timeout() instead +of the string name of the write type. This caused write timeout +errors to always be rethrown instead of retrying. (github #123)

                    • +
                    • Avoid submitting tasks to the ThreadPoolExecutor after shutdown. With +retries enabled, this could cause Cluster.shutdown() to hang under +some circumstances.

                    • +
                    • Fix unintended rebuild of token replica map when keyspaces are +discovered (on startup), added, or updated and TokenAwarePolicy is not +in use.

                    • +
                    • Avoid rebuilding token metadata when cluster topology has not +actually changed

                    • +
                    • Avoid preparing queries for hosts that should be ignored (such as +remote hosts when using the DCAwareRoundRobinPolicy) (PYTHON-75)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Add 1 second timeout to join() call on event loop thread during +interpreter shutdown. This can help to prevent the process from +hanging during shutdown.

                    • +
                    +
                    +
                    +
                    +
                    +

                    2.0.0b1

                    +

                    May 6, 2014

                    +
                    +

                    Upgrading from 1.x

                    +

                    Cluster.shutdown() should always be called when you are done with a +Cluster instance. If it is not called, there are no guarantees that the +driver will not hang. However, if you do have a reproduceable case +where Cluster.shutdown() is not called and the driver hangs, please +report it so that we can attempt to fix it.

                    +

                    If you’re using the 2.0 driver against Cassandra 1.2, you will need +to set your protocol version to 1. For example:

                    +
                    +

                    cluster = Cluster(…, protocol_version=1)

                    +
                    +
                    +
                    +

                    Features

                    +
                      +
                    • Support v2 of Cassandra’s native protocol, which includes the following +new features: automatic query paging support, protocol-level batch statements, +and lightweight transactions

                    • +
                    • Support for Python 3.3 and 3.4

                    • +
                    • Allow a default query timeout to be set per-Session

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Avoid errors during interpreter shutdown (the driver attempts to cleanup +daemonized worker threads before interpreter shutdown)

                    • +
                    +
                    +
                    +

                    Deprecations

                    +

                    The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

                    +
                      +
                    • cassandra.decoder.tuple_factory has moved to cassandra.query.tuple_factory

                    • +
                    • cassandra.decoder.named_tuple_factory has moved to cassandra.query.named_tuple_factory

                    • +
                    • cassandra.decoder.dict_factory has moved to cassandra.query.dict_factory

                    • +
                    • cassandra.decoder.ordered_dict_factory has moved to cassandra.query.ordered_dict_factory

                    • +
                    +

                    Exceptions that were in cassandra.decoder have been moved to cassandra.protocol. If +you handle any of these exceptions, you must adjust the code accordingly.

                    +
                    +
                    +
                    +

                    1.1.2

                    +

                    May 8, 2014

                    +
                    +

                    Features

                    +
                      +
                    • Allow a specific compression type to be requested for communications with +Cassandra and prefer lz4 if available

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Update token metadata (for TokenAware calculations) when a node is removed +from the ring

                    • +
                    • Fix file handle leak with gevent reactor due to blocking Greenlet kills when +closing excess connections

                    • +
                    • Avoid handling a node coming up multiple times due to a reconnection attempt +succeeding close to the same time that an UP notification is pushed

                    • +
                    • Fix duplicate node-up handling, which could result in multiple reconnectors +being started as well as the executor threads becoming deadlocked, preventing +future node up or node down handling from being executed.

                    • +
                    • Handle exhausted ReconnectionPolicy schedule correctly

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Don’t log at ERROR when a connection is closed during the startup +communications

                    • +
                    • Mke scales, blist optional dependencies

                    • +
                    +
                    +
                    +
                    +

                    1.1.1

                    +

                    April 16, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix unconditional import of nose in setup.py (github #111)

                    • +
                    +
                    +
                    +
                    +

                    1.1.0

                    +

                    April 16, 2014

                    +
                    +

                    Features

                    +
                      +
                    • Gevent is now supported through monkey-patching the stdlib (PYTHON-7, +github issue #46)

                    • +
                    • Support static columns in schemas, which are available starting in +Cassandra 2.1. (github issue #91)

                    • +
                    • Add debian packaging (github issue #101)

                    • +
                    • Add utility methods for easy concurrent execution of statements. See +the new cassandra.concurrent module. (github issue #7)

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Correctly supply compaction and compression parameters in CREATE statements +for tables when working with Cassandra 2.0+

                    • +
                    • Lowercase boolean literals when generating schemas

                    • +
                    • Ignore SSL_ERROR_WANT_READ and SSL_ERROR_WANT_WRITE socket errors. Previously, +these resulted in the connection being defuncted, but they can safely be +ignored by the driver.

                    • +
                    • Don’t reconnect the control connection every time Cluster.connect() is +called

                    • +
                    • Avoid race condition that could leave ResponseFuture callbacks uncalled +if the callback was added outside of the event loop thread (github issue #95)

                    • +
                    • Properly escape keyspace name in Session.set_keyspace(). Previously, the +keyspace name was quoted, but any quotes in the string were not escaped.

                    • +
                    • Avoid adding hosts to the load balancing policy before their datacenter +and rack information has been set, if possible.

                    • +
                    • Avoid KeyError when updating metadata after droping a table (github issues +#97, #98)

                    • +
                    • Use tuples instead of sets for DCAwareLoadBalancingPolicy to ensure equal +distribution of requests

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Don’t ignore column names when parsing typestrings. This is needed for +user-defined type support. (github issue #90)

                    • +
                    • Better error message when libevwrapper is not found

                    • +
                    • Only try to import scales when metrics are enabled (github issue #92)

                    • +
                    • Cut down on the number of queries executing when a new Cluster +connects and when the control connection has to reconnect (github issue #104, +PYTHON-59)

                    • +
                    • Issue warning log when schema versions do not match

                    • +
                    +
                    +
                    +
                    +

                    1.0.2

                    +

                    March 4, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • With asyncorereactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

                    • +
                    • Double quote keyspace, table and column names that require them (those using +uppercase characters or keywords) when generating CREATE statements through +KeyspaceMetadata and TableMetadata.

                    • +
                    • Decode TimestampType as DateType. (Cassandra replaced DateType with +TimestampType to fix sorting of pre-unix epoch dates in CASSANDRA-5723.)

                    • +
                    • Handle latest table options when parsing the schema and generating +CREATE statements.

                    • +
                    • Avoid ‘Set changed size during iteration’ during query plan generation +when hosts go up or down

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Remove ignored tracing_enabled parameter for SimpleStatement. The +correct way to trace a query is by setting the trace argument to True +in Session.execute() and Session.execute_async().

                    • +
                    • Raise TypeError instead of cassandra.query.InvalidParameterTypeError when +a parameter for a prepared statement has the wrong type; remove +cassandra.query.InvalidParameterTypeError.

                    • +
                    • More consistent type checking for query parameters

                    • +
                    • Add option to a return special object for empty string values for non-string +columns

                    • +
                    +
                    +
                    +
                    +

                    1.0.1

                    +

                    Feb 19, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Include table indexes in KeyspaceMetadata.export_as_string()

                    • +
                    • Fix broken token awareness on ByteOrderedPartitioner

                    • +
                    • Always close socket when defuncting error’ed connections to avoid a potential +file descriptor leak

                    • +
                    • Handle “custom” types (such as the replaced DateType) correctly

                    • +
                    • With libevreactor, correctly handle EAGAIN/EWOULDBLOCK when the message from +Cassandra is a multiple of the read buffer size. Previously, if no more data +became available to read on the socket, the message would never be processed, +resulting in an OperationTimedOut error.

                    • +
                    • Don’t break tracing when a Session’s row_factory is not the default +namedtuple_factory.

                    • +
                    • Handle data that is already utf8-encoded for UTF8Type values

                    • +
                    • Fix token-aware routing for tokens that fall before the first node token in +the ring and tokens that exactly match a node’s token

                    • +
                    • Tolerate null source_elapsed values for Trace events. These may not be +set when events complete after the main operation has already completed.

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Skip sending OPTIONS message on connection creation if compression is +disabled or not available and a CQL version has not been explicitly +set

                    • +
                    • Add details about errors and the last queried host to OperationTimedOut

                    • +
                    +
                    +
                    +
                    +

                    1.0.0 Final

                    +

                    Jan 29, 2014

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Prevent leak of Scheduler thread (even with proper shutdown)

                    • +
                    • Correctly handle ignored hosts, which are common with the +DCAwareRoundRobinPolicy

                    • +
                    • Hold strong reference to prepared statement while executing it to avoid +garbage collection

                    • +
                    • Add NullHandler logging handler to the cassandra package to avoid +warnings about there being no configured logger

                    • +
                    • Fix bad handling of nodes that have been removed from the cluster

                    • +
                    • Properly escape string types within cql collections

                    • +
                    • Handle setting the same keyspace twice in a row

                    • +
                    • Avoid race condition during schema agreement checks that could result +in schema update queries returning before all nodes had seen the change

                    • +
                    • Preserve millisecond-level precision in datetimes when performing inserts +with simple (non-prepared) statements

                    • +
                    • Properly defunct connections when libev reports an error by setting +errno instead of simply logging the error

                    • +
                    • Fix endless hanging of some requests when using the libev reactor

                    • +
                    • Always start a reconnection process when we fail to connect to +a newly bootstrapped node

                    • +
                    • Generators map to CQL lists, not key sequences

                    • +
                    • Always defunct connections when an internal operation fails

                    • +
                    • Correctly break from handle_write() if nothing was sent (asyncore +reactor only)

                    • +
                    • Avoid potential double-erroring of callbacks when a connection +becomes defunct

                    • +
                    +
                    +
                    +

                    Features

                    +
                      +
                    • Add default query timeout to Session

                    • +
                    • Add timeout parameter to Session.execute()

                    • +
                    • Add WhiteListRoundRobinPolicy as a load balancing policy option

                    • +
                    • Support for consistency level LOCAL_ONE

                    • +
                    • Make the backoff for fetching traces exponentially increasing and +configurable

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Raise Exception if TokenAwarePolicy is used against a cluster using the +Murmur3Partitioner if the murmur3 C extension has not been compiled

                    • +
                    • Add encoder mapping for OrderedDict

                    • +
                    • Use timeouts on all control connection queries

                    • +
                    • Benchmark improvements, including command line options and eay +multithreading support

                    • +
                    • Reduced lock contention when using the asyncore reactor

                    • +
                    • Warn when non-datetimes are used for ‘timestamp’ column values in +prepared statements

                    • +
                    • Add requirements.txt and test-requirements.txt

                    • +
                    • TravisCI integration for running unit tests against Python 2.6, +Python 2.7, and PyPy

                    • +
                    +
                    +
                    +
                    +

                    1.0.0b7

                    +

                    Nov 12, 2013

                    +

                    This release makes many stability improvements, especially around +prepared statements and node failure handling. In particular, +several cases where a request would never be completed (and as a +result, leave the application hanging) have been resolved.

                    +
                    +

                    Features

                    +
                      +
                    • Add timeout kwarg to ResponseFuture.result()

                    • +
                    • Create connection pools to all hosts in parallel when initializing +new Sesssions.

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Properly set exception on ResponseFuture when a query fails +against all hosts

                    • +
                    • Improved cleanup and reconnection efforts when reconnection fails +on a node that has recently come up

                    • +
                    • Use correct consistency level when retrying failed operations +against a different host. (An invalid consistency level was being +used, causing the retry to fail.)

                    • +
                    • Better error messages for failed Session.prepare() opertaions

                    • +
                    • Prepare new statements against all hosts in parallel (formerly +sequential)

                    • +
                    • Fix failure to save the new current keyspace on connections. (This +could cause problems for prepared statements and lead to extra +operations to continuously re-set the keyspace.)

                    • +
                    • Avoid sharing LoadBalancingPolicies across Cluster instances. (When +a second Cluster was connected, it effectively mark nodes down for the +first Cluster.)

                    • +
                    • Better handling of failures during the re-preparation sequence for +unrecognized prepared statements

                    • +
                    • Throttle trashing of underutilized connections to avoid trashing newly +created connections

                    • +
                    • Fix race condition which could result in trashed connections being closed +before the last operations had completed

                    • +
                    • Avoid preparing statements on the event loop thread (which could lead to +deadlock)

                    • +
                    • Correctly mark up non-contact point nodes discovered by the control +connection. (This lead to prepared statements not being prepared +against those hosts, generating extra traffic later when the +statements were executed and unrecognized.)

                    • +
                    • Correctly handle large messages through libev

                    • +
                    • Add timeout to schema agreement check queries

                    • +
                    • More complete (and less contended) locking around manipulation of the +pending message deque for libev connections

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Prepare statements in batches of 10. (When many prepared statements +are in use, this allows the driver to start utilizing nodes that +were restarted more quickly.)

                    • +
                    • Better debug logging around connection management

                    • +
                    • Don’t retain unreferenced prepared statements in the local cache. +(If many different prepared statements were created, this would +increase memory usage and greatly increase the amount of time +required to begin utilizing a node that was added or marked +up.)

                    • +
                    +
                    +
                    +
                    +

                    1.0.0b6

                    +

                    Oct 22, 2013

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Use lazy string formatting when logging

                    • +
                    • Avoid several deadlock scenarios, especially when nodes go down

                    • +
                    • Avoid trashing newly created connections due to insufficient traffic

                    • +
                    • Gracefully handle un-handled Exceptions when erroring callbacks

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Node state listeners (which are called when a node is added, removed, +goes down, or comes up) should now be registered through +Cluster.register_listener() instead of through a host’s HealthMonitor +(which has been removed)

                    • +
                    +
                    +
                    +
                    +

                    1.0.0b5

                    +

                    Oct 10, 2013

                    +
                    +

                    Features

                    +
                      +
                    • SSL support

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Avoid KeyError when building replica map for NetworkTopologyStrategy

                    • +
                    • Work around python bug which causes deadlock when a thread imports +the utf8 module

                    • +
                    • Handle no blist library, which is not compatible with pypy

                    • +
                    • Avoid deadlock triggered by a keyspace being set on a connection (which +may happen automatically for new connections)

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Switch packaging from Distribute to setuptools, improved C extension +support

                    • +
                    • Use PEP 386 compliant beta and post-release versions

                    • +
                    +
                    +
                    +
                    +

                    1.0.0-beta4

                    +

                    Sep 24, 2013

                    +
                    +

                    Features

                    +
                      +
                    • Handle new blob syntax in Cassandra 2.0 by accepting bytearray +objects for blob values

                    • +
                    • Add cql_version kwarg to Cluster.__init__

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix KeyError when building token map with NetworkTopologyStrategy +keyspaces (this prevented a Cluster from successfully connecting +at all).

                    • +
                    • Don’t lose default consitency level from parent PreparedStatement +when creating BoundStatements

                    • +
                    +
                    +
                    +
                    +

                    1.0.0-beta3

                    +

                    Sep 20, 2013

                    +
                    +

                    Features

                    +
                      +
                    • Support for LZ4 compression (Cassandra 2.0+)

                    • +
                    • Token-aware routing will now utilize all replicas for a query instead +of just the first replica

                    • +
                    +
                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix libev include path for CentOS

                    • +
                    • Fix varint packing of the value 0

                    • +
                    • Correctly pack unicode values

                    • +
                    • Don’t attempt to return failed connections to the pool when a final result +is set

                    • +
                    • Fix bad iteration of connection credentials

                    • +
                    • Use blist’s orderedset for set collections and OrderedDict for map +collections so that Cassandra’s ordering is preserved

                    • +
                    • Fix connection failure on Windows due to unavailability of inet_pton +and inet_ntop. (Note that IPv6 inet_address values are still not +supported on Windows.)

                    • +
                    • Boolean constants shouldn’t be surrounded by single quotes

                    • +
                    • Avoid a potential loss of precision on float constants due to string +formatting

                    • +
                    • Actually utilize non-standard ports set on Cluster objects

                    • +
                    • Fix export of schema as a set of CQL queries

                    • +
                    +
                    +
                    +

                    Other

                    +
                      +
                    • Use cStringIO for connection buffer for better performance

                    • +
                    • Add __repr__ method for Statement classes

                    • +
                    • Raise InvalidTypeParameterError when parameters of the wrong +type are used with statements

                    • +
                    • Make all tests compatible with Python 2.6

                    • +
                    • Add 1s timeout for opening new connections

                    • +
                    +
                    +
                    +
                    +

                    1.0.0-beta2

                    +

                    Aug 19, 2013

                    +
                    +

                    Bug Fixes

                    +
                      +
                    • Fix pip packaging

                    • +
                    +
                    +
                    +
                    +

                    1.0.0-beta

                    +

                    Aug 16, 2013

                    +

                    Initial release

                    +
                    +
                    + + +
                    + + + + + +
                    + + +
                    +
                    +

                    +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                    +
                    +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/stable/CNAME b/stable/CNAME new file mode 100644 index 0000000000..9f3e01a070 --- /dev/null +++ b/stable/CNAME @@ -0,0 +1 @@ +python-driver.docs.scylladb.com \ No newline at end of file diff --git a/stable/_sources/CHANGELOG.rst.txt b/stable/_sources/CHANGELOG.rst.txt new file mode 100644 index 0000000000..f6d642b27f --- /dev/null +++ b/stable/_sources/CHANGELOG.rst.txt @@ -0,0 +1,7 @@ +:orphan: + +********* +CHANGELOG +********* + +.. include:: ../CHANGELOG.rst diff --git a/stable/_sources/api/cassandra.rst.txt b/stable/_sources/api/cassandra.rst.txt new file mode 100644 index 0000000000..d46aae56cb --- /dev/null +++ b/stable/_sources/api/cassandra.rst.txt @@ -0,0 +1,77 @@ +:mod:`cassandra` - Exceptions and Enums +======================================= + +.. module:: cassandra + +.. data:: __version_info__ + + The version of the driver in a tuple format + +.. data:: __version__ + + The version of the driver in a string format + +.. autoclass:: ConsistencyLevel + :members: + +.. autoclass:: ProtocolVersion + :members: + +.. autoclass:: UserFunctionDescriptor + :members: + :inherited-members: + +.. autoclass:: UserAggregateDescriptor + :members: + :inherited-members: + +.. autoexception:: DriverException() + :members: + +.. autoexception:: RequestExecutionException() + :members: + +.. autoexception:: Unavailable() + :members: + +.. autoexception:: Timeout() + :members: + +.. autoexception:: ReadTimeout() + :members: + +.. autoexception:: WriteTimeout() + :members: + +.. autoexception:: CoordinationFailure() + :members: + +.. autoexception:: ReadFailure() + :members: + +.. autoexception:: WriteFailure() + :members: + +.. autoexception:: FunctionFailure() + :members: + +.. autoexception:: RequestValidationException() + :members: + +.. autoexception:: ConfigurationException() + :members: + +.. autoexception:: AlreadyExists() + :members: + +.. autoexception:: InvalidRequest() + :members: + +.. autoexception:: Unauthorized() + :members: + +.. autoexception:: AuthenticationFailed() + :members: + +.. autoexception:: OperationTimedOut() + :members: diff --git a/stable/_sources/api/cassandra/auth.rst.txt b/stable/_sources/api/cassandra/auth.rst.txt new file mode 100644 index 0000000000..58c964cf89 --- /dev/null +++ b/stable/_sources/api/cassandra/auth.rst.txt @@ -0,0 +1,22 @@ +``cassandra.auth`` - Authentication +=================================== + +.. module:: cassandra.auth + +.. autoclass:: AuthProvider + :members: + +.. autoclass:: Authenticator + :members: + +.. autoclass:: PlainTextAuthProvider + :members: + +.. autoclass:: PlainTextAuthenticator + :members: + +.. autoclass:: SaslAuthProvider + :members: + +.. autoclass:: SaslAuthenticator + :members: diff --git a/stable/_sources/api/cassandra/cluster.rst.txt b/stable/_sources/api/cassandra/cluster.rst.txt new file mode 100644 index 0000000000..a9a9d378a4 --- /dev/null +++ b/stable/_sources/api/cassandra/cluster.rst.txt @@ -0,0 +1,228 @@ +``cassandra.cluster`` - Clusters and Sessions +============================================= + +.. module:: cassandra.cluster + +.. autoclass:: Cluster ([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs) + + .. autoattribute:: contact_points + + .. autoattribute:: port + + .. autoattribute:: cql_version + + .. autoattribute:: protocol_version + + .. autoattribute:: compression + + .. autoattribute:: auth_provider + + .. autoattribute:: load_balancing_policy + + .. autoattribute:: reconnection_policy + + .. autoattribute:: default_retry_policy + :annotation: = + + .. autoattribute:: conviction_policy_factory + + .. autoattribute:: address_translator + + .. autoattribute:: metrics_enabled + + .. autoattribute:: metrics + + .. autoattribute:: ssl_context + + .. autoattribute:: ssl_options + + .. autoattribute:: sockopts + + .. autoattribute:: max_schema_agreement_wait + + .. autoattribute:: metadata + + .. autoattribute:: connection_class + + .. autoattribute:: control_connection_timeout + + .. autoattribute:: idle_heartbeat_interval + + .. autoattribute:: idle_heartbeat_timeout + + .. autoattribute:: schema_event_refresh_window + + .. autoattribute:: topology_event_refresh_window + + .. autoattribute:: status_event_refresh_window + + .. autoattribute:: prepare_on_all_hosts + + .. autoattribute:: reprepare_on_up + + .. autoattribute:: connect_timeout + + .. autoattribute:: schema_metadata_enabled + :annotation: = True + + .. autoattribute:: token_metadata_enabled + :annotation: = True + + .. autoattribute:: timestamp_generator + + .. autoattribute:: endpoint_factory + + .. autoattribute:: cloud + + .. automethod:: connect + + .. automethod:: shutdown + + .. automethod:: register_user_type + + .. automethod:: register_listener + + .. automethod:: unregister_listener + + .. automethod:: add_execution_profile + + .. automethod:: set_max_requests_per_connection + + .. automethod:: get_max_requests_per_connection + + .. automethod:: set_min_requests_per_connection + + .. automethod:: get_min_requests_per_connection + + .. automethod:: get_core_connections_per_host + + .. automethod:: set_core_connections_per_host + + .. automethod:: get_max_connections_per_host + + .. automethod:: set_max_connections_per_host + + .. automethod:: get_control_connection_host + + .. automethod:: refresh_schema_metadata + + .. automethod:: refresh_keyspace_metadata + + .. automethod:: refresh_table_metadata + + .. automethod:: refresh_user_type_metadata + + .. automethod:: refresh_user_function_metadata + + .. automethod:: refresh_user_aggregate_metadata + + .. automethod:: refresh_nodes + + .. automethod:: set_meta_refresh_enabled + +.. autoclass:: ExecutionProfile (load_balancing_policy=, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=, speculative_execution_policy=None) + :members: + :exclude-members: consistency_level + + .. autoattribute:: consistency_level + :annotation: = LOCAL_ONE + +.. autoclass:: GraphExecutionProfile (load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET) + :members: + +.. autoclass:: GraphAnalyticsExecutionProfile (load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None) + :members: + +.. autodata:: EXEC_PROFILE_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT + :annotation: + +.. autodata:: EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT + :annotation: + +.. autoclass:: Session () + + .. autoattribute:: default_timeout + :annotation: = 10.0 + + .. autoattribute:: default_consistency_level + :annotation: = LOCAL_ONE + + .. autoattribute:: default_serial_consistency_level + :annotation: = None + + .. autoattribute:: row_factory + :annotation: = + + .. autoattribute:: default_fetch_size + + .. autoattribute:: use_client_timestamp + + .. autoattribute:: timestamp_generator + + .. autoattribute:: encoder + + .. autoattribute:: client_protocol_handler + + .. automethod:: execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as]) + + .. automethod:: execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as]) + + .. automethod:: prepare(statement) + + .. automethod:: shutdown() + + .. automethod:: set_keyspace(keyspace) + + .. automethod:: get_execution_profile + + .. automethod:: execution_profile_clone_update + + .. automethod:: add_request_init_listener + + .. automethod:: remove_request_init_listener + +.. autoclass:: ResponseFuture () + + .. autoattribute:: query + + .. automethod:: result() + + .. automethod:: get_query_trace() + + .. automethod:: get_all_query_traces() + + .. autoattribute:: custom_payload() + + .. autoattribute:: is_schema_agreed + + .. autoattribute:: has_more_pages + + .. autoattribute:: warnings + + .. automethod:: start_fetching_next_page() + + .. automethod:: add_callback(fn, *args, **kwargs) + + .. automethod:: add_errback(fn, *args, **kwargs) + + .. automethod:: add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_kwargs=None) + +.. autoclass:: ResultSet () + :members: + +.. autoexception:: QueryExhausted () + +.. autoexception:: NoHostAvailable () + :members: + +.. autoexception:: UserTypeDoesNotExist () diff --git a/stable/_sources/api/cassandra/concurrent.rst.txt b/stable/_sources/api/cassandra/concurrent.rst.txt new file mode 100644 index 0000000000..f4bab6f048 --- /dev/null +++ b/stable/_sources/api/cassandra/concurrent.rst.txt @@ -0,0 +1,8 @@ +``cassandra.concurrent`` - Utilities for Concurrent Statement Execution +======================================================================= + +.. module:: cassandra.concurrent + +.. autofunction:: execute_concurrent + +.. autofunction:: execute_concurrent_with_args diff --git a/stable/_sources/api/cassandra/connection.rst.txt b/stable/_sources/api/cassandra/connection.rst.txt new file mode 100644 index 0000000000..32cca590c0 --- /dev/null +++ b/stable/_sources/api/cassandra/connection.rst.txt @@ -0,0 +1,21 @@ +``cassandra.connection`` - Low Level Connection Info +==================================================== + +.. module:: cassandra.connection + +.. autoexception:: ConnectionException () +.. autoexception:: ConnectionShutdown () +.. autoexception:: ConnectionBusy () +.. autoexception:: ProtocolError () + +.. autoclass:: EndPoint + :members: + +.. autoclass:: EndPointFactory + :members: + +.. autoclass:: SniEndPoint + +.. autoclass:: SniEndPointFactory + +.. autoclass:: UnixSocketEndPoint diff --git a/stable/_sources/api/cassandra/cqlengine/columns.rst.txt b/stable/_sources/api/cassandra/cqlengine/columns.rst.txt new file mode 100644 index 0000000000..d44be8adb8 --- /dev/null +++ b/stable/_sources/api/cassandra/cqlengine/columns.rst.txt @@ -0,0 +1,89 @@ +``cassandra.cqlengine.columns`` - Column types for object mapping models +======================================================================== + +.. module:: cassandra.cqlengine.columns + +Columns +------- + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. + +Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Each column on your model definitions needs to be an instance of a Column class. + +.. autoclass:: Column(**kwargs) + + .. autoattribute:: primary_key + + .. autoattribute:: partition_key + + .. autoattribute:: index + + .. autoattribute:: custom_index + + .. autoattribute:: db_field + + .. autoattribute:: default + + .. autoattribute:: required + + .. autoattribute:: clustering_order + + .. autoattribute:: discriminator_column + + .. autoattribute:: static + +Column Types +------------ + +Columns of all types are initialized by passing :class:`.Column` attributes to the constructor by keyword. + +.. autoclass:: Ascii(**kwargs) + +.. autoclass:: BigInt(**kwargs) + +.. autoclass:: Blob(**kwargs) + +.. autoclass:: Bytes(**kwargs) + +.. autoclass:: Boolean(**kwargs) + +.. autoclass:: Counter + +.. autoclass:: Date(**kwargs) + +.. autoclass:: DateTime(**kwargs) + + .. autoattribute:: truncate_microseconds + +.. autoclass:: Decimal(**kwargs) + +.. autoclass:: Double(**kwargs) + +.. autoclass:: Float + +.. autoclass:: Integer(**kwargs) + +.. autoclass:: List + +.. autoclass:: Map + +.. autoclass:: Set + +.. autoclass:: SmallInt(**kwargs) + +.. autoclass:: Text + +.. autoclass:: Time(**kwargs) + +.. autoclass:: TimeUUID(**kwargs) + +.. autoclass:: TinyInt(**kwargs) + +.. autoclass:: UserDefinedType + +.. autoclass:: UUID(**kwargs) + +.. autoclass:: VarInt(**kwargs) diff --git a/stable/_sources/api/cassandra/cqlengine/connection.rst.txt b/stable/_sources/api/cassandra/cqlengine/connection.rst.txt new file mode 100644 index 0000000000..0f584fcca2 --- /dev/null +++ b/stable/_sources/api/cassandra/cqlengine/connection.rst.txt @@ -0,0 +1,16 @@ +``cassandra.cqlengine.connection`` - Connection management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.connection + +.. autofunction:: default + +.. autofunction:: set_session + +.. autofunction:: setup + +.. autofunction:: register_connection + +.. autofunction:: unregister_connection + +.. autofunction:: set_default_connection diff --git a/stable/_sources/api/cassandra/cqlengine/management.rst.txt b/stable/_sources/api/cassandra/cqlengine/management.rst.txt new file mode 100644 index 0000000000..fb483abc81 --- /dev/null +++ b/stable/_sources/api/cassandra/cqlengine/management.rst.txt @@ -0,0 +1,19 @@ +``cassandra.cqlengine.management`` - Schema management for cqlengine +======================================================================== + +.. module:: cassandra.cqlengine.management + +A collection of functions for managing keyspace and table schema. + +.. autofunction:: create_keyspace_simple + +.. autofunction:: create_keyspace_network_topology + +.. autofunction:: drop_keyspace + +.. autofunction:: sync_table + +.. autofunction:: sync_type + +.. autofunction:: drop_table + diff --git a/stable/_sources/api/cassandra/cqlengine/models.rst.txt b/stable/_sources/api/cassandra/cqlengine/models.rst.txt new file mode 100644 index 0000000000..60b1471184 --- /dev/null +++ b/stable/_sources/api/cassandra/cqlengine/models.rst.txt @@ -0,0 +1,197 @@ +``cassandra.cqlengine.models`` - Table models for object mapping +================================================================ + +.. module:: cassandra.cqlengine.models + +Model +----- +.. autoclass:: Model(\*\*kwargs) + + The initializer creates an instance of the model. Pass in keyword arguments for columns you've defined on the model. + + .. code-block:: python + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + person = Person(first_name='Blake', last_name='Eggleston') + person.first_name #returns 'Blake' + person.last_name #returns 'Eggleston' + + Model attributes define how the model maps to tables in the database. These are class variables that should be set + when defining Model deriviatives. + + .. autoattribute:: __abstract__ + :annotation: = False + + .. autoattribute:: __table_name__ + + .. autoattribute:: __table_name_case_sensitive__ + + .. autoattribute:: __keyspace__ + + .. autoattribute:: __connection__ + + .. attribute:: __default_ttl__ + :annotation: = None + + Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details. + + .. autoattribute:: __discriminator_value__ + + See :ref:`model_inheritance` for usage examples. + + Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in + the server. To override defaults, set options using the model ``__options__`` attribute, which allows options specified a dict. + + When a table is synced, it will be altered to match the options set on your table. + This means that if you are changing settings manually they will be changed back on resync. + + Do not use the options settings of cqlengine if you want to manage your compaction settings manually. + + See the `list of supported table properties for more information + `_. + + .. attribute:: __options__ + + For example: + + .. code-block:: python + + class User(Model): + __options__ = {'compaction': {'class': 'LeveledCompactionStrategy', + 'sstable_size_in_mb': '64', + 'tombstone_threshold': '.2'}, + 'comment': 'User data stored here'} + + user_id = columns.UUID(primary_key=True) + name = columns.Text() + + or : + + .. code-block:: python + + class TimeData(Model): + __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy', + 'bucket_low': '.3', + 'bucket_high': '2', + 'min_threshold': '2', + 'max_threshold': '64', + 'tombstone_compaction_interval': '86400'}, + 'gc_grace_seconds': '0'} + + .. autoattribute:: __compute_routing_key__ + + + The base methods allow creating, storing, and querying modeled objects. + + .. automethod:: create + + .. method:: if_not_exists() + + Check the existence of an object before insertion. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111') + except LWTException as e: + # handle failure case + print e.existing # dict containing LWT result fields + + This method is supported on Cassandra 2.0 or later. + + .. method:: if_exists() + + Check the existence of an object before an update or delete. The existence of an + object is determined by its primary key(s). And please note using this flag + would incur performance cost. + + If the update or delete isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + try: + TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111') + except LWTException as e: + # handle failure case + pass + + This method is supported on Cassandra 2.0 or later. + + .. automethod:: save + + .. automethod:: update + + .. method:: iff(**values) + + Checks to ensure that the values specified are correct on the Cassandra cluster. + Simply specify the column(s) and the expected value(s). As with if_not_exists, + this incurs a performance cost. + + If the insertion isn't applied, a :class:`~cassandra.cqlengine.query.LWTException` is raised. + + .. code-block:: python + + t = TestTransactionModel(text='some text', count=5) + try: + t.iff(count=5).update('other text') + except LWTException as e: + # handle failure case + print e.existing # existing object + + .. automethod:: get + + .. automethod:: filter + + .. automethod:: all + + .. automethod:: delete + + .. method:: batch(batch_object) + + Sets the batch object to run instance updates and inserts queries with. + + See :doc:`/cqlengine/batches` for usage examples + + .. automethod:: timeout + + .. method:: timestamp(timedelta_or_datetime) + + Sets the timestamp for the query + + .. method:: ttl(ttl_in_sec) + + Sets the ttl values to run instance updates and inserts queries with. + + .. method:: using(connection=None) + + Change the context on the fly of the model instance (keyspace, connection) + + .. automethod:: column_family_name + + Models also support dict-like access: + + .. method:: len(m) + + Returns the number of columns defined in the model + + .. method:: m[col_name] + + Returns the value of column ``col_name`` + + .. method:: m[col_name] = value + + Set ``m[col_name]`` to value + + .. automethod:: keys + + .. automethod:: values + + .. automethod:: items diff --git a/stable/_sources/api/cassandra/cqlengine/query.rst.txt b/stable/_sources/api/cassandra/cqlengine/query.rst.txt new file mode 100644 index 0000000000..ce8f764b6b --- /dev/null +++ b/stable/_sources/api/cassandra/cqlengine/query.rst.txt @@ -0,0 +1,71 @@ +``cassandra.cqlengine.query`` - Query and filter model objects +================================================================= + +.. module:: cassandra.cqlengine.query + +QuerySet +-------- +QuerySet objects are typically obtained by calling :meth:`~.cassandra.cqlengine.models.Model.objects` on a model class. +The methods here are used to filter, order, and constrain results. + +.. autoclass:: ModelQuerySet + + .. automethod:: all + + .. automethod:: batch + + .. automethod:: consistency + + .. automethod:: count + + .. method:: len(queryset) + + Returns the number of rows matched by this query. This function uses :meth:`~.cassandra.cqlengine.query.ModelQuerySet.count` internally. + + *Note: This function executes a SELECT COUNT() and has a performance cost on large datasets* + + .. automethod:: distinct + + .. automethod:: filter + + .. automethod:: get + + .. automethod:: limit + + .. automethod:: fetch_size + + .. automethod:: if_not_exists + + .. automethod:: if_exists + + .. automethod:: order_by + + .. automethod:: allow_filtering + + .. automethod:: only + + .. automethod:: defer + + .. automethod:: timestamp + + .. automethod:: ttl + + .. automethod:: using + + .. _blind_updates: + + .. automethod:: update + +.. autoclass:: BatchQuery + :members: + + .. automethod:: add_query + .. automethod:: execute + +.. autoclass:: ContextQuery + +.. autoclass:: DoesNotExist + +.. autoclass:: MultipleObjectsReturned + +.. autoclass:: LWTException diff --git a/stable/_sources/api/cassandra/cqlengine/usertype.rst.txt b/stable/_sources/api/cassandra/cqlengine/usertype.rst.txt new file mode 100644 index 0000000000..ebed187da9 --- /dev/null +++ b/stable/_sources/api/cassandra/cqlengine/usertype.rst.txt @@ -0,0 +1,10 @@ +``cassandra.cqlengine.usertype`` - Model classes for User Defined Types +======================================================================= + +.. module:: cassandra.cqlengine.usertype + +UserType +-------- +.. autoclass:: UserType + + .. autoattribute:: __type_name__ diff --git a/stable/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt b/stable/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt new file mode 100644 index 0000000000..5547e0fdd7 --- /dev/null +++ b/stable/_sources/api/cassandra/datastax/graph/fluent/index.rst.txt @@ -0,0 +1,24 @@ +:mod:`cassandra.datastax.graph.fluent` +====================================== + +.. module:: cassandra.datastax.graph.fluent + +.. autoclass:: DseGraph + + .. autoattribute:: DSE_GRAPH_QUERY_LANGUAGE + + .. automethod:: create_execution_profile + + .. automethod:: query_from_traversal + + .. automethod:: traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None) + + .. automethod:: batch(session=None, execution_profile=None) + +.. autoclass:: DSESessionRemoteGraphConnection(session[, graph_name, execution_profile]) + +.. autoclass:: BaseGraphRowFactory + +.. autoclass:: graph_traversal_row_factory + +.. autoclass:: graph_traversal_dse_object_row_factory diff --git a/stable/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt b/stable/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt new file mode 100644 index 0000000000..f6e86f6451 --- /dev/null +++ b/stable/_sources/api/cassandra/datastax/graph/fluent/predicates.rst.txt @@ -0,0 +1,14 @@ +:mod:`cassandra.datastax.graph.fluent.predicates` +================================================= + +.. module:: cassandra.datastax.graph.fluent.predicates + + +.. autoclass:: Search + :members: + +.. autoclass:: CqlCollection + :members: + +.. autoclass:: Geo + :members: diff --git a/stable/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt b/stable/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt new file mode 100644 index 0000000000..3dd859f96e --- /dev/null +++ b/stable/_sources/api/cassandra/datastax/graph/fluent/query.rst.txt @@ -0,0 +1,8 @@ +:mod:`cassandra.datastax.graph.fluent.query` +============================================ + +.. module:: cassandra.datastax.graph.fluent.query + + +.. autoclass:: TraversalBatch + :members: diff --git a/stable/_sources/api/cassandra/datastax/graph/index.rst.txt b/stable/_sources/api/cassandra/datastax/graph/index.rst.txt new file mode 100644 index 0000000000..a9b41cbdc2 --- /dev/null +++ b/stable/_sources/api/cassandra/datastax/graph/index.rst.txt @@ -0,0 +1,133 @@ +``cassandra.datastax.graph`` - Graph Statements, Options, and Row Factories +=========================================================================== + +.. _api-datastax-graph: + +.. module:: cassandra.datastax.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + :noindex: + +.. autoclass:: GraphOptions + :noindex: + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + :noindex: + +.. autoclass:: Result + :members: + :noindex: + +.. autoclass:: Vertex + :members: + :noindex: + +.. autoclass:: VertexProperty + :members: + :noindex: + +.. autoclass:: Edge + :members: + :noindex: + +.. autoclass:: Path + :members: + :noindex: + +.. autoclass:: T + :members: + :noindex: + +.. autoclass:: GraphSON1Serializer + :members: + :noindex: + +.. autoclass:: GraphSON1Deserializer + :noindex: + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + :noindex: diff --git a/stable/_sources/api/cassandra/decoder.rst.txt b/stable/_sources/api/cassandra/decoder.rst.txt new file mode 100644 index 0000000000..e213cc6d74 --- /dev/null +++ b/stable/_sources/api/cassandra/decoder.rst.txt @@ -0,0 +1,20 @@ +``cassandra.decoder`` - Data Return Formats +=========================================== + +.. module:: cassandra.decoder + +.. function:: tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.tuple_factory` + +.. function:: named_tuple_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.named_tuple_factory` + +.. function:: dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.dict_factory` + +.. function:: ordered_dict_factory + + **Deprecated in 2.0.0.** Use :meth:`cassandra.query.ordered_dict_factory` diff --git a/stable/_sources/api/cassandra/encoder.rst.txt b/stable/_sources/api/cassandra/encoder.rst.txt new file mode 100644 index 0000000000..de3b180510 --- /dev/null +++ b/stable/_sources/api/cassandra/encoder.rst.txt @@ -0,0 +1,36 @@ +``cassandra.encoder`` - Encoders for non-prepared Statements +============================================================ + +.. module:: cassandra.encoder + +.. autoclass:: Encoder () + + .. autoattribute:: cassandra.encoder.Encoder.mapping + + .. automethod:: cassandra.encoder.Encoder.cql_encode_none () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_object () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_all_types () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_sequence () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_str () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_unicode () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_bytes () + + Converts strings, buffers, and bytearrays into CQL blob literals. + + .. automethod:: cassandra.encoder.Encoder.cql_encode_datetime () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_date () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_map_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_list_collection () + + .. automethod:: cassandra.encoder.Encoder.cql_encode_set_collection () + + .. automethod:: cql_encode_tuple () diff --git a/stable/_sources/api/cassandra/graph.rst.txt b/stable/_sources/api/cassandra/graph.rst.txt new file mode 100644 index 0000000000..43ddd3086c --- /dev/null +++ b/stable/_sources/api/cassandra/graph.rst.txt @@ -0,0 +1,121 @@ +``cassandra.graph`` - Graph Statements, Options, and Row Factories +================================================================== + +.. note:: This module is only for backward compatibility for dse-driver users. Consider using :ref:`cassandra.datastax.graph `. + +.. module:: cassandra.graph + +.. autofunction:: single_object_row_factory + +.. autofunction:: graph_result_row_factory + +.. autofunction:: graph_object_row_factory + +.. autofunction:: graph_graphson2_row_factory + +.. autofunction:: graph_graphson3_row_factory + +.. function:: to_int(value) + + Wraps a value to be explicitly serialized as a graphson Int. + +.. function:: to_bigint(value) + + Wraps a value to be explicitly serialized as a graphson Bigint. + +.. function:: to_smallint(value) + + Wraps a value to be explicitly serialized as a graphson Smallint. + +.. function:: to_float(value) + + Wraps a value to be explicitly serialized as a graphson Float. + +.. function:: to_double(value) + + Wraps a value to be explicitly serialized as a graphson Double. + +.. autoclass:: GraphProtocol + :members: + +.. autoclass:: GraphOptions + + .. autoattribute:: graph_name + + .. autoattribute:: graph_source + + .. autoattribute:: graph_language + + .. autoattribute:: graph_read_consistency_level + + .. autoattribute:: graph_write_consistency_level + + .. autoattribute:: is_default_source + + .. autoattribute:: is_analytics_source + + .. autoattribute:: is_graph_source + + .. automethod:: set_source_default + + .. automethod:: set_source_analytics + + .. automethod:: set_source_graph + + +.. autoclass:: SimpleGraphStatement + :members: + +.. autoclass:: Result + :members: + +.. autoclass:: Vertex + :members: + +.. autoclass:: VertexProperty + :members: + +.. autoclass:: Edge + :members: + +.. autoclass:: Path + :members: + +.. autoclass:: GraphSON1Serializer + :members: + +.. autoclass:: GraphSON1Deserializer + + .. automethod:: deserialize_date + + .. automethod:: deserialize_timestamp + + .. automethod:: deserialize_time + + .. automethod:: deserialize_duration + + .. automethod:: deserialize_int + + .. automethod:: deserialize_bigint + + .. automethod:: deserialize_double + + .. automethod:: deserialize_float + + .. automethod:: deserialize_uuid + + .. automethod:: deserialize_blob + + .. automethod:: deserialize_decimal + + .. automethod:: deserialize_point + + .. automethod:: deserialize_linestring + + .. automethod:: deserialize_polygon + +.. autoclass:: GraphSON2Reader + :members: + +.. autoclass:: GraphSON3Reader + :members: diff --git a/stable/_sources/api/cassandra/io/asyncioreactor.rst.txt b/stable/_sources/api/cassandra/io/asyncioreactor.rst.txt new file mode 100644 index 0000000000..38ae63ca7f --- /dev/null +++ b/stable/_sources/api/cassandra/io/asyncioreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncioreactor`` - ``asyncio`` Event Loop +===================================================================== + +.. module:: cassandra.io.asyncioreactor + +.. autoclass:: AsyncioConnection + :members: diff --git a/stable/_sources/api/cassandra/io/asyncorereactor.rst.txt b/stable/_sources/api/cassandra/io/asyncorereactor.rst.txt new file mode 100644 index 0000000000..ade7887e70 --- /dev/null +++ b/stable/_sources/api/cassandra/io/asyncorereactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.asyncorereactor`` - ``asyncore`` Event Loop +========================================================== + +.. module:: cassandra.io.asyncorereactor + +.. autoclass:: AsyncoreConnection + :members: diff --git a/stable/_sources/api/cassandra/io/eventletreactor.rst.txt b/stable/_sources/api/cassandra/io/eventletreactor.rst.txt new file mode 100644 index 0000000000..1ba742c7e9 --- /dev/null +++ b/stable/_sources/api/cassandra/io/eventletreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.eventletreactor`` - ``eventlet``-compatible Connection +===================================================================== + +.. module:: cassandra.io.eventletreactor + +.. autoclass:: EventletConnection + :members: diff --git a/stable/_sources/api/cassandra/io/geventreactor.rst.txt b/stable/_sources/api/cassandra/io/geventreactor.rst.txt new file mode 100644 index 0000000000..603affe140 --- /dev/null +++ b/stable/_sources/api/cassandra/io/geventreactor.rst.txt @@ -0,0 +1,7 @@ +``cassandra.io.geventreactor`` - ``gevent``-compatible Event Loop +================================================================= + +.. module:: cassandra.io.geventreactor + +.. autoclass:: GeventConnection + :members: diff --git a/stable/_sources/api/cassandra/io/libevreactor.rst.txt b/stable/_sources/api/cassandra/io/libevreactor.rst.txt new file mode 100644 index 0000000000..5b7288edf2 --- /dev/null +++ b/stable/_sources/api/cassandra/io/libevreactor.rst.txt @@ -0,0 +1,6 @@ +``cassandra.io.libevreactor`` - ``libev`` Event Loop +==================================================== + +.. module:: cassandra.io.libevreactor + +.. autoclass:: LibevConnection diff --git a/stable/_sources/api/cassandra/io/twistedreactor.rst.txt b/stable/_sources/api/cassandra/io/twistedreactor.rst.txt new file mode 100644 index 0000000000..24e93bd432 --- /dev/null +++ b/stable/_sources/api/cassandra/io/twistedreactor.rst.txt @@ -0,0 +1,9 @@ +``cassandra.io.twistedreactor`` - Twisted Event Loop +==================================================== + +.. module:: cassandra.io.twistedreactor + +.. class:: TwistedConnection + + An implementation of :class:`~cassandra.io.connection.Connection` that uses + Twisted's reactor as its event loop. diff --git a/stable/_sources/api/cassandra/metadata.rst.txt b/stable/_sources/api/cassandra/metadata.rst.txt new file mode 100644 index 0000000000..7c1280bcf7 --- /dev/null +++ b/stable/_sources/api/cassandra/metadata.rst.txt @@ -0,0 +1,93 @@ +``cassandra.metadata`` - Schema and Ring Topology +================================================= + +.. module:: cassandra.metadata + +.. autodata:: cql_keywords + :annotation: + +.. autodata:: cql_keywords_unreserved + :annotation: + +.. autodata:: cql_keywords_reserved + :annotation: + +.. autoclass:: Metadata () + :members: + :exclude-members: rebuild_schema, rebuild_token_map, add_host, remove_host + +Schemas +------- + +.. autoclass:: KeyspaceMetadata () + :members: + +.. autoclass:: UserType () + :members: + +.. autoclass:: Function () + :members: + +.. autoclass:: Aggregate () + :members: + +.. autoclass:: TableMetadata () + :members: + +.. autoclass:: TableMetadataV3 () + :members: + +.. autoclass:: TableMetadataDSE68 () + :members: + +.. autoclass:: ColumnMetadata () + :members: + +.. autoclass:: IndexMetadata () + :members: + +.. autoclass:: MaterializedViewMetadata () + :members: + +.. autoclass:: VertexMetadata () + :members: + +.. autoclass:: EdgeMetadata () + :members: + +Tokens and Ring Topology +------------------------ + +.. autoclass:: TokenMap () + :members: + +.. autoclass:: Token () + :members: + +.. autoclass:: Murmur3Token + :members: + +.. autoclass:: MD5Token + :members: + +.. autoclass:: BytesToken + :members: + +.. autoclass:: ReplicationStrategy + :members: + +.. autoclass:: ReplicationFactor + :members: + :exclude-members: create + +.. autoclass:: SimpleStrategy + :members: + +.. autoclass:: NetworkTopologyStrategy + :members: + +.. autoclass:: LocalStrategy + :members: + +.. autofunction:: group_keys_by_replica + diff --git a/stable/_sources/api/cassandra/metrics.rst.txt b/stable/_sources/api/cassandra/metrics.rst.txt new file mode 100644 index 0000000000..0df7f8b5b9 --- /dev/null +++ b/stable/_sources/api/cassandra/metrics.rst.txt @@ -0,0 +1,7 @@ +``cassandra.metrics`` - Performance Metrics +=========================================== + +.. module:: cassandra.metrics + +.. autoclass:: cassandra.metrics.Metrics () + :members: diff --git a/stable/_sources/api/cassandra/policies.rst.txt b/stable/_sources/api/cassandra/policies.rst.txt new file mode 100644 index 0000000000..387b19ed95 --- /dev/null +++ b/stable/_sources/api/cassandra/policies.rst.txt @@ -0,0 +1,96 @@ +``cassandra.policies`` - Load balancing and Failure Handling Policies +===================================================================== + +.. module:: cassandra.policies + +Load Balancing +-------------- + +.. autoclass:: HostDistance + :members: + +.. autoclass:: LoadBalancingPolicy + :members: + +.. autoclass:: RoundRobinPolicy + :members: + +.. autoclass:: DCAwareRoundRobinPolicy + :members: + +.. autoclass:: WhiteListRoundRobinPolicy + :members: + +.. autoclass:: TokenAwarePolicy + :members: + +.. autoclass:: HostFilterPolicy + + .. we document these methods manually so we can specify a param to predicate + + .. automethod:: predicate(host) + .. automethod:: distance + .. automethod:: make_query_plan + +.. autoclass:: DefaultLoadBalancingPolicy + :members: + +.. autoclass:: DSELoadBalancingPolicy + :members: + +Translating Server Node Addresses +--------------------------------- + +.. autoclass:: AddressTranslator + :members: + +.. autoclass:: IdentityTranslator + :members: + +.. autoclass:: EC2MultiRegionTranslator + :members: + +Marking Hosts Up or Down +------------------------ + +.. autoclass:: ConvictionPolicy + :members: + +.. autoclass:: SimpleConvictionPolicy + :members: + +Reconnecting to Dead Hosts +-------------------------- + +.. autoclass:: ReconnectionPolicy + :members: + +.. autoclass:: ConstantReconnectionPolicy + :members: + +.. autoclass:: ExponentialReconnectionPolicy + :members: + +Retrying Failed Operations +-------------------------- + +.. autoclass:: WriteType + :members: + +.. autoclass:: RetryPolicy + :members: + +.. autoclass:: FallthroughRetryPolicy + :members: + +.. autoclass:: DowngradingConsistencyRetryPolicy + :members: + +Retrying Idempotent Operations +------------------------------ + +.. autoclass:: SpeculativeExecutionPolicy + :members: + +.. autoclass:: ConstantSpeculativeExecutionPolicy + :members: diff --git a/stable/_sources/api/cassandra/pool.rst.txt b/stable/_sources/api/cassandra/pool.rst.txt new file mode 100644 index 0000000000..b14d30e19c --- /dev/null +++ b/stable/_sources/api/cassandra/pool.rst.txt @@ -0,0 +1,11 @@ +``cassandra.pool`` - Hosts and Connection Pools +=============================================== + +.. automodule:: cassandra.pool + +.. autoclass:: Host () + :members: + :exclude-members: set_location_info, get_and_set_reconnection_handler + +.. autoexception:: NoConnectionsAvailable + :members: diff --git a/stable/_sources/api/cassandra/protocol.rst.txt b/stable/_sources/api/cassandra/protocol.rst.txt new file mode 100644 index 0000000000..f615ab1a70 --- /dev/null +++ b/stable/_sources/api/cassandra/protocol.rst.txt @@ -0,0 +1,55 @@ +``cassandra.protocol`` - Protocol Features +===================================================================== + +.. module:: cassandra.protocol + +.. _custom_payload: + +Custom Payloads +--------------- +Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs. + +By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler. + +See :meth:`.Session.execute`, ::meth:`.Session.execute_async`, :attr:`.ResponseFuture.custom_payload`. + +.. autoclass:: _ProtocolHandler + + .. autoattribute:: message_types_by_opcode + :annotation: = {default mapping} + + .. automethod:: encode_message + + .. automethod:: decode_message + +.. _faster_deser: + +Faster Deserialization +---------------------- +When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: ``LazyProtocolHandler`` +and ``NumpyProtocolHandler``. They can be used as follows: + +.. code:: python + + from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler + from cassandra.query import tuple_factory + s.client_protocol_handler = LazyProtocolHandler # for a result iterator + s.row_factory = tuple_factory #required for Numpy results + s.client_protocol_handler = NumpyProtocolHandler # for a dict of NumPy arrays as result + +These protocol handlers comprise different parsers, and return results as described below: + +- ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. + The rows are all parsed upfront, before results are returned. + +- LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, + lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once) + +- NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with + analysis toolkits such as Pandas. diff --git a/stable/_sources/api/cassandra/query.rst.txt b/stable/_sources/api/cassandra/query.rst.txt new file mode 100644 index 0000000000..fcd79739b9 --- /dev/null +++ b/stable/_sources/api/cassandra/query.rst.txt @@ -0,0 +1,59 @@ +``cassandra.query`` - Prepared Statements, Batch Statements, Tracing, and Row Factories +======================================================================================= + +.. module:: cassandra.query + +.. autofunction:: tuple_factory + +.. autofunction:: named_tuple_factory + +.. autofunction:: dict_factory + +.. autofunction:: ordered_dict_factory + +.. autoclass:: SimpleStatement + :members: + +.. autoclass:: PreparedStatement () + :members: + +.. autoclass:: BoundStatement + :members: + +.. autoclass:: Statement () + :members: + +.. autodata:: UNSET_VALUE + :annotation: + +.. autoclass:: BatchStatement (batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None) + :members: + +.. autoclass:: BatchType () + + .. autoattribute:: LOGGED + + .. autoattribute:: UNLOGGED + + .. autoattribute:: COUNTER + +.. autoclass:: cassandra.query.ValueSequence + + A wrapper class that is used to specify that a sequence of values should + be treated as a CQL list of values instead of a single column collection when used + as part of the `parameters` argument for :meth:`.Session.execute()`. + + This is typically needed when supplying a list of keys to select. + For example:: + + >>> my_user_ids = ('alice', 'bob', 'charles') + >>> query = "SELECT * FROM users WHERE user_id IN %s" + >>> session.execute(query, parameters=[ValueSequence(my_user_ids)]) + +.. autoclass:: QueryTrace () + :members: + +.. autoclass:: TraceEvent () + :members: + +.. autoexception:: TraceUnavailable diff --git a/stable/_sources/api/cassandra/timestamps.rst.txt b/stable/_sources/api/cassandra/timestamps.rst.txt new file mode 100644 index 0000000000..00d25b06d9 --- /dev/null +++ b/stable/_sources/api/cassandra/timestamps.rst.txt @@ -0,0 +1,14 @@ +``cassandra.timestamps`` - Timestamp Generation +=============================================== + +.. module:: cassandra.timestamps + +.. autoclass:: MonotonicTimestampGenerator (warn_on_drift=True, warning_threshold=0, warning_interval=0) + + .. autoattribute:: warn_on_drift + + .. autoattribute:: warning_threshold + + .. autoattribute:: warning_interval + + .. automethod:: _next_timestamp diff --git a/stable/_sources/api/cassandra/util.rst.txt b/stable/_sources/api/cassandra/util.rst.txt new file mode 100644 index 0000000000..848d4d5fc2 --- /dev/null +++ b/stable/_sources/api/cassandra/util.rst.txt @@ -0,0 +1,5 @@ +``cassandra.util`` - Utilities +=================================== + +.. automodule:: cassandra.util + :members: diff --git a/stable/_sources/api/index.rst.txt b/stable/_sources/api/index.rst.txt new file mode 100644 index 0000000000..9e778d508c --- /dev/null +++ b/stable/_sources/api/index.rst.txt @@ -0,0 +1,54 @@ +API Documentation +================= + +Core Driver +----------- +.. toctree:: + :maxdepth: 2 + + cassandra + cassandra/cluster + cassandra/policies + cassandra/auth + cassandra/graph + cassandra/metadata + cassandra/metrics + cassandra/query + cassandra/pool + cassandra/protocol + cassandra/encoder + cassandra/decoder + cassandra/concurrent + cassandra/connection + cassandra/util + cassandra/timestamps + cassandra/io/asyncioreactor + cassandra/io/asyncorereactor + cassandra/io/eventletreactor + cassandra/io/libevreactor + cassandra/io/geventreactor + cassandra/io/twistedreactor + +.. _om_api: + +Object Mapper +------------- +.. toctree:: + :maxdepth: 1 + + cassandra/cqlengine/models + cassandra/cqlengine/columns + cassandra/cqlengine/query + cassandra/cqlengine/connection + cassandra/cqlengine/management + cassandra/cqlengine/usertype + +DataStax Graph +-------------- +.. toctree:: + :maxdepth: 1 + + cassandra/datastax/graph/index + cassandra/datastax/graph/fluent/index + cassandra/datastax/graph/fluent/query + cassandra/datastax/graph/fluent/predicates diff --git a/stable/_sources/cqlengine/batches.rst.txt b/stable/_sources/cqlengine/batches.rst.txt new file mode 100644 index 0000000000..306e7d01a6 --- /dev/null +++ b/stable/_sources/cqlengine/batches.rst.txt @@ -0,0 +1,108 @@ +============= +Batch Queries +============= + +cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object. + + +Batch Query General Use Pattern +=============================== + +You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail. + +.. code-block:: python + + from cassandra.cqlengine.query import BatchQuery + + #using a context manager + with BatchQuery() as b: + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + + # -- or -- + + #manually + b = BatchQuery() + now = datetime.now() + em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now) + em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now) + em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now) + b.execute() + + # updating in a batch + + b = BatchQuery() + em1.description = "new description" + em1.batch(b).save() + em2.description = "another new description" + em2.batch(b).save() + b.execute() + + # deleting in a batch + b = BatchQuery() + ExampleModel.objects(id=some_id).batch(b).delete() + ExampleModel.objects(id=some_id2).batch(b).delete() + b.execute() + + +Typically you will not want the block to execute if an exception occurs inside the `with` block. However, in the case that this is desirable, it's achievable by using the following syntax: + +.. code-block:: python + + with BatchQuery(execute_on_exception=True) as b: + LogEntry.batch(b).create(k=1, v=1) + mystery_function() # exception thrown in here + LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch. + +If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations. + +Batch Query Execution Callbacks +=============================== + +In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes. + +Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch. + +The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run. + +.. code-block:: python + + def my_callback(*args, **kwargs): + pass + + batch = BatchQuery() + + batch.add_callback(my_callback) + batch.add_callback(my_callback, 'positional arg', named_arg='named arg value') + + # if you need reference to the batch within the callback, + # just trap it in the arguments to be passed to the callback: + batch.add_callback(my_callback, cqlengine_batch=batch) + + # once the batch executes... + batch.execute() + + # the effect of the above scheduled callbacks will be similar to + my_callback() + my_callback('positional arg', named_arg='named arg value') + my_callback(cqlengine_batch=batch) + +Failure in any of the callbacks does not affect the batch's execution, as the callbacks are started after the execution +of the batch is complete. + +Logged vs Unlogged Batches +--------------------------- +By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply: + + +.. code-block:: python + + from cassandra.cqlengine.query import BatchType + with BatchQuery(batch_type=BatchType.Unlogged) as b: + LogEntry.batch(b).create(k=1, v=1) + LogEntry.batch(b).create(k=1, v=2) diff --git a/stable/_sources/cqlengine/connections.rst.txt b/stable/_sources/cqlengine/connections.rst.txt new file mode 100644 index 0000000000..03ade27521 --- /dev/null +++ b/stable/_sources/cqlengine/connections.rst.txt @@ -0,0 +1,137 @@ +=========== +Connections +=========== + +Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager. + + +Register a new connection +========================= + +To use cqlengine, you need at least a default connection. If you initialize cqlengine's connections with with :func:`connection.setup <.connection.setup>`, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with :func:`~.connection.register_connection`: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.setup(['127.0.0.1') + connection.register_connection('cluster2', ['127.0.0.2']) + +:func:`~.connection.register_connection` can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a `session` argument if you've already created a session: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cluster import Cluster + + session = Cluster(['127.0.0.1']).connect() + connection.register_connection('cluster3', session=session) + + +Change the default connection +============================= + +You can change the default cqlengine connection on registration: + +.. code-block:: python + + from cassandra.cqlengine import connection + + connection.register_connection('cluster2', ['127.0.0.2'] default=True) + +or on the fly using :func:`~.connection.set_default_connection` + +.. code-block:: python + + connection.set_default_connection('cluster2') + +Unregister a connection +======================= + +You can unregister a connection using :func:`~.connection.unregister_connection`: + +.. code-block:: python + + connection.unregister_connection('cluster2') + +Management +========== + +When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example: + +.. code-block:: python + + from cassandra.cqlengine import management + + keyspaces = ['ks1', 'ks2'] + conns = ['cluster1', 'cluster2'] + + # registers your connections + # ... + + # create all keyspaces on all connections + for ks in keyspaces: + management.create_simple_keyspace(ks, connections=conns) + + # define your Automobile model + # ... + + # sync your models + management.sync_table(Automobile, keyspaces=keyspaces, connections=conns) + + +Connection Selection +==================== + +cqlengine will select the default connection, unless your specify a connection using one of the following methods. + +Default Model Connection +------------------------ + +You can specify a default connection per model: + +.. code-block:: python + + class Automobile(Model): + __keyspace__ = 'test' + __connection__ = 'cluster2' + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text(primary_key=True) + + print len(Automobile.objects.all()) # executed on the connection 'cluster2' + +QuerySet and model instance +--------------------------- + +You can use the :attr:`using() <.query.ModelQuerySet.using>` method to select a connection (or keyspace): + +.. code-block:: python + + Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic') + q = Automobile.objects.filter(manufacturer='Tesla') + autos = q.using(keyspace='ks2', connection='cluster2').all() + + for auto in autos: + auto.using(connection='cluster1').save() + +Context Manager +--------------- + +You can use the ContextQuery as well to select a connection: + +.. code-block:: python + + with ContextQuery(Automobile, connection='cluster1') as A: + A.objects.filter(manufacturer='honda').all() # executed on 'cluster1' + + +BatchQuery +---------- + +With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection. + +.. code-block:: python + + with BatchQuery(connection='cluster1') as b: + Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic') diff --git a/stable/_sources/cqlengine/faq.rst.txt b/stable/_sources/cqlengine/faq.rst.txt new file mode 100644 index 0000000000..6c056d02ea --- /dev/null +++ b/stable/_sources/cqlengine/faq.rst.txt @@ -0,0 +1,67 @@ +========================== +Frequently Asked Questions +========================== + +Why don't updates work correctly on models instantiated as Model(field=value, field2=value2)? +------------------------------------------------------------------------------------------------ + +The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements. + +How to preserve ordering in batch query? +------------------------------------------- + +Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used. + +* If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone) +* If timestamps are the same, and one of the columns in a tombstone ('null') - pick the tombstone +* If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value + +Below is an example to show this scenario. + +.. code-block:: python + + class MyMode(Model): + id = columns.Integer(primary_key=True) + count = columns.Integer() + text = columns.Text() + + with BatchQuery() as b: + MyModel.batch(b).create(id=1, count=2, text='123') + MyModel.batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '123' + +The largest value of count is 3, and the largest value of text would be '123'. + +The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp. + +.. code-block:: python + + with BatchQuery() as b: + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123') + MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111') + + assert MyModel.objects(id=1).first().count == 3 + assert MyModel.objects(id=1).first().text == '111' + +How can I delete individual values from a row? +------------------------------------------------- + +When inserting with CQLEngine, ``None`` is equivalent to CQL ``NULL`` or to +issuing a ``DELETE`` on that column. For example: + +.. code-block:: python + + class MyModel(Model): + id = columns.Integer(primary_key=True) + text = columns.Text() + + m = MyModel.create(id=1, text='We can delete this with None') + assert MyModel.objects(id=1).first().text is not None + + m.update(text=None) + assert MyModel.objects(id=1).first().text is None diff --git a/stable/_sources/cqlengine/models.rst.txt b/stable/_sources/cqlengine/models.rst.txt new file mode 100644 index 0000000000..c0ba390119 --- /dev/null +++ b/stable/_sources/cqlengine/models.rst.txt @@ -0,0 +1,218 @@ +====== +Models +====== + +.. module:: cqlengine.models + +A model is a python class representing a CQL table. Models derive from :class:`Model`, and +define basic table properties and columns for a table. + +Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model's corresponding table. + +Some basic examples defining models are shown below. Consult the :doc:`Model API docs ` and :doc:`Column API docs ` for complete details. + +Example Definitions +=================== + +This example defines a ``Person`` table, with the columns ``first_name`` and ``last_name`` + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Person(Model): + id = columns.UUID(primary_key=True) + first_name = columns.Text() + last_name = columns.Text() + + +The Person model would create this CQL table: + +.. code-block:: sql + + CREATE TABLE cqlengine.person ( + id uuid, + first_name text, + last_name text, + PRIMARY KEY (id) + ); + +Here's an example of a comment table created with clustering keys, in descending order: + +.. code-block:: python + + from cassandra.cqlengine import columns + from cassandra.cqlengine.models import Model + + class Comment(Model): + photo_id = columns.UUID(primary_key=True) + comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC") + comment = columns.Text() + +The Comment model's ``create table`` would look like the following: + +.. code-block:: sql + + CREATE TABLE comment ( + photo_id uuid, + comment_id timeuuid, + comment text, + PRIMARY KEY (photo_id, comment_id) + ) WITH CLUSTERING ORDER BY (comment_id DESC); + +To sync the models to the database, you may do the following*: + +.. code-block:: python + + from cassandra.cqlengine.management import sync_table + sync_table(Person) + sync_table(Comment) + +\*Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in :doc:`/api/cassandra/cqlengine/management` for considerations. + +For examples on manipulating data and creating queries, see :doc:`queryset` + +Manipulating model instances as dictionaries +============================================ + +Model instances can be accessed like dictionaries. + +.. code-block:: python + + class Person(Model): + first_name = columns.Text() + last_name = columns.Text() + + kevin = Person.create(first_name="Kevin", last_name="Deldycke") + dict(kevin) # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'} + kevin['first_name'] # returns 'Kevin' + kevin.keys() # returns ['first_name', 'last_name'] + kevin.values() # returns ['Kevin', 'Deldycke'] + kevin.items() # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')] + + kevin['first_name'] = 'KEVIN5000' # changes the models first name + +Extending Model Validation +========================== + +Each time you save a model instance in cqlengine, the data in the model is validated against the schema you've defined +for your model. Most of the validation is fairly straightforward, it basically checks that you're not trying to do +something like save text into an integer column, and it enforces the ``required`` flag set on column definitions. +It also performs any transformations needed to save the data properly. + +However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won't complain when you try to insert it. To define additional validation on a model, +extend the model's validation method: + +.. code-block:: python + + class Member(Model): + person_id = UUID(primary_key=True) + name = Text(required=True) + + def validate(self): + super(Member, self).validate() + if self.name == 'jon': + raise ValidationError('no jon\'s allowed') + +*Note*: while not required, the convention is to raise a ``ValidationError`` (``from cassandra.cqlengine import ValidationError``) +if validation fails. + +.. _model_inheritance: + +Model Inheritance +================= +It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row. + +For instance, suppose you want a table that stores rows of pets owned by an owner: + +.. code-block:: python + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + def eat(self, food): + pass + + def sleep(self, time): + pass + + class Cat(Pet): + __discriminator_value__ = 'cat' + cuteness = Float() + + def tear_up_couch(self): + pass + + class Dog(Pet): + __discriminator_value__ = 'dog' + fierceness = Float() + + def bark_all_night(self): + pass + +After calling ``sync_table`` on each of these tables, the columns defined in each model will be added to the +``pet`` table. Additionally, saving ``Cat`` and ``Dog`` models will save the meta data needed to identify each row +as either a cat or dog. + +To setup a model structure with inheritance, follow these steps + +1. Create a base model with a column set as the distriminator (``distriminator_column=True`` in the column definition) +2. Create subclass models, and define a unique ``__discriminator_value__`` value on each +3. Run ``sync_table`` on each of the sub tables + +**About the discriminator value** + +The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set ``index=True`` on your discriminator column, you can execute queries against specialized subclasses, and a +``WHERE`` clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique ``__discriminator_value__`` to each subclass, and that you can only assign a single discriminator column per model. + +.. _user_types: + +User Defined Types +================== +cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:: + + from cassandra.cqlengine.columns import * + from cassandra.cqlengine.models import Model + from cassandra.cqlengine.usertype import UserType + + class address(UserType): + street = Text() + zipcode = Integer() + + class users(Model): + __keyspace__ = 'account' + name = Text(primary_key=True) + addr = UserDefinedType(address) + + users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999)) + user = users.objects(name="Joe")[0] + print user.name, user.addr + # Joe address(street=u'Easy St.', zipcode=99999) + +UDTs are modeled by inheriting :class:`~.usertype.UserType`, and setting column type attributes. Types are then used in defining +models by declaring a column of type :class:`~.columns.UserDefinedType`, with the ``UserType`` class as a parameter. + +``sync_table`` will implicitly +synchronize any types contained in the table. Alternatively :func:`~.management.sync_type` can be used to create/alter types +explicitly. + +Upon declaration, types are automatically registered with the driver, so query results return instances of your ``UserType`` +class*. + +***Note**: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +``protocol_version=3``. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple. diff --git a/stable/_sources/cqlengine/queryset.rst.txt b/stable/_sources/cqlengine/queryset.rst.txt new file mode 100644 index 0000000000..375ea22316 --- /dev/null +++ b/stable/_sources/cqlengine/queryset.rst.txt @@ -0,0 +1,419 @@ +============== +Making Queries +============== + +.. module:: cqlengine.queryset + +Retrieving objects +================== +Once you've populated Cassandra with data, you'll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you're looking for. + +Retrieving all objects +---------------------- +The simplest query you can make is to return all objects from a table. + +This is accomplished with the ``.all()`` method, which returns a QuerySet of all objects in a table + +Using the Person example model, we would get all Person objects like this: + +.. code-block:: python + + all_objects = Person.objects.all() + +.. _retrieving-objects-with-filters: + +Retrieving objects with filters +------------------------------- +Typically, you'll want to query only a subset of the records in your database. + +That can be accomplished with the QuerySet's ``.filter(\*\*)`` method. + +For example, given the model definition: + +.. code-block:: python + + class Automobile(Model): + manufacturer = columns.Text(primary_key=True) + year = columns.Integer(primary_key=True) + model = columns.Text() + price = columns.Decimal() + options = columns.Set(columns.Text) + +...and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this: + + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + +You can also use the more convenient syntax: + +.. code-block:: python + + q = Automobile.objects(Automobile.manufacturer == 'Tesla') + +We can then further filter our query with another call to **.filter** + +.. code-block:: python + + q = q.filter(year=2012) + +*Note: all queries involving any filtering MUST define either an '=' or an 'in' relation to either a primary key column, or an indexed column.* + +Accessing objects in a QuerySet +=============================== + +There are several methods for getting objects out of a queryset + +* iterating over the queryset + .. code-block:: python + + for car in Automobile.objects.all(): + #...do something to the car instance + pass + +* list index + .. code-block:: python + + q = Automobile.objects.all() + q[0] #returns the first result + q[1] #returns the second result + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array indexing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* list slicing + .. code-block:: python + + q = Automobile.objects.all() + q[1:] #returns all results except the first + q[1:9] #returns a slice of the results + + .. note:: + + * CQL does not support specifying a start position in it's queries. Therefore, accessing elements using array slicing will load every result up to the index value requested + * Using negative indices requires a "SELECT COUNT()" to be executed. This has a performance cost on large datasets. + +* calling :attr:`get() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.get() + + this returns the object matching the queryset + +* calling :attr:`first() ` on the queryset + .. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) + car = q.first() + + this returns the first value in the queryset + +.. _query-filtering-operators: + +Filtering Operators +=================== + +:attr:`Equal To ` + +The default filtering operator. + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year=2012) #year == 2012 + +In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a ``__`` to the field name on the filtering call + +:attr:`in (__in) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__in=[2011, 2012]) + + +:attr:`> (__gt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gt=2010) # year > 2010 + + # or the nicer syntax + + q.filter(Automobile.year > 2010) + +:attr:`>= (__gte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__gte=2010) # year >= 2010 + + # or the nicer syntax + + q.filter(Automobile.year >= 2010) + +:attr:`< (__lt) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lt=2012) # year < 2012 + + # or... + + q.filter(Automobile.year < 2012) + +:attr:`<= (__lte) ` + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q = q.filter(year__lte=2012) # year <= 2012 + + q.filter(Automobile.year <= 2012) + +:attr:`CONTAINS (__contains) ` + +The CONTAINS operator is available for all collection types (List, Set, Map). + +.. code-block:: python + + q = Automobile.objects.filter(manufacturer='Tesla') + q.filter(options__contains='backup camera').allow_filtering() + +Note that we need to use allow_filtering() since the *options* column has no secondary index. + +:attr:`LIKE (__like) ` + +The LIKE operator is available for text columns that have a SASI secondary index. + +.. code-block:: python + + q = Automobile.objects.filter(model__like='%Civic%').allow_filtering() + +:attr:`IS NOT NULL (IsNotNull(column_name)) ` + +The IS NOT NULL operator is not yet supported for C*. + +.. code-block:: python + + q = Automobile.objects.filter(IsNotNull('model')) + +Limitations: + +- Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver. +- Queries using LIKE must use allow_filtering() since the *model* column has no standard secondary index. Note that the server will use the SASI index properly when executing the query. + +TimeUUID Functions +================== + +In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don't actually return a value, but instruct the cql interpreter to use the functions in it's query. + +.. class:: MinTimeUUID(datetime) + + returns the minimum time uuid value possible for the given datetime + +.. class:: MaxTimeUUID(datetime) + + returns the maximum time uuid value possible for the given datetime + +*Example* + +.. code-block:: python + + class DataStream(Model): + id = columns.UUID(partition_key=True) + time = columns.TimeUUID(primary_key=True) + data = columns.Bytes() + + min_time = datetime(1982, 1, 1) + max_time = datetime(1982, 3, 9) + + DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time)) + +Token Function +============== + +Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows. + +See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun + +*Example* + +.. code-block:: python + + class Items(Model): + id = columns.Text(primary_key=True) + data = columns.Bytes() + + query = Items.objects.all().limit(10) + + first_page = list(query); + last = first_page[-1] + next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk))) + +QuerySets are immutable +======================= + +When calling any method that changes a queryset, the method does not actually change the queryset object it's called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call. + +*Example* + +.. code-block:: python + + #this produces 3 different querysets + #q does not change after it's initial definition + q = Automobiles.objects.filter(year=2012) + tesla2012 = q.filter(manufacturer='Tesla') + honda2012 = q.filter(manufacturer='Honda') + +Ordering QuerySets +================== + +Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable. + +However, you can set a column to order on with the ``.order_by(column_name)`` method. + +*Example* + +.. code-block:: python + + #sort ascending + q = Automobiles.objects.all().order_by('year') + #sort descending + q = Automobiles.objects.all().order_by('-year') + +*Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.* + +*For instance, given our Automobile model, year is the only column we can order on.* + +Values Lists +============ + +There is a special QuerySet's method ``.values_list()`` - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the ``values_list()`` call — so the first item is the first field, etc. For example: + +.. code-block:: python + + items = list(range(20)) + random.shuffle(items) + for i in items: + TestModel.create(id=1, clustering_key=i) + + values = list(TestModel.objects.values_list('clustering_key', flat=True)) + # [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L] + +Per Query Timeouts +=================== + +By default all queries are executed with the timeout defined in `~cqlengine.connection.setup()` +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout. + + +.. code-block:: python + + class Row(Model): + id = columns.Integer(primary_key=True) + name = columns.Text() + + +Fetch all objects with a timeout of 5 seconds + +.. code-block:: python + + Row.objects().timeout(5).all() + +Create a single row with a 50ms timeout + +.. code-block:: python + + Row(id=1, name='Jon').timeout(0.05).create() + +Delete a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).delete() + +Update a single row with no timeout + +.. code-block:: python + + Row(id=1).timeout(None).update(name='Blake') + +Batch query timeouts + +.. code-block:: python + + with BatchQuery(timeout=10) as b: + Row(id=1, name='Jon').create() + + +NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it's constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError. + + +.. _ttl-change: + +Default TTL and Per Query TTL +============================= + +Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + +You can set TTL per-query if needed. Here are a some examples: + +Example: + +.. code-block:: python + + class User(Model): + __options__ = {'default_time_to_live': 20} + + user_id = columns.UUID(primary_key=True) + ... + + user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server + + user.ttl(30).update(age=21) # Update the TTL to 30 + User.objects.ttl(10).create(user_id=1) # TTL 10 + User(user_id=1, age=21).ttl(10).save() # TTL 10 + + +Named Tables +=================== + +Named tables are a way of querying a table without creating an class. They're useful for querying system tables or exploring an unfamiliar database. + + +.. code-block:: python + + from cassandra.cqlengine.connection import setup + setup("127.0.0.1", "cqlengine_test") + + from cassandra.cqlengine.named import NamedTable + user = NamedTable("cqlengine_test", "user") + user.objects() + user.objects()[0] + + # {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)} diff --git a/stable/_sources/cqlengine/third-party.rst.txt b/stable/_sources/cqlengine/third-party.rst.txt new file mode 100644 index 0000000000..20c26df304 --- /dev/null +++ b/stable/_sources/cqlengine/third-party.rst.txt @@ -0,0 +1,64 @@ +======================== +Third party integrations +======================== + + +Celery +------ + +Here's how, in substance, CQLengine can be plugged to `Celery +`_: + +.. code-block:: python + + from celery import Celery + from celery.signals import worker_process_init, beat_init + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + def cassandra_init(**kwargs): + """ Initialize a clean Cassandra connection. """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() + + # Initialize worker context for both standard and periodic tasks. + worker_process_init.connect(cassandra_init) + beat_init.connect(cassandra_init) + + app = Celery() + + +uWSGI +----- + +This is the code required for proper connection handling of CQLengine for a +`uWSGI `_-run application: + +.. code-block:: python + + from cassandra.cqlengine import connection + from cassandra.cqlengine.connection import ( + cluster as cql_cluster, session as cql_session) + + try: + from uwsgidecorators import postfork + except ImportError: + # We're not in a uWSGI context, no need to hook Cassandra session + # initialization to the postfork event. + pass + else: + @postfork + def cassandra_init(**kwargs): + """ Initialize a new Cassandra session in the context. + + Ensures that a new session is returned for every new request. + """ + if cql_cluster is not None: + cql_cluster.shutdown() + if cql_session is not None: + cql_session.shutdown() + connection.setup() diff --git a/stable/_sources/cqlengine/upgrade-guide.rst.txt b/stable/_sources/cqlengine/upgrade-guide.rst.txt new file mode 100644 index 0000000000..5a10ebb757 --- /dev/null +++ b/stable/_sources/cqlengine/upgrade-guide.rst.txt @@ -0,0 +1,155 @@ +======================== +Upgrade Guide +======================== + +This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports). + +**THERE IS ONE FUNCTIONAL CHANGE**, described in the first section below. + +Functional Changes +================== +List Prepend Reversing +---------------------- +Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (`CASSANDRA-8733 `_). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed. + +Date Column Type +---------------- +The Date column type in legacy cqlengine used a ``timestamp`` CQL type and truncated the time. +Going forward, the :class:`~.columns.Date` type represents a ``date`` for Cassandra 2.2+ +(`PYTHON-245 `_). +Users of the legacy functionality should convert models to use :class:`~.columns.DateTime` (which +uses ``timestamp`` internally), and use the build-in ``datetime.date`` for input values. + +Remove cqlengine +================ +To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version. + +The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation. + +Organization +============ +Imports +------- +cqlengine is now integrated as a sub-package of the driver base package 'cassandra'. +Upgrading will require adjusting imports to cqlengine. For example:: + + from cassandra.cqlengine import columns + +is now:: + + from cassandra.cqlengine import columns + +Package-Level Aliases +--------------------- +Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, ``cqlengine.ONE`` was an alias +of ``cassandra.ConsistencyLevel.ONE``. In the integrated package, only the +:class:`cassandra.ConsistencyLevel` remains. + +Additionally, submodule aliases are removed from cqlengine in favor of absolute imports. + +These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time. + +Exceptions +---------- +The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations: + +============================ ========== +Exception class New module +============================ ========== +CQLEngineException cassandra.cqlengine +ModelException cassandra.cqlengine.models +ValidationError cassandra.cqlengine +UndefinedKeyspaceException cassandra.cqlengine.connection +LWTException cassandra.cqlengine.query +IfNotExistsWithCounterColumn cassandra.cqlengine.query +============================ ========== + +UnicodeMixin Consolidation +-------------------------- +``class UnicodeMixin`` was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness. + +API Deprecations +================ +This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality -- only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives. + +Float/Double Overload +--------------------- +Previously there was no ``Double`` column type. Doubles were modeled by specifying ``Float(double_precision=True)``. +This inititializer parameter is now deprecated. Applications should use :class:`~.columns.Double` for CQL ``double``, and :class:`~.columns.Float` +for CQL ``float``. + +Schema Management +----------------- +``cassandra.cqlengine.management.create_keyspace`` is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies: + +- :func:`~.create_keyspace_simple` +- :func:`~.create_keyspace_network_topology` + +``cassandra.cqlengine.management.delete_keyspace`` is deprecated in favor of a new function, :func:`~.drop_keyspace`. The +intent is simply to make the function match the CQL verb it invokes. + +Model Inheritance +----------------- +The names for class attributes controlling model inheritance are changing. Changes are as follows: + +- Replace 'polymorphic_key' in the base class Column definition with :attr:`~.discriminator_column` +- Replace the '__polymorphic_key__' class attribute the derived classes with :attr:`~.__discriminator_value__` + +The functionality is unchanged -- the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version. + +The example below shows a simple translation: + +Before:: + + class Pet(Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(polymorphic_key=True) + name = Text() + + class Cat(Pet): + __polymorphic_key__ = 'cat' + + class Dog(Pet): + __polymorphic_key__ = 'dog' + +After:: + + class Pet(models.Model): + __table_name__ = 'pet' + owner_id = UUID(primary_key=True) + pet_id = UUID(primary_key=True) + pet_type = Text(discriminator_column=True) + name = Text() + + class Cat(Pet): + __discriminator_value__ = 'cat' + + class Dog(Pet): + __discriminator_value__ = 'dog' + + +TimeUUID.from_datetime +---------------------- +This function is deprecated in favor of the core utility function :func:`~.uuid_from_time`. diff --git a/stable/_sources/dates-and-times.rst.txt b/stable/_sources/dates-and-times.rst.txt new file mode 100644 index 0000000000..7a89f77437 --- /dev/null +++ b/stable/_sources/dates-and-times.rst.txt @@ -0,0 +1,87 @@ +Working with Dates and Times +============================ + +This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types. + +timestamps (Cassandra DateType) +------------------------------- + +Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, "The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans." The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out. + +Write Path +~~~~~~~~~~ +When inserting timestamps, the driver handles serialization for the write path as follows: + +If the input is a ``datetime.datetime``, the serialization is normalized by starting with the ``utctimetuple()`` of the +value. + +- If the ``datetime`` object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent. +- If the ``datetime`` object is timezone-naive, this results in no shift -- any ``datetime`` with no timezone information is assumed to be UTC + +Note the second point above applies even to "local" times created using ``now()``:: + + >>> d = datetime.now() + + >>> print(d.tzinfo) + None + + +These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use ``datetime.utcnow()`` to be explicit about it. + +If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec -- no scaling or conversion is done. + +Read Path +~~~~~~~~~ +The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive ``datetime.datetime``. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator). + +The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the ``datetime``\s returned by queries. One prevalent method is to use pytz for localization:: + + import pytz + user_tz = pytz.timezone('US/Central') + timestamp_naive = row.ts + timestamp_utc = pytz.utc.localize(timestamp_naive) + timestamp_presented = timestamp_utc.astimezone(user_tz) + +This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here. + +date, time (Cassandra DateType) +------------------------------- +Date and time in Cassandra are idealized markers, much like ``datetime.date`` and ``datetime.time`` in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: :class:`.util.Date` and :class:`.util.Time`. + +Write Path +~~~~~~~~~~ +For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See `Working with dates `_ +or `Working with time `_ for details +on the encoding or string formats. + +For prepared statements, the driver accepts anything that can be used to construct the :class:`.util.Date` or +:class:`.util.Time` classes. See the linked API docs for details. + +Read Path +~~~~~~~~~ +The driver always returns custom types for ``date`` and ``time``. + +The driver returns :class:`.util.Date` for ``date`` in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [``datetime.MINYEAR``, ``datetime.MAXYEAR``], these are easily +converted to standard ``datetime.date`` insances using :meth:`.Date.date`. + +The driver returns :class:`.util.Time` for ``time`` in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard ``datetime.time`` +insances using :meth:`.Time.time`. diff --git a/stable/_sources/execution-profiles.rst.txt b/stable/_sources/execution-profiles.rst.txt new file mode 100644 index 0000000000..7be1a85e3f --- /dev/null +++ b/stable/_sources/execution-profiles.rst.txt @@ -0,0 +1,156 @@ +Execution Profiles +================== + +Execution profiles aim at making it easier to execute requests in different ways within +a single connected ``Session``. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads. + +The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client ``Cluster``. Legacy configuration +will be removed in the next major release (4.0). + +An execution profile and its parameters should be unique across ``Cluster`` instances. +For example, an execution profile and its ``LoadBalancingPolicy`` should +not be applied to more than one ``Cluster`` instance. + +This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution. + +Mapping Legacy Parameters to Profiles +------------------------------------- + +Execution profiles can inherit from :class:`.cluster.ExecutionProfile`, and currently provide the following options, +previously input from the noted attributes: + +- load_balancing_policy - :attr:`.Cluster.load_balancing_policy` +- request_timeout - :attr:`.Session.default_timeout`, optional :meth:`.Session.execute` parameter +- retry_policy - :attr:`.Cluster.default_retry_policy`, optional :attr:`.Statement.retry_policy` attribute +- consistency_level - :attr:`.Session.default_consistency_level`, optional :attr:`.Statement.consistency_level` attribute +- serial_consistency_level - :attr:`.Session.default_serial_consistency_level`, optional :attr:`.Statement.serial_consistency_level` attribute +- row_factory - :attr:`.Session.row_factory` attribute + +When using the new API, these parameters can be defined by instances of :class:`.cluster.ExecutionProfile`. + +Using Execution Profiles +------------------------ +Default +~~~~~~~ + +.. code:: python + + from cassandra.cluster import Cluster + cluster = Cluster() + session = cluster.connect() + local_query = 'SELECT rpc_address FROM system.local' + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + + +The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters. + +Initializing cluster with profiles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + from cassandra.cluster import ExecutionProfile + from cassandra.policies import WhiteListRoundRobinPolicy + + node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2'])) + + profiles = {'node1': node1_profile, 'node2': node2_profile} + session = Cluster(execution_profiles=profiles).connect() + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node1')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile='node2')[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.2') + + +.. code:: python + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.2') + Row(rpc_address='127.0.0.1') + +Note that, even when custom profiles are injected, the default ``TokenAwarePolicy(DCAwareRoundRobinPolicy())`` is still +present. To override the default, specify a policy with the :data:`~.cluster.EXEC_PROFILE_DEFAULT` key. + +.. code:: python + + from cassandra.cluster import EXEC_PROFILE_DEFAULT + profile = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + + +Adding named profiles +~~~~~~~~~~~~~~~~~~~~~ + +New profiles can be added constructing from scratch, or deriving from default: + +.. code:: python + + locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1'])) + node1_profile = 'node1_whitelist' + cluster.add_execution_profile(node1_profile, locked_execution) + + for _ in cluster.metadata.all_hosts(): + print session.execute(local_query, execution_profile=node1_profile)[0] + + +.. parsed-literal:: + + Row(rpc_address='127.0.0.1') + Row(rpc_address='127.0.0.1') + +See :meth:`.Cluster.add_execution_profile` for details and optional parameters. + +Passing a profile instance without mapping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We also have the ability to pass profile instances to be used for execution, but not added to the mapping: + +.. code:: python + + from cassandra.query import tuple_factory + + tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory) + + print session.execute(local_query, execution_profile=tmp)[0] + print session.execute(local_query, execution_profile='node1')[0] + +.. parsed-literal:: + + ('127.0.0.1',) + Row(rpc_address='127.0.0.1') + +The new profile is a shallow copy, so the ``tmp`` profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance. diff --git a/stable/_sources/faq.rst.txt b/stable/_sources/faq.rst.txt new file mode 100644 index 0000000000..56cb648a24 --- /dev/null +++ b/stable/_sources/faq.rst.txt @@ -0,0 +1,83 @@ +Frequently Asked Questions +========================== + +See also :doc:`cqlengine FAQ ` + +Why do connections or IO operations timeout in my WSGI application? +------------------------------------------------------------------- +Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts. + +To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example: + +.. code-block:: python + + from flask import Flask + from uwsgidecorators import postfork + from cassandra.cluster import Cluster + + session = None + prepared = None + + @postfork + def connect(): + global session, prepared + session = Cluster().connect() + prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?") + + app = Flask(__name__) + + @app.route('/') + def server_version(): + row = session.execute(prepared, ('local',))[0] + return row.release_version + +uWSGI provides a ``postfork`` hook you can use to create sessions and prepared statements after the child process forks. + +How do I trace a request? +------------------------- +Request tracing can be turned on for any request by setting ``trace=True`` in :meth:`.Session.execute_async`. View the results by waiting on the future, then :meth:`.ResponseFuture.get_query_trace`. +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data. + +.. code-block:: python + + >>> future = session.execute_async("SELECT * FROM system.local", trace=True) + >>> result = future.result() + >>> trace = future.get_query_trace() + >>> for e in trace.events: + >>> print e.source_elapsed, e.description + + 0:00:00.000077 Parsing select * from system.local + 0:00:00.000153 Preparing statement + 0:00:00.000309 Computing ranges to query + 0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected) + 0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges + 0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808)) + 0:00:00.000669 Read 1 live and 0 tombstone cells + 0:00:00.000755 Scanned 1 rows and matched 1 + +``trace`` is a :class:`QueryTrace` object. + +How do I determine the replicas for a query? +---------------------------------------------- +With prepared statements, the replicas are obtained by ``routing_key``, based on current cluster token metadata: + +.. code-block:: python + + >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?") + >>> bound = prepared.bind((1,)) + >>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key) + >>> for h in replicas: + >>> print h.address + 127.0.0.1 + 127.0.0.2 + +``replicas`` is a list of :class:`Host` objects. + +How does the driver manage request retries? +------------------------------------------- +By default, retries are managed by the :attr:`.Cluster.default_retry_policy` set on the session Cluster. It can also +be specialized per statement by setting :attr:`.Statement.retry_policy`. + +Retries are presently attempted on the same coordinator, but this may change in the future. + +Please see :class:`.policies.RetryPolicy` for further details. diff --git a/stable/_sources/getting-started.rst.txt b/stable/_sources/getting-started.rst.txt new file mode 100644 index 0000000000..59a2acbd04 --- /dev/null +++ b/stable/_sources/getting-started.rst.txt @@ -0,0 +1,479 @@ +Getting Started +=============== + +First, make sure you have the driver properly :doc:`installed `. + +Connecting to a Cluster +----------------------- +Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of :class:`~.Cluster`. As the name suggests, you will typically have one +instance of :class:`~.Cluster` for each Cassandra cluster you want to interact +with. + +First, make sure you have the Cassandra driver properly :doc:`installed `. + +Connecting to Cassandra ++++++++++++++++++++++++ +The simplest way to create a :class:`~.Cluster` is like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + +This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(['192.168.0.1', '192.168.0.2']) + +The set of IP addresses we pass to the :class:`~.Cluster` is simply +an initial set of contact points. After the driver connects to one +of these nodes it will *automatically discover* the rest of the +nodes in the cluster and connect to them, so you don't need to list +every node in your cluster. + +If you need to use a non-standard port, use SSL, or customize the driver's +behavior in some other way, this is the place to do it: + +.. code-block:: python + + from cassandra.cluster import Cluster + cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...) + +Instantiating a :class:`~.Cluster` does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +:class:`~.Session`, which is created by calling :meth:`.Cluster.connect()`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + +Session Keyspace +---------------- +The :meth:`~.Cluster.connect()` method takes an optional ``keyspace`` argument +which sets the default keyspace for all queries made through that :class:`~.Session`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect('mykeyspace') + +You can always change a Session's keyspace using :meth:`~.Session.set_keyspace` or +by executing a ``USE `` query: + +.. code-block:: python + + session.set_keyspace('users') + # or you can do this instead + session.execute('USE users') + +Execution Profiles +------------------ +Profiles are passed in by ``execution_profiles`` dict. + +In this case we can construct the base ``ExecutionProfile`` passing all attributes: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy + from cassandra.query import tuple_factory + + profile = ExecutionProfile( + load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']), + retry_policy=DowngradingConsistencyRetryPolicy(), + consistency_level=ConsistencyLevel.LOCAL_QUORUM, + serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL, + request_timeout=15, + row_factory=tuple_factory + ) + cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile}) + session = cluster.connect() + + print(session.execute("SELECT release_version FROM system.local").one()) + +Users are free to setup additional profiles to be used by name: + +.. code-block:: python + + profile_long = ExecutionProfile(request_timeout=30) + cluster = Cluster(execution_profiles={'long': profile_long}) + session = cluster.connect() + session.execute(statement, execution_profile='long') + +Also, parameters passed to ``Session.execute`` or attached to ``Statement``\s are still honored as before. + +Executing Queries +----------------- +Now that we have a :class:`.Session` we can begin to execute queries. The simplest +way to execute a query is to use :meth:`~.Session.execute()`: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for user_row in rows: + print user_row.name, user_row.age, user_row.email + +This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails. + +By default, each row in the result set will be a +`namedtuple `_. +Each row will have a matching attribute for each column defined in the schema, +such as ``name``, ``age``, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent: + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row.name, row.age, row.email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for (name, age, email) in rows: + print name, age, email + +.. code-block:: python + + rows = session.execute('SELECT name, age, email FROM users') + for row in rows: + print row[0], row[1], row[2] + +If you prefer another result format, such as a ``dict`` per row, you +can change the :attr:`~.Session.row_factory` attribute. + +As mentioned in our `Drivers Best Practices Guide `_, +it is highly recommended to use `Prepared statements <#prepared-statement>`_ for your +frequently run queries. + +.. _prepared-statement: + +Prepared Statements +------------------- +Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time. + +To prepare a query, use :meth:`.Session.prepare()`: + +.. code-block:: python + + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + + users = [] + for user_id in user_ids_to_query: + user = session.execute(user_lookup_stmt, [user_id]) + users.append(user) + +:meth:`~.Session.prepare()` returns a :class:`~.PreparedStatement` instance +which can be used in place of :class:`~.SimpleStatement` instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary. + +Note that the placeholders for prepared statements are ``?`` characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both). + +Passing Parameters to CQL Queries +--------------------------------- +Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named. + +Positional parameters are used with a ``%s`` placeholder. For example, +when you execute: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id) + VALUES (%s, %s, %s) + """, + ("John O'Reilly", 42, uuid.uuid1()) + ) + +It is translated to the following CQL query:: + + INSERT INTO users (name, credits, user_id) + VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93) + +Note that you should use ``%s`` for all types of arguments, not just strings. +For example, this would be **wrong**: + +.. code-block:: python + + session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42)) # wrong + +Instead, use ``%s`` for the age placeholder. + +If you need to use a literal ``%`` character, use ``%%``. + +**Note**: you must always use a sequence for the second argument, even if you are +only passing in a single variable: + +.. code-block:: python + + session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah") # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah")) # wrong + session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", )) # right + session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"]) # right + + +Note that the second line is incorrect because in Python, single-element tuples +require a comma. + +Named place-holders use the ``%(name)s`` form: + +.. code-block:: python + + session.execute( + """ + INSERT INTO users (name, credits, user_id, username) + VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s) + """, + {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()} + ) + +Note that you can repeat placeholders with the same name, such as ``%(name)s`` +in the above example. + +Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting). + +.. _type-conversions: + +Type Conversions +---------------- +For non-prepared statements, Python types are cast to CQL literals in the +following way: + +.. table:: + + +--------------------+-------------------------+ + | Python Type | CQL Literal Type | + +====================+=========================+ + | ``None`` | ``NULL`` | + +--------------------+-------------------------+ + | ``bool`` | ``boolean`` | + +--------------------+-------------------------+ + | ``float`` | | ``float`` | + | | | ``double`` | + +--------------------+-------------------------+ + | | ``int`` | | ``int`` | + | | ``long`` | | ``bigint`` | + | | | ``varint`` | + | | | ``smallint`` | + | | | ``tinyint`` | + | | | ``counter`` | + +--------------------+-------------------------+ + | ``decimal.Decimal``| ``decimal`` | + +--------------------+-------------------------+ + | | ``str`` | | ``ascii`` | + | | ``unicode`` | | ``varchar`` | + | | | ``text`` | + +--------------------+-------------------------+ + | | ``buffer`` | ``blob`` | + | | ``bytearray`` | | + +--------------------+-------------------------+ + | ``date`` | ``date`` | + +--------------------+-------------------------+ + | ``datetime`` | ``timestamp`` | + +--------------------+-------------------------+ + | ``time`` | ``time`` | + +--------------------+-------------------------+ + | | ``list`` | ``list`` | + | | ``tuple`` | | + | | generator | | + +--------------------+-------------------------+ + | | ``set`` | ``set`` | + | | ``frozenset`` | | + +--------------------+-------------------------+ + | | ``dict`` | ``map`` | + | | ``OrderedDict`` | | + +--------------------+-------------------------+ + | ``uuid.UUID`` | | ``timeuuid`` | + | | | ``uuid`` | + +--------------------+-------------------------+ + + +Asynchronous Queries +-------------------- +The driver supports asynchronous query execution through +:meth:`~.Session.execute_async()`. Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a :class:`~.ResponseFuture` object. There are two ways of +getting the final result from this object. + +The first is by calling :meth:`~.ResponseFuture.result()` on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example: + +.. code-block:: python + + from cassandra import ReadTimeout + + query = "SELECT * FROM users WHERE user_id=%s" + future = session.execute_async(query, [user_id]) + + # ... do some other work + + try: + rows = future.result() + user = rows[0] + print user.name, user.age + except ReadTimeout: + log.exception("Query timed out:") + +This works well for executing many queries concurrently: + +.. code-block:: python + + # build a list of futures + futures = [] + query = "SELECT * FROM users WHERE user_id=%s" + for user_id in ids_to_fetch: + futures.append(session.execute_async(query, [user_id]) + + # wait for them to complete and use the results + for future in futures: + rows = future.result() + print rows[0].name + +Alternatively, instead of calling :meth:`~.ResponseFuture.result()`, +you can attach callback and errback functions through the +:meth:`~.ResponseFuture.add_callback()`, +:meth:`~.ResponseFuture.add_errback()`, and +:meth:`~.ResponseFuture.add_callbacks()`, methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that: + +.. code-block:: python + + def handle_success(rows): + user = rows[0] + try: + process_user(user.name, user.age, user.id) + except Exception: + log.error("Failed to process user %s", user.id) + # don't re-raise errors in the callback + + def handle_error(exception): + log.error("Failed to fetch user info: %s", exception) + + + future = session.execute_async(query) + future.add_callbacks(handle_success, handle_error) + +There are a few important things to remember when working with callbacks: + * **Exceptions that are raised inside the callback functions will be logged and then ignored.** + * Your callback will be run on the event loop thread, so any long-running + operations will prevent other requests from being handled + + +Setting a Consistency Level +--------------------------- +The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success. + +By default, :attr:`.ConsistencyLevel.LOCAL_ONE` will be used for all queries. +You can specify a different default by setting the :attr:`.ExecutionProfile.consistency_level` +for the execution profile with key :data:`~.cluster.EXEC_PROFILE_DEFAULT`. +To specify a different consistency level per request, wrap queries +in a :class:`~.SimpleStatement`: + +.. code-block:: python + + from cassandra import ConsistencyLevel + from cassandra.query import SimpleStatement + + query = SimpleStatement( + "INSERT INTO users (name, age) VALUES (%s, %s)", + consistency_level=ConsistencyLevel.QUORUM) + session.execute(query, ('John', 42)) + +Setting a Consistency Level with Prepared Statements +---------------------------------------------------- +To specify a consistency level for prepared statements, you have two options. + +The first is to set a default consistency level for every execution of the +prepared statement: + +.. code-block:: python + + from cassandra import ConsistencyLevel + + cluster = Cluster() + session = cluster.connect("mykeyspace") + user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?") + user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM + + # these will both use QUORUM + user1 = session.execute(user_lookup_stmt, [user_id1])[0] + user2 = session.execute(user_lookup_stmt, [user_id2])[0] + +The second option is to create a :class:`~.BoundStatement` from the +:class:`~.PreparedStatement` and binding parameters and set a consistency +level on that: + +.. code-block:: python + + # override the QUORUM default + user3_lookup = user_lookup_stmt.bind([user_id3]) + user3_lookup.consistency_level = ConsistencyLevel.ALL + user3 = session.execute(user3_lookup) + +Speculative Execution +--------------------- + +Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see `Speculative Execution with DataStax Drivers `_. + +To enable speculative execution: + +* Configure a :class:`~.policies.SpeculativeExecutionPolicy` with the ExecutionProfile +* Mark your query as idempotent, which mean it can be applied multiple + times without changing the result of the initial application. + See `Query Idempotence `_ for more details. + + +Example: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import ConstantSpeculativeExecutionPolicy + from cassandra.query import SimpleStatement + + # Configure the speculative execution policy + ep = ExecutionProfile( + speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10) + ) + cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep}) + session = cluster.connect() + + # Mark the query idempotent + query = SimpleStatement( + "UPDATE my_table SET list_col = [1] WHERE pk = 1", + is_idempotent=True + ) + + # Execute. A new query will be sent to the server every 0.5 second + # until we receive a response, for a max number attempts of 10. + session.execute(query) diff --git a/stable/_sources/index.rst.txt b/stable/_sources/index.rst.txt new file mode 100644 index 0000000000..c21d293b6f --- /dev/null +++ b/stable/_sources/index.rst.txt @@ -0,0 +1,107 @@ +Python Driver for Scylla and Apache Cassandra® +============================================== +A Python client driver for `Scylla `_. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra's native protocol. + +The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +This driver is open source under the +`Apache v2 License `_. +The source code for this driver can be found on `GitHub `_. + +Scylla Driver is a fork from `DataStax Python Driver `_, including some non-breaking changes for Scylla optimization, with more updates planned. + +Contents +-------- +:doc:`installation` + How to install the driver. + +:doc:`getting-started` + A guide through the first steps of connecting to Scylla and executing queries + +:doc:`scylla-specific` + A list of feature available only on ``scylla-driver`` + +:doc:`execution-profiles` + An introduction to a more flexible way of configuring request execution + +:doc:`lwt` + Working with results of conditional requests + +:doc:`object-mapper` + Introduction to the integrated object mapper, cqlengine + +:doc:`performance` + Tips for getting good performance. + +:doc:`query-paging` + Notes on paging large query results + +:doc:`security` + An overview of the security features of the driver + +:doc:`upgrading` + A guide to upgrading versions of the driver + +:doc:`user-defined-types` + Working with Scylla's user-defined types (UDT) + +:doc:`dates-and-times` + Some discussion on the driver's approach to working with timestamp, date, time types + +:doc:`scylla-cloud` + Connect to ScyllaDB Cloud + +:doc:`scylla-cloud-serverless` + Connect to ScyllaDB Cloud Serverless + +:doc:`CHANGELOG` + Log of changes to the driver, organized by version. + +:doc:`faq` + A collection of Frequently Asked Questions + +:doc:`api/index` + The API documentation. + +.. toctree:: + :hidden: + + api/index + installation + getting-started + scylla-specific + upgrading + execution-profiles + performance + query-paging + lwt + security + user-defined-types + object-mapper + dates-and-times + scylla-cloud + scylla-cloud-serverless + faq + +Getting Help +------------ +Visit the :doc:`FAQ section ` in this documentation. + +Please send questions to the Scylla `user list `_. + + +Reporting Issues +---------------- + +Please report any bugs and make any feature requests on the `Github project issues `_ + + +Copyright +--------- + +© 2013-2017 DataStax + +© 2016, The Apache Software Foundation. +Apache®, Apache Cassandra®, Cassandra®, the Apache feather logo and the Apache Cassandra® Eye logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. No endorsement by The Apache Software Foundation is implied by the use of these marks. diff --git a/stable/_sources/installation.rst.txt b/stable/_sources/installation.rst.txt new file mode 100644 index 0000000000..4996a02c1b --- /dev/null +++ b/stable/_sources/installation.rst.txt @@ -0,0 +1,234 @@ +Installation +============ + +Supported Platforms +------------------- +Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and `PyPy `_ are supported and tested. + +Linux, OSX, and Windows are supported. + +Installation through pip +------------------------ +`pip `_ is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:: + + pip install scylla-driver + +You can use ``pip install --pre scylla-driver`` if you need to install a beta version. + +***Note**: if intending to use optional extensions, install the `dependencies <#optional-non-python-dependencies>`_ first. The driver may need to be reinstalled if dependencies are added after the initial installation. + +Verifying your Installation +--------------------------- +To check if the installation was successful, you can run:: + + python -c 'import cassandra; print cassandra.__version__' + +It should print something like "3.22.0". + +.. _installation-datastax-graph: + +(*Optional*) Graph +--------------------------- +The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the `graph` requirements:: + + pip install scylla-driver[graph] + +(*Optional*) Compression Support +-------------------------------- +Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically. + +For lz4 support:: + + pip install lz4 + +For snappy support:: + + pip install python-snappy + +(If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run ``apt-get install python-snappy``.) + +(*Optional*) Metrics Support +---------------------------- +The driver has built-in support for capturing :attr:`.Cluster.metrics` about +the queries you run. However, the ``scales`` library is required to +support this:: + + pip install scales + + +Speeding Up Installation +^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, installing the driver through ``pip`` uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time -- as long as 10 minutes in some environments. + +In environments where performance is less important, it may be worth it to +:ref:`disable Cython as documented below `. +You can also use ``CASS_DRIVER_BUILD_CONCURRENCY`` to increase the number of +threads used to build the driver and any C extensions: + +.. code-block:: bash + + $ # installing from source + $ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install + $ # installing from pip + $ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver + +OSX Installation Error +^^^^^^^^^^^^^^^^^^^^^^ +If you're installing on OSX and have XCode 5.1 installed, you may see an error like this:: + + clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future] + +To fix this, re-run the installation with an extra compilation flag: + +.. code-block:: bash + + ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver + +.. _windows_build: + +Windows Installation Notes +-------------------------- +Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups: + +Setup requires a compiler. When using Python 2, this is as simple as installing `this package `_ +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment. + +It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell). + +Manual Installation +------------------- +You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +`requirements.txt `_. + +Once the dependencies are installed, simply run:: + + python setup.py install + + +(*Optional*) Non-python Dependencies +------------------------------------ +The driver has several **optional** features that have non-Python dependencies. + +C Extensions +^^^^^^^^^^^^ +By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the ``Murmur3Partitioner``, +`libev `_ event loop integration, +and Cython optimized extensions. + +When installing manually through setup.py, you can disable both with +the ``--no-extensions`` option, or selectively disable them with +with ``--no-murmur3``, ``--no-libev``, or ``--no-cython``. + +To compile the extensions, ensure that GCC and the Python headers are available. + +On Ubuntu and Debian, this can be accomplished by running:: + + $ sudo apt-get install gcc python-dev + +On RedHat and RedHat-based systems like CentOS and Fedora:: + + $ sudo yum install gcc python-devel + +On OS X, homebrew installations of Python should provide the necessary headers. + +See :ref:`windows_build` for notes on configuring the build environment on Windows. + +.. _cython-extensions: + +Cython-based Extensions +~~~~~~~~~~~~~~~~~~~~~~~ +By default, this package uses `Cython `_ to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation. + +This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:: + + python setup.py install --no-cython + +Alternatively, an environment variable can be used to switch this option regardless of +context:: + + CASS_DRIVER_NO_CYTHON=1 + - or, to disable all extensions: + CASS_DRIVER_NO_EXTENSIONS=1 + +This method is required when using pip, which provides no other way of injecting user options in a single command:: + + CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver + CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver + +The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement. + +If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:: + + sudo pip install six futures + sudo pip install --install-option="--no-cython" + + +libev support +^^^^^^^^^^^^^ +The driver currently uses Python's ``asyncore`` module for its default +event loop. For better performance, ``libev`` is also supported through +a C extension. + +If you're on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:: + + $ sudo apt-get install libev4 libev-dev + +On RHEL/CentOS/Fedora:: + + $ sudo yum install libev libev-devel + +If you're on Mac OS X, you should be able to install libev +through `Homebrew `_. For example, on Mac OS X:: + + $ brew install libev + +The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway). + +If successful, you should be able to build and install the extension +(just using ``setup.py build`` or ``setup.py install``) and then use +the libev event loop by doing the following: + +.. code-block:: python + + >>> from cassandra.io.libevreactor import LibevConnection + >>> from cassandra.cluster import Cluster + + >>> cluster = Cluster() + >>> cluster.connection_class = LibevConnection + >>> session = cluster.connect() + +(*Optional*) Configuring SSL +----------------------------- +Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. diff --git a/stable/_sources/lwt.rst.txt b/stable/_sources/lwt.rst.txt new file mode 100644 index 0000000000..2cc272f350 --- /dev/null +++ b/stable/_sources/lwt.rst.txt @@ -0,0 +1,91 @@ +Lightweight Transactions (Compare-and-set) +========================================== + +Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction. + +For pertinent execution parameters, see :attr:`.Statement.serial_consistency_level`. + +This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver. + + +Specialized Results +------------------- +The result returned from a LWT request is always a single row result. It will always have +prepended a special column named ``[applied]``. How this value appears in your results depends +on the row factory in use. See below for examples. + +The value of this ``[applied]`` column is boolean value indicating whether or not the transaction was applied. +If ``True``, it is the only column in the result. If ``False``, the additional columns depend on the LWT operation being +executed: + +- When using a ``UPDATE ... IF "col" = ...`` clause, the result will contain the ``[applied]`` column, plus the existing columns + and values for any columns in the ``IF`` clause (and thus the value that caused the transaction to fail). + +- When using ``INSERT ... IF NOT EXISTS``, the result will contain the ``[applied]`` column, plus all columns and values + of the existing row that rejected the transaction. + +- ``UPDATE .. IF EXISTS`` never has additional columns, regardless of ``[applied]`` status. + +How the ``[applied]`` column manifests depends on the row factory in use. Considering the following (initially empty) table:: + + CREATE TABLE test.t ( + k int PRIMARY KEY, + v int, + x int + ) + +... the following sections show the expected result for a number of example statements, using the three base row factories. + +named_tuple_factory (default) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The name ``[applied]`` is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting ``namedtuple``. The row always has a boolean column ``applied`` in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=True) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + Row(applied=False, k=0, v=0, x=None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + Row(applied=True) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + Row(applied=False, v=1, x=2) + +tuple_factory +~~~~~~~~~~~~~ +This return type does not refer to names, but the boolean value ``applied`` is always present in position 0:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (True,) + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + (False, 0, 0, None) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + (True,) + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + (False, 1, 2) + +dict_factory +~~~~~~~~~~~~ +The retuned ``dict`` contains the ``[applied]`` key:: + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'[applied]': True} + + >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS") + {u'x': 2, u'[applied]': False, u'v': 1} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0") + {u'x': None, u'[applied]': False, u'k': 0, u'v': 0} + + >>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1") + {u'[applied]': True} + + diff --git a/stable/_sources/object-mapper.rst.txt b/stable/_sources/object-mapper.rst.txt new file mode 100644 index 0000000000..421be246ac --- /dev/null +++ b/stable/_sources/object-mapper.rst.txt @@ -0,0 +1,105 @@ +Object Mapper +============= + +cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver + +:ref:`Jump to Getting Started ` + +Contents +-------- +:doc:`cqlengine/upgrade-guide` + For migrating projects from legacy cqlengine, to the integrated product + +:doc:`cqlengine/models` + Examples defining models, and mapping them to tables + +:doc:`cqlengine/queryset` + Overview of query sets and filtering + +:doc:`cqlengine/batches` + Working with batch mutations + +:doc:`cqlengine/connections` + Working with multiple sessions + +:ref:`API Documentation ` + Index of API documentation + +:doc:`cqlengine/third-party` + High-level examples in Celery and uWSGI + +:doc:`cqlengine/faq` + +.. toctree:: + :hidden: + + cqlengine/upgrade-guide + cqlengine/models + cqlengine/queryset + cqlengine/batches + cqlengine/connections + cqlengine/third-party + cqlengine/faq + +.. _getting-started: + +Getting Started +--------------- + +.. code-block:: python + + import uuid + from cassandra.cqlengine import columns + from cassandra.cqlengine import connection + from datetime import datetime + from cassandra.cqlengine.management import sync_table + from cassandra.cqlengine.models import Model + + #first, define a model + class ExampleModel(Model): + example_id = columns.UUID(primary_key=True, default=uuid.uuid4) + example_type = columns.Integer(index=True) + created_at = columns.DateTime() + description = columns.Text(required=False) + + #next, setup the connection to your cassandra server(s)... + # see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options + # the list of hosts will be passed to create a Cluster() instance + connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3) + + #...and create your CQL table + >>> sync_table(ExampleModel) + + #now we can create some rows: + >>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now()) + >>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now()) + >>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now()) + >>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now()) + >>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now()) + >>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now()) + >>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now()) + >>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now()) + + #and now we can run some queries against our table + >>> ExampleModel.objects.count() + 8 + >>> q = ExampleModel.objects(example_type=1) + >>> q.count() + 4 + >>> for instance in q: + >>> print instance.description + example5 + example6 + example7 + example8 + + #here we are applying additional filtering to an existing query + #query objects are immutable, so calling filter returns a new + #query object + >>> q2 = q.filter(example_id=em5.example_id) + + >>> q2.count() + 1 + >>> for instance in q2: + >>> print instance.description + example5 diff --git a/stable/_sources/performance.rst.txt b/stable/_sources/performance.rst.txt new file mode 100644 index 0000000000..f7a3f49e0f --- /dev/null +++ b/stable/_sources/performance.rst.txt @@ -0,0 +1,45 @@ +Performance Notes +================= +The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +:meth:`.Session.execute()`, you can obtain asynchronous request futures through +:meth:`.Session.execute_async()`, and you can attach a callback to the future +with :meth:`.ResponseFuture.add_callback()`. + +Examples of multiple request patterns can be found in the benchmark scripts included in the driver project. + +The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don't need to implement this pattern yourself. +:meth:`cassandra.concurrent.execute_concurrent` and :meth:`cassandra.concurrent.execute_concurrent_with_args` +provide this pattern with a synchronous API and tunable concurrency. + +Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation. + +PyPy +---- +`PyPy `_ is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads. + +Cython Extensions +----------------- +`Cython `_ is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default. + +See :doc:`installation` for details on controlling this build. + +multiprocessing +--------------- +All of the patterns discussed above may be used over multiple processes using the +`multiprocessing `_ +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option. + +Be sure to **never share any** :class:`~.Cluster`, :class:`~.Session`, +**or** :class:`~.ResponseFuture` **objects across multiple processes**. These +objects should all be created after forking the process, not before. + +For further discussion and simple examples using the driver with ``multiprocessing``, +see `this blog post `_. diff --git a/stable/_sources/query-paging.rst.txt b/stable/_sources/query-paging.rst.txt new file mode 100644 index 0000000000..23ee2c1129 --- /dev/null +++ b/stable/_sources/query-paging.rst.txt @@ -0,0 +1,95 @@ +.. _query-paging: + +Paging Large Queries +==================== +Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if :attr:`~.Cluster.protocol_version` is greater than +:const:`2` (it is by default), queries returning large result sets will be +automatically paged. + +Controlling the Page Size +------------------------- +By default, :attr:`.Session.default_fetch_size` controls how many rows will +be fetched per page. This can be overridden per-query by setting +:attr:`~.fetch_size` on a :class:`~.Statement`. By default, each page +will contain at most 5000 rows. + +Handling Paged Results +---------------------- +Whenever the number of result rows for are query exceed the page size, an +instance of :class:`~.PagedResult` will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" # users contains 100 rows + statement = SimpleStatement(query, fetch_size=10) + for user_row in session.execute(statement): + process_user(user_row) + +Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it *is* possible for +an :class:`Exception` to be raised while fetching the next page, just +like you might see on a normal call to ``session.execute()``. + +If you use :meth:`.Session.execute_async()` along with, +:meth:`.ResponseFuture.result()`, the first page will be fetched before +:meth:`~.ResponseFuture.result()` returns, but latter pages will be +transparently fetched synchronously while iterating the result. + +Handling Paged Results with Callbacks +------------------------------------- +If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows. + +Use :attr:`.ResponseFuture.has_more_pages` and +:meth:`.ResponseFuture.start_fetching_next_page()` to continue fetching +pages. For example:: + + class PagedResultHandler(object): + + def __init__(self, future): + self.error = None + self.finished_event = Event() + self.future = future + self.future.add_callbacks( + callback=self.handle_page, + errback=self.handle_err) + + def handle_page(self, rows): + for row in rows: + process_row(row) + + if self.future.has_more_pages: + self.future.start_fetching_next_page() + else: + self.finished_event.set() + + def handle_error(self, exc): + self.error = exc + self.finished_event.set() + + future = session.execute_async("SELECT * FROM users") + handler = PagedResultHandler(future) + handler.finished_event.wait() + if handler.error: + raise handler.error + +Resume Paged Results +-------------------- + +You can resume the pagination when executing a new query by using the :attr:`.ResultSet.paging_state`. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:: + + from cassandra.query import SimpleStatement + query = "SELECT * FROM users" + statement = SimpleStatement(query, fetch_size=10) + results = session.execute(statement) + + # save the paging_state somewhere and return current results + web_session['paging_state'] = results.paging_state + + + # resume the pagination sometime later... + statement = SimpleStatement(query, fetch_size=10) + ps = web_session['paging_state'] + results = session.execute(statement, paging_state=ps) diff --git a/stable/_sources/scylla-cloud-serverless.rst.txt b/stable/_sources/scylla-cloud-serverless.rst.txt new file mode 100644 index 0000000000..4e0bafd1b8 --- /dev/null +++ b/stable/_sources/scylla-cloud-serverless.rst.txt @@ -0,0 +1,49 @@ +ScyllaDB Cloud Serverless +------------------------- + +With ScyllaDB Cloud, you can deploy `serverless databases `_. +The Python driver allows you to connect to a serverless database by utilizing the connection bundle you can download via the **Connect>Python** tab in the Cloud application. +The connection bundle is a YAML file with connection and credential information for your cluster. + +Connecting to a ScyllaDB Cloud serverless database is very similar to a standard connection to a ScyllaDB database. + +Here’s a short program that connects to a ScyllaDB Cloud serverless database and prints metadata about the cluster: + +.. code-block:: python + + from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT + from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy + + PATH_TO_BUNDLE_YAML = '/file/downloaded/from/cloud/connect-bundle.yaml' + + + def get_cluster(): + profile = ExecutionProfile( + load_balancing_policy=TokenAwarePolicy( + DCAwareRoundRobinPolicy(local_dc='us-east-1') + ) + ) + + return Cluster( + execution_profiles={EXEC_PROFILE_DEFAULT: profile}, + scylla_cloud=PATH_TO_BUNDLE_YAML, + ) + + + print('Connecting to cluster') + cluster = get_cluster() + session = cluster.connect() + + print('Connected to cluster', cluster.metadata.cluster_name) + + print('Getting metadata') + for host in cluster.metadata.all_hosts(): + print('Datacenter: {}; Host: {}; Rack: {}'.format( + host.datacenter, host.address, host.rack) + ) + + cluster.shutdown() + +By providing the ``scylla_cloud`` parameter to the :class:`~.Cluster` constructor, +the driver can set up the connection based on the endpoint and credential information +stored in your downloaded ScyllaDB Cloud Serverless connection bundle. \ No newline at end of file diff --git a/stable/_sources/scylla-cloud.rst.txt b/stable/_sources/scylla-cloud.rst.txt new file mode 100644 index 0000000000..b5eb6df798 --- /dev/null +++ b/stable/_sources/scylla-cloud.rst.txt @@ -0,0 +1,5 @@ +ScyllaDB Cloud +-------------- + +To connect to a `ScyllaDB Cloud `_ cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver. diff --git a/stable/_sources/scylla-specific.rst.txt b/stable/_sources/scylla-specific.rst.txt new file mode 100644 index 0000000000..f830235088 --- /dev/null +++ b/stable/_sources/scylla-specific.rst.txt @@ -0,0 +1,111 @@ +Scylla Specific Features +======================== + +Shard Awareness +--------------- + +**scylla-driver** is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. +As a result, latency is significantly reduced because there is no need to pass data between the shards. + +Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding + +For using it you only need to enable ``TokenAwarePolicy`` on the ``Cluster`` + +See the configuration of ``native_shard_aware_transport_port`` and ``native_shard_aware_transport_port_ssl`` on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol + +.. code:: python + + from cassandra.cluster import Cluster + from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy + + cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy())) + + +New Cluster Helpers +------------------- + +* ``shard_aware_options`` + + Setting it to ``dict(disable=True)`` would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections + + Other option is to configure scylla by setting ``enable_shard_aware_drivers: false`` on scylla.yaml. + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(shard_aware_options=dict(disable=True)) + session = cluster.connect() + + assert not cluster.is_shard_aware(), "Shard aware should be disabled" + + # or just disable the shard aware port logic + cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True)) + session = cluster.connect() + +* ``cluster.is_shard_aware()`` + + New method available on ``Cluster`` allowing to check whether the remote cluster supports shard awareness (bool) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + if cluster.is_shard_aware(): + print("connected to a scylla cluster") + +* ``cluster.shard_aware_stats()`` + + New method available on ``Cluster`` allowing to check the status of shard aware connections to all available hosts (dict) + +.. code:: python + + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + + stats = cluster.shard_aware_stats() + if all([v["shards_count"] == v["connected"] for v in stats.values()]): + print("successfully connected to all shards of all scylla nodes") + + +New Error Types +-------------------- + +* ``SCYLLA_RATE_LIMIT_ERROR`` Error + + The ScyllaDB 5.1 introduced a feature called per-partition rate limiting. In case the (user defined) per-partition rate limit is exceeded, the database will start returning a Scylla-specific type of error: RateLimitReached. + +.. code:: python + + from cassandra import RateLimitReached + from cassandra.cluster import Cluster + + cluster = Cluster() + session = cluster.connect() + session.execute(""" + CREATE KEYSPACE IF NOT EXISTS keyspace1 + WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} + """) + + session.execute("USE keyspace1") + session.execute(""" + CREATE TABLE tbl (pk int PRIMARY KEY, v int) + WITH per_partition_rate_limit = {'max_writes_per_second': 1} + """) + + prepared = session.prepare(""" + INSERT INTO tbl (pk, v) VALUES (?, ?) + """) + + try: + for _ in range(1000): + self.session.execute(prepared.bind((123, 456))) + except RateLimitReached: + raise diff --git a/stable/_sources/security.rst.txt b/stable/_sources/security.rst.txt new file mode 100644 index 0000000000..c30189562f --- /dev/null +++ b/stable/_sources/security.rst.txt @@ -0,0 +1,421 @@ +.. _security: + +Security +======== +The two main security components you will use with the +Python driver are Authentication and SSL. + +Authentication +-------------- +Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when :attr:`~.Cluster.protocol_version` +is set to 2 or higher. To use this authentication, set +:attr:`~.Cluster.auth_provider` to an instance of a subclass +of :class:`~cassandra.auth.AuthProvider`. When working +with Cassandra's ``PasswordAuthenticator``, you can use +the :class:`~cassandra.auth.PlainTextAuthProvider` class. + +For example, suppose Cassandra is setup with its default +'cassandra' user with a password of 'cassandra': + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import PlainTextAuthProvider + + auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra') + cluster = Cluster(auth_provider=auth_provider, protocol_version=2) + + + +Custom Authenticators +^^^^^^^^^^^^^^^^^^^^^ +If you're using something other than Cassandra's ``PasswordAuthenticator``, +:class:`~.SaslAuthProvider` is provided for generic SASL authentication mechanisms, +utilizing the ``pure-sasl`` package. +If these do not suit your needs, you may need to create your own subclasses of +:class:`~.AuthProvider` and :class:`~.Authenticator`. You can use the Sasl classes +as example implementations. + +Protocol v1 Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ +When working with Cassandra 1.2 (or a higher version with +:attr:`~.Cluster.protocol_version` set to ``1``), you will not pass in +an :class:`~.AuthProvider` instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a ``username`` and ``password`` key: + +.. code-block:: python + + from cassandra.cluster import Cluster + + def get_credentials(host_address): + return {'username': 'joe', 'password': '1234'} + + cluster = Cluster(auth_provider=get_credentials, protocol_version=1) + +SSL +--- +SSL should be used when client encryption is enabled in Cassandra. + +To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created `SSLContext` instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the `ssl.SSLContext `_ documentation +gives a more complete description of what is possible. + +To enable SSL with version 3.17.0 and higher, you will need to set :attr:`.Cluster.ssl_context` to a +``ssl.SSLContext`` instance to enable SSL. Optionally, you can also set :attr:`.Cluster.ssl_options` +to a dict of options. These will be passed as kwargs to ``ssl.SSLContext.wrap_socket()`` +when new sockets are created. + +If you create your SSLContext using `ssl.create_default_context `_, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own :class:`~.connection.EndPoint` and +:class:`~.connection.EndPointFactory`. + + +The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions: + +* `Setup SSL Cert `_ + +It might be also useful to learn about the different levels of identity verification to understand the examples: + +* `Using SSL in DSE drivers `_ + +SSL with Twisted or Eventlet +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your `Cluster`'s connection class is +:class:`~cassandra.io.twistedreactor.TwistedConnection` or :class:`~cassandra.io.eventletreactor.EventletConnection`, you must pass a +`pyOpenSSL context `_ instead. +An example is provided in these docs, and more details can be found in the +`documentation `_. +pyOpenSSL is not installed by the driver and must be installed separately. + +SSL Configuration Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Here, we'll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We'll also include Python code demonstrating how to use servers and drivers configured in these ways. + +.. _ssl-no-identify-verification: + +No identity verification +++++++++++++++++++++++++ + +No identity verification at all. Note that this is not recommended for for production deployments. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +The driver configuration: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS + + ssl_context = SSLContext(PROTOCOL_TLS) + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +.. _ssl-client-verifies-server: + +Client verifies server +++++++++++++++++++++++ + +Ensure the python driver verifies the identity of the server. + +The Cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: false + +For the driver configuration, it's very important to set `ssl_context.verify_mode` +to `CERT_REQUIRED`. Otherwise, the loaded verify certificate will have no effect: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context) + session = cluster.connect() + +Additionally, you can also force the driver to verify the `hostname` of the server by passing additional options to `ssl_context.wrap_socket` via the `ssl_options` kwarg: + +.. code-block:: python + + from cassandra.cluster import Cluster, Session + from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED + + ssl_context = SSLContext(PROTOCOL_TLS) + ssl_context.load_verify_locations('/path/to/rootca.crt') + ssl_context.verify_mode = CERT_REQUIRED + ssl_context.check_hostname = True + ssl_options = {'server_hostname': '127.0.0.1'} + + cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options) + session = cluster.connect() + +.. _ssl-server-verifies-client: + +Server verifies client +++++++++++++++++++++++ + +If Cassandra is configured to verify clients (``require_client_auth``), you need to generate +SSL key and certificate files. + +The cassandra configuration:: + + client_encryption_options: + enabled: true + keystore: /path/to/127.0.0.1.keystore + keystore_password: myStorePass + require_client_auth: true + truststore: /path/to/dse-truststore.jks + truststore_password: myStorePass + +The Python ``ssl`` APIs require the certificate in PEM format. First, create a certificate +conf file: + +.. code-block:: bash + + cat > gen_client_cert.conf <`__ +for more details about ``SSLContext`` configuration. + +**Server verifies client and client verifies server using Twisted and pyOpenSSL** + +.. code-block:: python + + from OpenSSL import SSL, crypto + from cassandra.cluster import Cluster + from cassandra.io.twistedreactor import TwistedConnection + + ssl_context = SSL.Context(SSL.TLSv1_2_METHOD) + ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok) + ssl_context.use_certificate_file('/path/to/client.crt_signed') + ssl_context.use_privatekey_file('/path/to/client.key') + ssl_context.load_verify_locations('/path/to/rootca.crt') + + cluster = Cluster( + contact_points=['127.0.0.1'], + connection_class=TwistedConnection, + ssl_context=ssl_context, + ssl_options={'check_hostname': True} + ) + session = cluster.connect() + + +Connecting using Eventlet would look similar except instead of importing and using ``TwistedConnection``, you would +import and use ``EventletConnection``, including the appropriate monkey-patching. + +Versions 3.16.0 and lower +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To enable SSL you will need to set :attr:`.Cluster.ssl_options` to a +dict of options. These will be passed as kwargs to ``ssl.wrap_socket()`` +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release. + +By default, a ``ca_certs`` value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ``ssl_version`` as ``ssl.PROTOCOL_TLS`` to match +Cassandra's default protocol. + +For example: + +.. code-block:: python + + from cassandra.cluster import Cluster + from ssl import PROTOCOL_TLS, CERT_REQUIRED + + ssl_opts = { + 'ca_certs': '/path/to/my/ca.certs', + 'ssl_version': PROTOCOL_TLS, + 'cert_reqs': CERT_REQUIRED # Certificates are required and validated + } + cluster = Cluster(ssl_options=ssl_opts) + +This is only an example to show how to pass the ssl parameters. Consider reading +the `python ssl documentation `__ for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +`Using SSL with the DataStax Python driver `_. + +SSL with Twisted +++++++++++++++++ + +In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ``ssl_version`` and ``cert_reqs`` in ``ssl_opts`` the appropriate constants from pyOpenSSL are expected. + +DSE Authentication +------------------ +When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:: + + from cassandra.auth import DSEGSSAPIAuthProvider + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"]) + cluster = Cluster(auth_provider=auth_provider) + session = cluster.connect() + +Implementations are :attr:`.DSEPlainTextAuthProvider`, :class:`.DSEGSSAPIAuthProvider` and :class:`.SaslAuthProvider`. + +DSE Unified Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With DSE (>=5.1), unified Authentication allows you to: + +* Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id. +* Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id. + +Proxy Login ++++++++++++ + +Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the `server` user to authenticate as usual but use the authorization of `user1`: + +.. code-block:: text + + GRANT PROXY.LOGIN on role user1 to server + +then you can do the proxy authentication.... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import SaslAuthProvider + + sasl_kwargs = { + "service": 'dse', + "mechanism":"PLAIN", + "username": 'server', + 'password': 'server', + 'authorization_id': 'user1' + } + + auth_provider = SaslAuthProvider(**sasl_kwargs) + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + +If you are using kerberos, you can use directly :class:`.DSEGSSAPIAuthProvider` and pass the authorization_id, like this: + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEGSSAPIAuthProvider + + # Ensure the kerberos ticket of the server user is set with the kinit utility. + auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM", + authorization_id='user1@DATASTAX.COM') + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute(...) # all requests will be executed as 'user1' + + +Proxy Execute ++++++++++++++ + +Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the `server` user to execute requests as `user1`: + +.. code-block:: text + + GRANT PROXY.EXECUTE on role user1 to server + +then you can do a proxy execute... + +.. code-block:: python + + from cassandra.cluster import Cluster + from cassandra.auth import DSEPlainTextAuthProvider, + + auth_provider = DSEPlainTextAuthProvider('server', 'server') + + c = Cluster(auth_provider=auth_provider) + s = c.connect() + s.execute('select * from k.t;', execute_as='user1') # the request will be executed as 'user1' + +Please see the `official documentation `_ for more details on the feature and configuration process. diff --git a/stable/_sources/upgrading.rst.txt b/stable/_sources/upgrading.rst.txt new file mode 100644 index 0000000000..bc963e6722 --- /dev/null +++ b/stable/_sources/upgrading.rst.txt @@ -0,0 +1,380 @@ +Upgrading +========= + +.. toctree:: + :maxdepth: 1 + +Installation +^^^^^^^^^^^^ + +Only the `scylla-driver` package should be installed. `dse-driver` and `dse-graph` +are not required anymore:: + + pip install scylla-driver + +If you need the Graph *Fluent* API (features provided by dse-graph):: + + pip install scylla-driver[graph] + +See :doc:`installation` for more details. + +Import from the cassandra module +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +There is no `dse` module, so you should import from the `cassandra` module. You +need to change only the first module of your import statements, not the submodules. + +.. code-block:: python + + from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from dse.auth import PlainTextAuthProvider + from dse.policies import WhiteListRoundRobinPolicy + + # becomes + + from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT + from cassandra.auth import PlainTextAuthProvider + from cassandra.policies import WhiteListRoundRobinPolicy + +Also note that the cassandra.hosts module doesn't exist in scylla-driver. This +module is named cassandra.pool. + +dse-graph +^^^^^^^^^ + +dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements: + +.. code-block:: python + + from dse_graph import .. + from dse_graph.query import .. + + # becomes + + from cassandra.datastax.graph.fluent import .. + from cassandra.datastax.graph.fluent.query import .. + +See :mod:`~.datastax.graph.fluent`. + +Session.execute and Session.execute_async API +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Although it is not common to use this API with positional arguments, it is +important to be aware that the `host` and `execute_as` parameters have had +their positional order swapped. This is only because `execute_as` was added +in dse-driver before `host`. + +See :meth:`.Session.execute`. + +Deprecations +^^^^^^^^^^^^ + +These changes are optional, but recommended: + +* Importing from `cassandra.graph` is deprecated. Consider importing from `cassandra.datastax.graph`. +* Use :class:`~.policies.DefaultLoadBalancingPolicy` instead of DSELoadBalancingPolicy. + +Upgrading to 3.0 +---------------- +Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider: + +Default consistency is now ``LOCAL_ONE`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Previous value was ``ONE``. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers. + +Execution API Updates +^^^^^^^^^^^^^^^^^^^^^ +Result return normalization +--------------------------- +`PYTHON-368 `_ + +Previously results would be returned as a ``list`` of rows for result rows +up to ``fetch_size``, and ``PagedResult`` afterward. This could break +application code that assumed one type and got another. + +Now, all results are returned as an iterable :class:`~.ResultSet`. + +The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed. + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + for row in results: + process(row) + +If the expected size of the results is known, it is still possible to +materialize a list using the iterator: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + row_list = list(results) + +For backward compatibility, :class:`~.ResultSet` supports indexing. When +accessed at an index, a `~.ResultSet` object will materialize all its pages: + +.. code-block:: python + + results = session.execute("SELECT * FROM system.local") + first_result = results[0] # materializes results, fetching all pages + +This can send requests and load (possibly large) results into memory, so +`~.ResultSet` will log a warning on implicit materialization. + +Trace information is not attached to executed Statements +-------------------------------------------------------- +`PYTHON-318 `_ + +Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions. + +Now, trace data is associated with the ``ResponseFuture`` and ``ResultSet`` +returned for each query: + +:meth:`.ResponseFuture.get_query_trace()` + +:meth:`.ResponseFuture.get_all_query_traces()` + +:meth:`.ResultSet.get_query_trace()` + +:meth:`.ResultSet.get_all_query_traces()` + +Binding named parameters now ignores extra names +------------------------------------------------ +`PYTHON-178 `_ + +Previously, :meth:`.BoundStatement.bind()` would raise if a mapping +was passed with extra names not found in the prepared statement. + +Behavior in 3.0+ is to ignore extra names. + +blist removed as soft dependency +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-385 `_ + +Previously the driver had a soft dependency on ``blist sortedset``, using +that where available and using an internal fallback where possible. + +Now, the driver never chooses the ``blist`` variant, instead returning the +internal :class:`.util.SortedSet` for all ``set`` results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for ``sortedset`` type. + +Metadata API Updates +^^^^^^^^^^^^^^^^^^^^ +`PYTHON-276 `_, `PYTHON-408 `_, `PYTHON-400 `_, `PYTHON-422 `_ + +Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model. + +The present API is documented: :any:`cassandra.metadata`. Changes highlighted below: + +* All types are now exposed as CQL types instead of types derived from the internal server implementation +* Some metadata attributes have changed names to match current nomenclature (for example, :attr:`.Index.kind` in place of ``Index.type``). +* Some metadata attributes removed + + * ``TableMetadata.keyspace`` reference replaced with :attr:`.TableMetadata.keyspace_name` + * ``ColumnMetadata.index`` is removed table- and keyspace-level mappings are still maintained + +Several deprecated features are removed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +`PYTHON-292 `_ + +* ``ResponseFuture.result`` timeout parameter is removed, use ``Session.execute`` timeout instead (`031ebb0 `_) +* ``Cluster.refresh_schema`` removed, use ``Cluster.refresh_*_metadata`` instead (`419fcdf `_) +* ``Cluster.submit_schema_refresh`` removed (`574266d `_) +* ``cqltypes`` time/date functions removed, use ``util`` entry points instead (`bb984ee `_) +* ``decoder`` module removed (`e16a073 `_) +* ``TableMetadata.keyspace`` attribute replaced with ``keyspace_name`` (`cc94073 `_) +* ``cqlengine.columns.TimeUUID.from_datetime`` removed, use ``util`` variant instead (`96489cc `_) +* ``cqlengine.columns.Float(double_precision)`` parameter removed, use ``columns.Double`` instead (`a2d3a98 `_) +* ``cqlengine`` keyspace management functions are removed in favor of the strategy-specific entry points (`4bd5909 `_) +* ``cqlengine.Model.__polymorphic_*__`` attributes removed, use ``__discriminator*`` attributes instead (`9d98c8e `_) +* ``cqlengine.statements`` will no longer warn about list list prepend behavior (`79efe97 `_) + + +Upgrading to 2.1 from 2.0 +------------------------- +Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol. + +Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available. + +Using the v3 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the :attr:`~.Cluster.protocol_version`: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=3) + +Note that protocol version 3 is only supported by Cassandra 2.1+. + +In future releases, the driver may default to using protocol version +3. + +Working with User-Defined Types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Cassandra 2.1 introduced the ability to define new types:: + + USE KEYSPACE mykeyspace; + + CREATE TYPE address (street text, city text, zip int); + +The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with :meth:`.Cluster.register_user_type`: + +.. code-block:: python + + cluster = Cluster() + + class Address(object): + + def __init__(self, street, city, zipcode): + self.street = street + self.city = text + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + +When inserting data for ``address`` columns, you should pass in +instances of ``Address``. When querying data, ``address`` column +values will be instances of ``Address``. + +If no class is registered for a user-defined type, query results +will use a ``namedtuple`` class and data may only be inserted +though prepared statements. + +See :ref:`udts` for more details. + +Customizing Encoders for Non-prepared Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-:class:`~.Session` +basis through :attr:`.Session.encoder`: + +.. code-block:: python + + cluster = Cluster() + session = cluster.connect() + session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple + +See :ref:`type-conversions` for the table of default CQL literal conversions. + +Using Client-Side Protocol-Level Timestamps +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.) + +When :attr:`~.Cluster.protocol_version` is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless :attr:`.Session.use_client_timestamp` is changed to :const:`False`. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver. + +Upgrading to 2.0 from 1.x +------------------------- +Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported. + +Using the v2 Native Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +By default, the driver will attempt to use version 2 of Cassandra's +native protocol. You can explicitly set the protocol version to +2, though: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=2) + +When working with Cassandra 1.2, you will need to +explicitly set the :attr:`~.Cluster.protocol_version` to 1: + +.. code-block:: python + + from cassandra.cluster import Cluster + + cluster = Cluster(protocol_version=1) + +Automatic Query Paging +^^^^^^^^^^^^^^^^^^^^^^ +Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler. + +See :ref:`query-paging` for full details. + +Protocol-Level Batch Statements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +With version 1 of the native protocol, batching of statements required +using a `BATCH cql query `_. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch. + +See :class:`~.query.BatchStatement` for details and usage examples. + +SASL-based Authentication +^^^^^^^^^^^^^^^^^^^^^^^^^ +Also new in version 2 of the native protocol is SASL-based authentication. +See the section on :ref:`security` for details and examples. + +Lightweight Transactions +^^^^^^^^^^^^^^^^^^^^^^^^ +`Lightweight transactions `_ are another new feature. To use lightweight transactions, add ``IF`` clauses +to your CQL queries and set the :attr:`~.Statement.serial_consistency_level` +on your statements. + +Calling Cluster.shutdown() +^^^^^^^^^^^^^^^^^^^^^^^^^^ +In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call :meth:`.Cluster.shutdown()` +on your :class:`~.Cluster` objects when you are through with them. +This helps to guarantee a clean shutdown. + +Deprecations +^^^^^^^^^^^^ +The following functions have moved from ``cassandra.decoder`` to ``cassandra.query``. +The original functions have been left in place with a :exc:`DeprecationWarning` for +now: + +* :attr:`cassandra.decoder.tuple_factory` has moved to + :attr:`cassandra.query.tuple_factory` +* :attr:`cassandra.decoder.named_tuple_factory` has moved to + :attr:`cassandra.query.named_tuple_factory` +* :attr:`cassandra.decoder.dict_factory` has moved to + :attr:`cassandra.query.dict_factory` +* :attr:`cassandra.decoder.ordered_dict_factory` has moved to + :attr:`cassandra.query.ordered_dict_factory` + +Dependency Changes +^^^^^^^^^^^^^^^^^^ +The following dependencies have officially been made optional: + +* ``scales`` +* ``blist`` + +And one new dependency has been added (to enable Python 3 support): + +* ``six`` diff --git a/stable/_sources/user-defined-types.rst.txt b/stable/_sources/user-defined-types.rst.txt new file mode 100644 index 0000000000..32c03e37e8 --- /dev/null +++ b/stable/_sources/user-defined-types.rst.txt @@ -0,0 +1,118 @@ +.. _udts: + +User Defined Types +================== +Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through ``CREATE TYPE`` statements in CQL:: + + CREATE TYPE address (street text, zip int); + +Version 2.1 of the Python driver adds support for user-defined types. + +Registering a UDT +----------------- +You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your :class:`~.Cluster` +instance through :meth:`.Cluster.register_user_type`: + + +Map a Class to a UDT +++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
                    )") + + # create a class to map to the "address" UDT + class Address(object): + + def __init__(self, street, zipcode): + self.street = street + self.zipcode = zipcode + + cluster.register_user_type('mykeyspace', 'address', Address) + + # insert a row using an instance of Address + session.execute("INSERT INTO users (id, location) VALUES (%s, %s)", + (0, Address("123 Main St.", 78723))) + + # results will include Address instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location.street, row.location.zipcode) + +Map a dict to a UDT ++++++++++++++++++++ + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
                    )") + + cluster.register_user_type('mykeyspace', 'address', dict) + + # insert a row using a prepared statement and a tuple + insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)") + session.execute(insert_statement, [0, ("123 Main St.", 78723)]) + + # results will include dict instances + results = session.execute("SELECT * FROM users") + row = results[0] + print(row.id, row.location['street'], row.location['zipcode']) + +Using UDTs Without Registering Them +----------------------------------- +Although it is recommended to register your types with +:meth:`.Cluster.register_user_type`, the driver gives you some options +for working with unregistered UDTS. + +When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT: + +.. code-block:: python + + cluster = Cluster(protocol_version=3) + session = cluster.connect() + session.set_keyspace('mykeyspace') + session.execute("CREATE TYPE address (street text, zipcode int)") + session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen
                    )") + + class Foo(object): + + def __init__(self, street, zipcode, otherstuff): + self.street = street + self.zipcode = zipcode + self.otherstuff = otherstuff + + insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)") + + # since we're using a prepared statement, we don't *have* to register + # a class to map to the UDT to insert data. The object just needs to have + # "street" and "zipcode" attributes (which Foo does): + session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")]) + + # when we query data, UDT columns that don't have a class registered + # will be returned as namedtuples: + results = session.execute("SELECT * FROM users") + first_row = results[0] + address = first_row.location + print(address) # prints "Address(street='123 Main St.', zipcode=78723)" + street = address.street + zipcode = address.street + +As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, **you must register a +class to insert UDT columns with unprepared statements**.\* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return ``namedtuple`` instances (just like prepared statements do). + +\* this applies to *parameterized* unprepared statements, in which the driver will be formatting parameters -- not statements with interpolated UDT literals. diff --git a/stable/_static/basic.css b/stable/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/stable/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/stable/_static/check-solid.svg b/stable/_static/check-solid.svg new file mode 100644 index 0000000000..92fad4b5c0 --- /dev/null +++ b/stable/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/clipboard.min.js b/stable/_static/clipboard.min.js new file mode 100644 index 0000000000..54b3c46381 --- /dev/null +++ b/stable/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/stable/_static/copybutton.css b/stable/_static/copybutton.css new file mode 100644 index 0000000000..f1916ec7d1 --- /dev/null +++ b/stable/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                    Short

                    + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/stable/_static/copybutton.js b/stable/_static/copybutton.js new file mode 100644 index 0000000000..2ea7ff3e21 --- /dev/null +++ b/stable/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/stable/_static/copybutton_funcs.js b/stable/_static/copybutton_funcs.js new file mode 100644 index 0000000000..dbe1aaad79 --- /dev/null +++ b/stable/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/stable/_static/css/main.css b/stable/_static/css/main.css new file mode 100644 index 0000000000..65eb0a5536 --- /dev/null +++ b/stable/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/stable/_static/doctools.js b/stable/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/stable/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/stable/_static/documentation_options.js b/stable/_static/documentation_options.js new file mode 100644 index 0000000000..52b149be9b --- /dev/null +++ b/stable/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.26.4', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/stable/_static/file.png b/stable/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/stable/_static/file.png differ diff --git a/stable/_static/img/banner-background.svg b/stable/_static/img/banner-background.svg new file mode 100644 index 0000000000..f8520d5b3e --- /dev/null +++ b/stable/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/favicon-228x228.png b/stable/_static/img/favicon-228x228.png new file mode 100644 index 0000000000..f30770c7ed Binary files /dev/null and b/stable/_static/img/favicon-228x228.png differ diff --git a/stable/_static/img/favicon-32x32.png b/stable/_static/img/favicon-32x32.png new file mode 100644 index 0000000000..aae1708f26 Binary files /dev/null and b/stable/_static/img/favicon-32x32.png differ diff --git a/stable/_static/img/favicon.ico b/stable/_static/img/favicon.ico new file mode 100644 index 0000000000..6c7484f082 Binary files /dev/null and b/stable/_static/img/favicon.ico differ diff --git a/stable/_static/img/icons/icon-about-team.svg b/stable/_static/img/icons/icon-about-team.svg new file mode 100644 index 0000000000..5448c7f007 --- /dev/null +++ b/stable/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/stable/_static/img/icons/icon-about-us-m.svg b/stable/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 0000000000..09107d9520 --- /dev/null +++ b/stable/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-about-us.svg b/stable/_static/img/icons/icon-about-us.svg new file mode 100644 index 0000000000..1b1fcc83e3 --- /dev/null +++ b/stable/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-alternator.svg b/stable/_static/img/icons/icon-alternator.svg new file mode 100644 index 0000000000..7c2b4ebae0 --- /dev/null +++ b/stable/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-apps.svg b/stable/_static/img/icons/icon-apps.svg new file mode 100644 index 0000000000..7e93612026 --- /dev/null +++ b/stable/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-architecture.svg b/stable/_static/img/icons/icon-architecture.svg new file mode 100644 index 0000000000..67ebbc2f38 --- /dev/null +++ b/stable/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/stable/_static/img/icons/icon-benchmarks.svg b/stable/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 0000000000..e1ce2c1d78 --- /dev/null +++ b/stable/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/stable/_static/img/icons/icon-blog.svg b/stable/_static/img/icons/icon-blog.svg new file mode 100644 index 0000000000..f4096cbf11 --- /dev/null +++ b/stable/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/stable/_static/img/icons/icon-careers.svg b/stable/_static/img/icons/icon-careers.svg new file mode 100644 index 0000000000..2a7c6ea0b7 --- /dev/null +++ b/stable/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/stable/_static/img/icons/icon-chevron-left.svg b/stable/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 0000000000..3afa25c481 --- /dev/null +++ b/stable/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-chevron-right.svg b/stable/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 0000000000..44eb829cdc --- /dev/null +++ b/stable/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-circe.svg b/stable/_static/img/icons/icon-circe.svg new file mode 100644 index 0000000000..875e421670 --- /dev/null +++ b/stable/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-clock.svg b/stable/_static/img/icons/icon-clock.svg new file mode 100644 index 0000000000..8c92469808 --- /dev/null +++ b/stable/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-close.svg b/stable/_static/img/icons/icon-close.svg new file mode 100644 index 0000000000..d1162b73e7 --- /dev/null +++ b/stable/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-cloud-docs.svg b/stable/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 0000000000..a9069bb6e5 --- /dev/null +++ b/stable/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-cloud.svg b/stable/_static/img/icons/icon-cloud.svg new file mode 100644 index 0000000000..cfb2318dae --- /dev/null +++ b/stable/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-comparison.svg b/stable/_static/img/icons/icon-comparison.svg new file mode 100644 index 0000000000..49d809a5df --- /dev/null +++ b/stable/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/stable/_static/img/icons/icon-contact-us.svg b/stable/_static/img/icons/icon-contact-us.svg new file mode 100644 index 0000000000..9df3145dd2 --- /dev/null +++ b/stable/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/stable/_static/img/icons/icon-developers-blog.svg b/stable/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 0000000000..ee804197a0 --- /dev/null +++ b/stable/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/stable/_static/img/icons/icon-docs.svg b/stable/_static/img/icons/icon-docs.svg new file mode 100644 index 0000000000..5501492f3e --- /dev/null +++ b/stable/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/stable/_static/img/icons/icon-enterprise-m.svg b/stable/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 0000000000..97be900b50 --- /dev/null +++ b/stable/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-enterprise.svg b/stable/_static/img/icons/icon-enterprise.svg new file mode 100644 index 0000000000..ee1ac26283 --- /dev/null +++ b/stable/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-events.svg b/stable/_static/img/icons/icon-events.svg new file mode 100644 index 0000000000..ba5f211864 --- /dev/null +++ b/stable/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/stable/_static/img/icons/icon-exclamation.svg b/stable/_static/img/icons/icon-exclamation.svg new file mode 100644 index 0000000000..a7eb4b77a4 --- /dev/null +++ b/stable/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-expand.svg b/stable/_static/img/icons/icon-expand.svg new file mode 100644 index 0000000000..3806565367 --- /dev/null +++ b/stable/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/stable/_static/img/icons/icon-forum.svg b/stable/_static/img/icons/icon-forum.svg new file mode 100644 index 0000000000..37a709f7a8 --- /dev/null +++ b/stable/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-getting-started.svg b/stable/_static/img/icons/icon-getting-started.svg new file mode 100644 index 0000000000..702500be40 --- /dev/null +++ b/stable/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-glossary.svg b/stable/_static/img/icons/icon-glossary.svg new file mode 100644 index 0000000000..e8329c2afe --- /dev/null +++ b/stable/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-home.svg b/stable/_static/img/icons/icon-home.svg new file mode 100644 index 0000000000..f0b9c25419 --- /dev/null +++ b/stable/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-infoworld.svg b/stable/_static/img/icons/icon-infoworld.svg new file mode 100644 index 0000000000..906e87279c --- /dev/null +++ b/stable/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/stable/_static/img/icons/icon-integrations.svg b/stable/_static/img/icons/icon-integrations.svg new file mode 100644 index 0000000000..1ef0920d49 --- /dev/null +++ b/stable/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-knowledge-base.svg b/stable/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 0000000000..884451270d --- /dev/null +++ b/stable/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-less.svg b/stable/_static/img/icons/icon-less.svg new file mode 100644 index 0000000000..3094127dec --- /dev/null +++ b/stable/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stable/_static/img/icons/icon-live-test.svg b/stable/_static/img/icons/icon-live-test.svg new file mode 100644 index 0000000000..dcb5916c26 --- /dev/null +++ b/stable/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/stable/_static/img/icons/icon-mail-list.svg b/stable/_static/img/icons/icon-mail-list.svg new file mode 100644 index 0000000000..0e6192a352 --- /dev/null +++ b/stable/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-manager.svg b/stable/_static/img/icons/icon-manager.svg new file mode 100644 index 0000000000..02b4e425be --- /dev/null +++ b/stable/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/stable/_static/img/icons/icon-memory-management.svg b/stable/_static/img/icons/icon-memory-management.svg new file mode 100644 index 0000000000..e34eb4504f --- /dev/null +++ b/stable/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/stable/_static/img/icons/icon-modeling.svg b/stable/_static/img/icons/icon-modeling.svg new file mode 100644 index 0000000000..97fa3a0e21 --- /dev/null +++ b/stable/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-monitoring.svg b/stable/_static/img/icons/icon-monitoring.svg new file mode 100644 index 0000000000..80b3787f66 --- /dev/null +++ b/stable/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/stable/_static/img/icons/icon-networking.svg b/stable/_static/img/icons/icon-networking.svg new file mode 100644 index 0000000000..40a3fd5f6f --- /dev/null +++ b/stable/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/stable/_static/img/icons/icon-news.svg b/stable/_static/img/icons/icon-news.svg new file mode 100644 index 0000000000..a952b59937 --- /dev/null +++ b/stable/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/stable/_static/img/icons/icon-newsletter.svg b/stable/_static/img/icons/icon-newsletter.svg new file mode 100644 index 0000000000..5b8d47eb15 --- /dev/null +++ b/stable/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/stable/_static/img/icons/icon-nsql-guides.svg b/stable/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 0000000000..60ebab3795 --- /dev/null +++ b/stable/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/stable/_static/img/icons/icon-open-source.svg b/stable/_static/img/icons/icon-open-source.svg new file mode 100644 index 0000000000..98c2ea7d5b --- /dev/null +++ b/stable/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/stable/_static/img/icons/icon-operator.svg b/stable/_static/img/icons/icon-operator.svg new file mode 100644 index 0000000000..bb7d8d3ea8 --- /dev/null +++ b/stable/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-overview.svg b/stable/_static/img/icons/icon-overview.svg new file mode 100644 index 0000000000..515c1528a2 --- /dev/null +++ b/stable/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/stable/_static/img/icons/icon-partners.svg b/stable/_static/img/icons/icon-partners.svg new file mode 100644 index 0000000000..d0146fc497 --- /dev/null +++ b/stable/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/stable/_static/img/icons/icon-plus.svg b/stable/_static/img/icons/icon-plus.svg new file mode 100644 index 0000000000..5757435085 --- /dev/null +++ b/stable/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stable/_static/img/icons/icon-pricing.svg b/stable/_static/img/icons/icon-pricing.svg new file mode 100644 index 0000000000..74b01db168 --- /dev/null +++ b/stable/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/stable/_static/img/icons/icon-release-notes.svg b/stable/_static/img/icons/icon-release-notes.svg new file mode 100644 index 0000000000..80c490c7b0 --- /dev/null +++ b/stable/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/stable/_static/img/icons/icon-resource-center.svg b/stable/_static/img/icons/icon-resource-center.svg new file mode 100644 index 0000000000..6e3ab08e79 --- /dev/null +++ b/stable/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/stable/_static/img/icons/icon-roadmap.svg b/stable/_static/img/icons/icon-roadmap.svg new file mode 100644 index 0000000000..c8cbf67c8c --- /dev/null +++ b/stable/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/stable/_static/img/icons/icon-search.svg b/stable/_static/img/icons/icon-search.svg new file mode 100644 index 0000000000..81aae93eef --- /dev/null +++ b/stable/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/img/icons/icon-slack.svg b/stable/_static/img/icons/icon-slack.svg new file mode 100644 index 0000000000..fc164ea1e7 --- /dev/null +++ b/stable/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-stack-overflow.svg b/stable/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 0000000000..bebe9b8274 --- /dev/null +++ b/stable/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/img/icons/icon-summit.svg b/stable/_static/img/icons/icon-summit.svg new file mode 100644 index 0000000000..4b900bd0c0 --- /dev/null +++ b/stable/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-support.svg b/stable/_static/img/icons/icon-support.svg new file mode 100644 index 0000000000..a4228b34e8 --- /dev/null +++ b/stable/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/stable/_static/img/icons/icon-tech-talks.svg b/stable/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 0000000000..df42b5522b --- /dev/null +++ b/stable/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/stable/_static/img/icons/icon-testing.svg b/stable/_static/img/icons/icon-testing.svg new file mode 100644 index 0000000000..2fe54efdbc --- /dev/null +++ b/stable/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/stable/_static/img/icons/icon-thumbs-down.svg b/stable/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 0000000000..3e7bcd6d90 --- /dev/null +++ b/stable/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-thumbs-up.svg b/stable/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 0000000000..226c44d853 --- /dev/null +++ b/stable/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-tip.svg b/stable/_static/img/icons/icon-tip.svg new file mode 100644 index 0000000000..bf7aa6af84 --- /dev/null +++ b/stable/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/stable/_static/img/icons/icon-training.svg b/stable/_static/img/icons/icon-training.svg new file mode 100644 index 0000000000..08b95a88ed --- /dev/null +++ b/stable/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/stable/_static/img/icons/icon-triangle-down.svg b/stable/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 0000000000..e8ae088106 --- /dev/null +++ b/stable/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-university.svg b/stable/_static/img/icons/icon-university.svg new file mode 100644 index 0000000000..f7547ab959 --- /dev/null +++ b/stable/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/stable/_static/img/icons/icon-users-blog.svg b/stable/_static/img/icons/icon-users-blog.svg new file mode 100644 index 0000000000..47e56cddcf --- /dev/null +++ b/stable/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/stable/_static/img/icons/icon-warning.svg b/stable/_static/img/icons/icon-warning.svg new file mode 100644 index 0000000000..e4b1d40331 --- /dev/null +++ b/stable/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-webinars.svg b/stable/_static/img/icons/icon-webinars.svg new file mode 100644 index 0000000000..5e9f5cd427 --- /dev/null +++ b/stable/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/stable/_static/img/icons/icon-whitepapers.svg b/stable/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 0000000000..3351e51d23 --- /dev/null +++ b/stable/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/stable/_static/img/icons/icon-workshop.svg b/stable/_static/img/icons/icon-workshop.svg new file mode 100644 index 0000000000..5206e58e98 --- /dev/null +++ b/stable/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/logo-docs.svg b/stable/_static/img/logo-docs.svg new file mode 100644 index 0000000000..4fff669cb6 --- /dev/null +++ b/stable/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/logo-scylla-horizontal-RGB.svg b/stable/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 0000000000..b5022d7c4d --- /dev/null +++ b/stable/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/mascots/404.jpg b/stable/_static/img/mascots/404.jpg new file mode 100644 index 0000000000..769fa0889f Binary files /dev/null and b/stable/_static/img/mascots/404.jpg differ diff --git a/stable/_static/img/mascots/scylla-3monsters.png b/stable/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 0000000000..7c06d01674 Binary files /dev/null and b/stable/_static/img/mascots/scylla-3monsters.png differ diff --git a/stable/_static/img/mascots/scylla-advisor-crystal.png b/stable/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 0000000000..d33fddd62f Binary files /dev/null and b/stable/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/stable/_static/img/mascots/scylla-alternator.svg b/stable/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 0000000000..0462f893d5 --- /dev/null +++ b/stable/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/stable/_static/img/mascots/scylla-cloud.svg b/stable/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 0000000000..a6c6a26fc9 --- /dev/null +++ b/stable/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/stable/_static/img/mascots/scylla-computer-3-monsters.png b/stable/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 0000000000..d0368a7027 Binary files /dev/null and b/stable/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/stable/_static/img/mascots/scylla-computer-headset.png b/stable/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 0000000000..0cdadaa216 Binary files /dev/null and b/stable/_static/img/mascots/scylla-computer-headset.png differ diff --git a/stable/_static/img/mascots/scylla-cup-number-one.png b/stable/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 0000000000..e889f4e368 Binary files /dev/null and b/stable/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/stable/_static/img/mascots/scylla-docs.svg b/stable/_static/img/mascots/scylla-docs.svg new file mode 100644 index 0000000000..a5bce950c2 --- /dev/null +++ b/stable/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/stable/_static/img/mascots/scylla-drivers.svg b/stable/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 0000000000..6012e71679 --- /dev/null +++ b/stable/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/stable/_static/img/mascots/scylla-enterprise.svg b/stable/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 0000000000..a1aa0b46ac --- /dev/null +++ b/stable/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/stable/_static/img/mascots/scylla-forklift-boxes.png b/stable/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 0000000000..f64c29e6c7 Binary files /dev/null and b/stable/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/stable/_static/img/mascots/scylla-forklift-migration.png b/stable/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 0000000000..d2f645c645 Binary files /dev/null and b/stable/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/stable/_static/img/mascots/scylla-gear.png b/stable/_static/img/mascots/scylla-gear.png new file mode 100644 index 0000000000..0f53b26afa Binary files /dev/null and b/stable/_static/img/mascots/scylla-gear.png differ diff --git a/stable/_static/img/mascots/scylla-hardhat.png b/stable/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 0000000000..630f2d9094 Binary files /dev/null and b/stable/_static/img/mascots/scylla-hardhat.png differ diff --git a/stable/_static/img/mascots/scylla-headband.png b/stable/_static/img/mascots/scylla-headband.png new file mode 100644 index 0000000000..c87abe684d Binary files /dev/null and b/stable/_static/img/mascots/scylla-headband.png differ diff --git a/stable/_static/img/mascots/scylla-headset.png b/stable/_static/img/mascots/scylla-headset.png new file mode 100644 index 0000000000..ba52cd223d Binary files /dev/null and b/stable/_static/img/mascots/scylla-headset.png differ diff --git a/stable/_static/img/mascots/scylla-hearts.png b/stable/_static/img/mascots/scylla-hearts.png new file mode 100644 index 0000000000..cef08c8654 Binary files /dev/null and b/stable/_static/img/mascots/scylla-hearts.png differ diff --git a/stable/_static/img/mascots/scylla-looking-down.png b/stable/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 0000000000..75cccbfdf1 Binary files /dev/null and b/stable/_static/img/mascots/scylla-looking-down.png differ diff --git a/stable/_static/img/mascots/scylla-looking-up.png b/stable/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 0000000000..6f10405f21 Binary files /dev/null and b/stable/_static/img/mascots/scylla-looking-up.png differ diff --git a/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png b/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 0000000000..e368cae169 Binary files /dev/null and b/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/stable/_static/img/mascots/scylla-magnifying-glass.png b/stable/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 0000000000..74ad669500 Binary files /dev/null and b/stable/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/stable/_static/img/mascots/scylla-manager.svg b/stable/_static/img/mascots/scylla-manager.svg new file mode 100644 index 0000000000..6ba9ed937c --- /dev/null +++ b/stable/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/stable/_static/img/mascots/scylla-monitor.svg b/stable/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 0000000000..48bec7dde3 --- /dev/null +++ b/stable/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/stable/_static/img/mascots/scylla-movement-fast.png b/stable/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 0000000000..956d1dd0e2 Binary files /dev/null and b/stable/_static/img/mascots/scylla-movement-fast.png differ diff --git a/stable/_static/img/mascots/scylla-movement.png b/stable/_static/img/mascots/scylla-movement.png new file mode 100644 index 0000000000..7ee2b04338 Binary files /dev/null and b/stable/_static/img/mascots/scylla-movement.png differ diff --git a/stable/_static/img/mascots/scylla-onpremise.png b/stable/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 0000000000..3b2dc8f1a2 Binary files /dev/null and b/stable/_static/img/mascots/scylla-onpremise.png differ diff --git a/stable/_static/img/mascots/scylla-opensource.svg b/stable/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 0000000000..299e9cb995 --- /dev/null +++ b/stable/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/stable/_static/img/mascots/scylla-operator.svg b/stable/_static/img/mascots/scylla-operator.svg new file mode 100644 index 0000000000..655a450b2a --- /dev/null +++ b/stable/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/stable/_static/img/mascots/scylla-plugin.png b/stable/_static/img/mascots/scylla-plugin.png new file mode 100644 index 0000000000..b28dc857cc Binary files /dev/null and b/stable/_static/img/mascots/scylla-plugin.png differ diff --git a/stable/_static/img/mascots/scylla-release-mascot.png b/stable/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 0000000000..09342ac687 Binary files /dev/null and b/stable/_static/img/mascots/scylla-release-mascot.png differ diff --git a/stable/_static/img/mascots/scylla-repair.png b/stable/_static/img/mascots/scylla-repair.png new file mode 100644 index 0000000000..9b4c613e70 Binary files /dev/null and b/stable/_static/img/mascots/scylla-repair.png differ diff --git a/stable/_static/img/mascots/scylla-server.png b/stable/_static/img/mascots/scylla-server.png new file mode 100644 index 0000000000..96dc785298 Binary files /dev/null and b/stable/_static/img/mascots/scylla-server.png differ diff --git a/stable/_static/img/mascots/scylla-sleeping.png b/stable/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 0000000000..f88598e05a Binary files /dev/null and b/stable/_static/img/mascots/scylla-sleeping.png differ diff --git a/stable/_static/img/mascots/scylla-tall-measure.png b/stable/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 0000000000..6f0ca146c0 Binary files /dev/null and b/stable/_static/img/mascots/scylla-tall-measure.png differ diff --git a/stable/_static/img/mascots/scylla-university.png b/stable/_static/img/mascots/scylla-university.png new file mode 100644 index 0000000000..b3d0621193 Binary files /dev/null and b/stable/_static/img/mascots/scylla-university.png differ diff --git a/stable/_static/img/mascots/scylla-weights.png b/stable/_static/img/mascots/scylla-weights.png new file mode 100644 index 0000000000..b070bb022c Binary files /dev/null and b/stable/_static/img/mascots/scylla-weights.png differ diff --git a/stable/_static/img/mascots/scylla-window-cleaning.png b/stable/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 0000000000..6a8b16a6b4 Binary files /dev/null and b/stable/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/stable/_static/img/mascots/scylla-with-computer-2.png b/stable/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 0000000000..f3b8b2984f Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/stable/_static/img/mascots/scylla-with-computer.png b/stable/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 0000000000..b38a6fbbe0 Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-computer.png differ diff --git a/stable/_static/img/mascots/scylla-with-linux.png b/stable/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 0000000000..954bf13bc2 Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-linux.png differ diff --git a/stable/_static/img/mascots/scylla-writting.png b/stable/_static/img/mascots/scylla-writting.png new file mode 100644 index 0000000000..d35a13d380 Binary files /dev/null and b/stable/_static/img/mascots/scylla-writting.png differ diff --git a/stable/_static/img/menu.svg b/stable/_static/img/menu.svg new file mode 100644 index 0000000000..30ea1d901e --- /dev/null +++ b/stable/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/js/main.bundle.js b/stable/_static/js/main.bundle.js new file mode 100644 index 0000000000..190a41642e --- /dev/null +++ b/stable/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                  • Back
                  • ',backButtonPosition:"top",wrapper:"
                    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                      "],col:[2,"","
                      "],tr:[2,"","
                      "],td:[3,"","
                      "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra - Exceptions and Enums

                      +
                      +
                      +cassandra.__version_info__
                      +

                      The version of the driver in a tuple format

                      +
                      + +
                      +
                      +cassandra.__version__
                      +

                      The version of the driver in a string format

                      +
                      + +
                      +
                      +class cassandra.ConsistencyLevel
                      +

                      Spcifies how many replicas must respond for an operation to be considered +a success. By default, ONE is used for all operations.

                      +
                      +
                      +ANY = 0
                      +

                      Only requires that one replica receives the write or the coordinator +stores a hint to replay later. Valid only for writes.

                      +
                      + +
                      +
                      +ONE = 1
                      +

                      Only one replica needs to respond to consider the operation a success

                      +
                      + +
                      +
                      +TWO = 2
                      +

                      Two replicas must respond to consider the operation a success

                      +
                      + +
                      +
                      +THREE = 3
                      +

                      Three replicas must respond to consider the operation a success

                      +
                      + +
                      +
                      +QUORUM = 4
                      +

                      ceil(RF/2) + 1 replicas must respond to consider the operation a success

                      +
                      + +
                      +
                      +ALL = 5
                      +

                      All replicas must respond to consider the operation a success

                      +
                      + +
                      +
                      +LOCAL_QUORUM = 6
                      +

                      Requires a quorum of replicas in the local datacenter

                      +
                      + +
                      +
                      +EACH_QUORUM = 7
                      +

                      Requires a quorum of replicas in each datacenter

                      +
                      + +
                      +
                      +SERIAL = 8
                      +

                      For conditional inserts/updates that utilize Cassandra’s lightweight +transactions, this requires consensus among all replicas for the +modified data.

                      +
                      + +
                      +
                      +LOCAL_SERIAL = 9
                      +

                      Like SERIAL, but only requires consensus +among replicas in the local datacenter.

                      +
                      + +
                      +
                      +LOCAL_ONE = 10
                      +

                      Sends a request only to replicas in the local datacenter and waits for +one response.

                      +
                      + +
                      + +
                      +
                      +class cassandra.ProtocolVersion
                      +

                      Defines native protocol versions supported by this driver.

                      +
                      +
                      +V1 = 1
                      +

                      v1, supported in Cassandra 1.2–>2.2

                      +
                      + +
                      +
                      +V2 = 2
                      +

                      v2, supported in Cassandra 2.0–>2.2; +added support for lightweight transactions, batch operations, and automatic query paging.

                      +
                      + +
                      +
                      +V3 = 3
                      +

                      v3, supported in Cassandra 2.1–>3.x+; +added support for protocol-level client-side timestamps (see Session.use_client_timestamp), +serial consistency levels for BatchStatement, and an improved connection pool.

                      +
                      + +
                      +
                      +V4 = 4
                      +

                      v4, supported in Cassandra 2.2–>3.x+; +added a number of new types, server warnings, new failure messages, and custom payloads. Details in the +project docs

                      +
                      + +
                      +
                      +V5 = 5
                      +

                      v5, in beta from 3.x+. Finalised in 4.0-beta5

                      +
                      + +
                      +
                      +V6 = 6
                      +

                      v6, in beta from 4.0-beta5

                      +
                      + +
                      +
                      +DSE_V1 = 65
                      +

                      DSE private protocol v1, supported in DSE 5.1+

                      +
                      + +
                      +
                      +DSE_V2 = 66
                      +

                      DSE private protocol v2, supported in DSE 6.0+

                      +
                      + +
                      +
                      +SUPPORTED_VERSIONS = (66, 65, 6, 5, 4, 3, 2, 1)
                      +

                      A tuple of all supported protocol versions

                      +
                      + +
                      +
                      +BETA_VERSIONS = (6,)
                      +

                      A tuple of all beta protocol versions

                      +
                      + +
                      +
                      +MIN_SUPPORTED = 1
                      +

                      Minimum protocol version supported by this driver.

                      +
                      + +
                      +
                      +MAX_SUPPORTED = 66
                      +

                      Maximum protocol version supported by this driver.

                      +
                      + +
                      +
                      +classmethod get_lower_supported(previous_version)
                      +

                      Return the lower supported protocol version. Beta versions are omitted.

                      +
                      + +
                      + +
                      +
                      +class cassandra.UserFunctionDescriptor(name, argument_types)
                      +

                      Describes a User function by name and argument signature

                      +
                      +
                      +name = None
                      +

                      name of the function

                      +
                      + +
                      +
                      +argument_types = None
                      +

                      Ordered list of CQL argument type names comprising the type signature

                      +
                      + +
                      +
                      +property signature
                      +

                      function signature string in the form ‘name([type0[,type1[…]]])’

                      +

                      can be used to uniquely identify overloaded function names within a keyspace

                      +
                      + +
                      + +
                      +
                      +class cassandra.UserAggregateDescriptor(name, argument_types)
                      +

                      Describes a User aggregate function by name and argument signature

                      +
                      +
                      +name = None
                      +

                      name of the aggregate

                      +
                      + +
                      +
                      +argument_types = None
                      +

                      Ordered list of CQL argument type names comprising the type signature

                      +
                      + +
                      +
                      +property signature
                      +

                      function signature string in the form ‘name([type0[,type1[…]]])’

                      +

                      can be used to uniquely identify overloaded function names within a keyspace

                      +
                      + +
                      + +
                      +
                      +exception cassandra.DriverException
                      +

                      Base for all exceptions explicitly raised by the driver.

                      +
                      + +
                      +
                      +exception cassandra.RequestExecutionException
                      +

                      Base for request execution exceptions returned from the server.

                      +
                      + +
                      +
                      +exception cassandra.Unavailable
                      +

                      There were not enough live replicas to satisfy the requested consistency +level, so the coordinator node immediately failed the request without +forwarding it to any replicas.

                      +
                      +
                      +consistency = None
                      +

                      The requested ConsistencyLevel

                      +
                      + +
                      +
                      +required_replicas = None
                      +

                      The number of replicas that needed to be live to complete the operation

                      +
                      + +
                      +
                      +alive_replicas = None
                      +

                      The number of replicas that were actually alive

                      +
                      + +
                      + +
                      +
                      +exception cassandra.Timeout
                      +

                      Replicas failed to respond to the coordinator node before timing out.

                      +
                      +
                      +consistency = None
                      +

                      The requested ConsistencyLevel

                      +
                      + +
                      +
                      +required_responses = None
                      +

                      The number of required replica responses

                      +
                      + +
                      +
                      +received_responses = None
                      +

                      The number of replicas that responded before the coordinator timed out +the operation

                      +
                      + +
                      + +
                      +
                      +exception cassandra.ReadTimeout
                      +

                      A subclass of Timeout for read operations.

                      +

                      This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the read_request_timeout_in_ms +and range_request_timeout_in_ms options.

                      +
                      +
                      +data_retrieved = None
                      +

                      A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

                      +
                      + +
                      + +
                      +
                      +exception cassandra.WriteTimeout
                      +

                      A subclass of Timeout for write operations.

                      +

                      This indicates that the replicas failed to respond to the coordinator +node before the configured timeout. This timeout is configured in +cassandra.yaml with the write_request_timeout_in_ms +option.

                      +
                      +
                      +write_type = None
                      +

                      The type of write operation, enum on WriteType

                      +
                      + +
                      + +
                      +
                      +exception cassandra.CoordinationFailure
                      +

                      Replicas sent a failure to the coordinator.

                      +
                      +
                      +consistency = None
                      +

                      The requested ConsistencyLevel

                      +
                      + +
                      +
                      +required_responses = None
                      +

                      The number of required replica responses

                      +
                      + +
                      +
                      +received_responses = None
                      +

                      The number of replicas that responded before the coordinator timed out +the operation

                      +
                      + +
                      +
                      +failures = None
                      +

                      The number of replicas that sent a failure message

                      +
                      + +
                      +
                      +error_code_map = None
                      +

                      A map of inet addresses to error codes representing replicas that sent +a failure message. Only set when protocol_version is 5 or higher.

                      +
                      + +
                      + +
                      +
                      +exception cassandra.ReadFailure
                      +

                      A subclass of CoordinationFailure for read operations.

                      +

                      This indicates that the replicas sent a failure message to the coordinator.

                      +
                      +
                      +data_retrieved = None
                      +

                      A boolean indicating whether the requested data was retrieved +by the coordinator from any replicas before it timed out the +operation

                      +
                      + +
                      + +
                      +
                      +exception cassandra.WriteFailure
                      +

                      A subclass of CoordinationFailure for write operations.

                      +

                      This indicates that the replicas sent a failure message to the coordinator.

                      +
                      +
                      +write_type = None
                      +

                      The type of write operation, enum on WriteType

                      +
                      + +
                      + +
                      +
                      +exception cassandra.FunctionFailure
                      +

                      User Defined Function failed during execution

                      +
                      +
                      +keyspace = None
                      +

                      Keyspace of the function

                      +
                      + +
                      +
                      +function = None
                      +

                      Name of the function

                      +
                      + +
                      +
                      +arg_types = None
                      +

                      List of argument type names of the function

                      +
                      + +
                      + +
                      +
                      +exception cassandra.RequestValidationException
                      +

                      Server request validation failed

                      +
                      + +
                      +
                      +exception cassandra.ConfigurationException
                      +

                      Server indicated request errro due to current configuration

                      +
                      + +
                      +
                      +exception cassandra.AlreadyExists
                      +

                      An attempt was made to create a keyspace or table that already exists.

                      +
                      +
                      +keyspace = None
                      +

                      The name of the keyspace that already exists, or, if an attempt was +made to create a new table, the keyspace that the table is in.

                      +
                      + +
                      +
                      +table = None
                      +

                      The name of the table that already exists, or, if an attempt was +make to create a keyspace, None.

                      +
                      + +
                      + +
                      +
                      +exception cassandra.InvalidRequest
                      +

                      A query was made that was invalid for some reason, such as trying to set +the keyspace for a connection to a nonexistent keyspace.

                      +
                      + +
                      +
                      +exception cassandra.Unauthorized
                      +

                      The current user is not authorized to perform the requested operation.

                      +
                      + +
                      +
                      +exception cassandra.AuthenticationFailed
                      +

                      Failed to authenticate.

                      +
                      + +
                      +
                      +exception cassandra.OperationTimedOut
                      +

                      The operation took longer than the specified (client-side) timeout +to complete. This is not an error generated by Cassandra, only +the driver.

                      +
                      +
                      +errors = None
                      +

                      A dict of errors keyed by the Host against which they occurred.

                      +
                      + +
                      +
                      +last_host = None
                      +

                      The last Host this operation was attempted against.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/auth.html b/stable/api/cassandra/auth.html new file mode 100644 index 0000000000..bdfa04862b --- /dev/null +++ b/stable/api/cassandra/auth.html @@ -0,0 +1,820 @@ + + + + + + + + + + + + + cassandra.auth - Authentication | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.auth - Authentication

                      +
                      +
                      +class cassandra.auth.AuthProvider
                      +

                      An abstract class that defines the interface that will be used for +creating Authenticator instances when opening new +connections to Cassandra.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      +
                      +new_authenticator(host)
                      +

                      Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                      +
                      + +
                      + +
                      +
                      +class cassandra.auth.Authenticator
                      +

                      An abstract class that handles SASL authentication with Cassandra servers.

                      +

                      Each time a new connection is created and the server requires authentication, +a new instance of this class will be created by the corresponding +AuthProvider to handler that authentication. The lifecycle of the +new Authenticator will the be:

                      +

                      1) The initial_response() method will be called. The return +value will be sent to the server to initiate the handshake.

                      +

                      2) The server will respond to each client response by either issuing a +challenge or indicating that the authentication is complete (successful or not). +If a new challenge is issued, evaluate_challenge() +will be called to produce a response that will be sent to the +server. This challenge/response negotiation will continue until the server +responds that authentication is successful (or an AuthenticationFailed +is raised).

                      +

                      3) When the server indicates that authentication is successful, +on_authentication_success() will be called a token string that +that the server may optionally have sent.

                      +

                      The exact nature of the negotiation between the client and server is specific +to the authentication mechanism configured server-side.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      +
                      +server_authenticator_class = None
                      +

                      Set during the connection AUTHENTICATE phase

                      +
                      + +
                      +
                      +initial_response()
                      +

                      Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

                      +
                      + +
                      +
                      +evaluate_challenge(challenge)
                      +

                      Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                      +
                      + +
                      +
                      +on_authentication_success(token)
                      +

                      Called when the server indicates that authentication was successful. +Depending on the authentication mechanism, token may be None +or a string.

                      +
                      + +
                      + +
                      +
                      +class cassandra.auth.PlainTextAuthProvider(username, password)
                      +

                      An AuthProvider that works with Cassandra’s PasswordAuthenticator.

                      +

                      Example usage:

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.auth import PlainTextAuthProvider
                      +
                      +auth_provider = PlainTextAuthProvider(
                      +        username='cassandra', password='cassandra')
                      +cluster = Cluster(auth_provider=auth_provider)
                      +
                      +
                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      +
                      +new_authenticator(host)
                      +

                      Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                      +
                      + +
                      + +
                      +
                      +class cassandra.auth.PlainTextAuthenticator(username, password)
                      +
                      +
                      +evaluate_challenge(challenge)
                      +

                      Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                      +
                      + +
                      + +
                      +
                      +class cassandra.auth.SaslAuthProvider(**sasl_kwargs)
                      +

                      An AuthProvider supporting general SASL auth mechanisms

                      +

                      Suitable for GSSAPI or other SASL mechanisms

                      +

                      Example usage:

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.auth import SaslAuthProvider
                      +
                      +sasl_kwargs = {'service': 'something',
                      +               'mechanism': 'GSSAPI',
                      +               'qops': 'auth'.split(',')}
                      +auth_provider = SaslAuthProvider(**sasl_kwargs)
                      +cluster = Cluster(auth_provider=auth_provider)
                      +
                      +
                      +
                      +

                      New in version 2.1.4.

                      +
                      +
                      +
                      +new_authenticator(host)
                      +

                      Implementations of this class should return a new instance +of Authenticator or one of its subclasses.

                      +
                      + +
                      + +
                      +
                      +class cassandra.auth.SaslAuthenticator(host, service, mechanism='GSSAPI', **sasl_kwargs)
                      +

                      A pass-through Authenticator using the third party package +‘pure-sasl’ for authentication

                      +
                      +

                      New in version 2.1.4.

                      +
                      +
                      +
                      +initial_response()
                      +

                      Returns an message to send to the server to initiate the SASL handshake. +None may be returned to send an empty message.

                      +
                      + +
                      +
                      +evaluate_challenge(challenge)
                      +

                      Called when the server sends a challenge message. Generally, this method +should return None when authentication is complete from a +client perspective. Otherwise, a string should be returned.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cluster.html b/stable/api/cassandra/cluster.html new file mode 100644 index 0000000000..fbfe520ec7 --- /dev/null +++ b/stable/api/cassandra/cluster.html @@ -0,0 +1,1895 @@ + + + + + + + + + + + + + cassandra.cluster - Clusters and Sessions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cluster - Clusters and Sessions

                      +
                      +
                      +class cassandra.cluster.Cluster([contact_points=('127.0.0.1',)][, port=9042][, executor_threads=2], **attr_kwargs)
                      +

                      The main class to use when interacting with a Cassandra cluster. +Typically, one instance of this class will be created for each +separate Cassandra cluster that your application interacts with.

                      +

                      Example usage:

                      +
                      >>> from cassandra.cluster import Cluster
                      +>>> cluster = Cluster(['192.168.1.1', '192.168.1.2'])
                      +>>> session = cluster.connect()
                      +>>> session.execute("CREATE KEYSPACE ...")
                      +>>> ...
                      +>>> cluster.shutdown()
                      +
                      +
                      +

                      Cluster and Session also provide context management functions +which implicitly handle shutdown when leaving scope.

                      +

                      executor_threads defines the number of threads in a pool for handling asynchronous tasks such as +extablishing connection pools or refreshing metadata.

                      +

                      Any of the mutable Cluster attributes may be set as keyword arguments to the constructor.

                      +
                      +
                      +contact_points = ['127.0.0.1']
                      +
                      + +
                      +
                      +port = 9042
                      +
                      + +
                      +
                      +cql_version = None
                      +
                      + +
                      +
                      +protocol_version = 66
                      +
                      + +
                      +
                      +compression = True
                      +
                      + +
                      +
                      +auth_provider
                      +

                      When protocol_version is 2 or higher, this should +be an instance of a subclass of AuthProvider, +such as PlainTextAuthProvider.

                      +

                      When protocol_version is 1, this should be +a function that accepts one argument, the IP address of a node, +and returns a dict of credentials for that node.

                      +

                      When not using authentication, this should be left as None.

                      +
                      + +
                      +
                      +load_balancing_policy
                      +

                      An instance of policies.LoadBalancingPolicy or +one of its subclasses.

                      +
                      +

                      Changed in version 2.6.0.

                      +
                      +

                      Defaults to TokenAwarePolicy (DCAwareRoundRobinPolicy). +when using CPython (where the murmur3 extension is available). DCAwareRoundRobinPolicy +otherwise. Default local DC will be chosen from contact points.

                      +

                      Please see DCAwareRoundRobinPolicy for a discussion on default behavior with respect to +DC locality and remote nodes.

                      +
                      + +
                      +
                      +reconnection_policy = <cassandra.policies.ExponentialReconnectionPolicy object>
                      +
                      + +
                      +
                      +default_retry_policy = <cassandra.policies.RetryPolicy object>
                      +

                      A default policies.RetryPolicy instance to use for all +Statement objects which do not have a retry_policy +explicitly set.

                      +
                      + +
                      +
                      +conviction_policy_factory = <class 'cassandra.policies.SimpleConvictionPolicy'>
                      +
                      + +
                      +
                      +address_translator = <cassandra.policies.IdentityTranslator object>
                      +
                      + +
                      +
                      +metrics_enabled = False
                      +
                      + +
                      +
                      +metrics = None
                      +
                      + +
                      +
                      +ssl_context = None
                      +
                      + +
                      +
                      +ssl_options = None
                      +
                      + +
                      +
                      +sockopts = None
                      +
                      + +
                      +
                      +max_schema_agreement_wait = 10
                      +
                      + +
                      +
                      +metadata = None
                      +
                      + +
                      +
                      +connection_class = <class 'cassandra.io.libevreactor.LibevConnection'>
                      +
                      + +
                      +
                      +control_connection_timeout = 2.0
                      +
                      + +
                      +
                      +idle_heartbeat_interval = 30
                      +
                      + +
                      +
                      +idle_heartbeat_timeout = 30
                      +
                      + +
                      +
                      +schema_event_refresh_window = 2
                      +
                      + +
                      +
                      +topology_event_refresh_window = 10
                      +
                      + +
                      +
                      +status_event_refresh_window = 2
                      +
                      + +
                      +
                      +prepare_on_all_hosts = True
                      +
                      + +
                      +
                      +reprepare_on_up = True
                      +
                      + +
                      +
                      +connect_timeout = 5
                      +
                      + +
                      +
                      +schema_metadata_enabled = True
                      +

                      Flag indicating whether internal schema metadata is updated.

                      +

                      When disabled, the driver does not populate Cluster.metadata.keyspaces on connect, or on schema change events. This +can be used to speed initial connection, and reduce load on client and server during operation. Turning this off +gives away token aware request routing, and programmatic inspection of the metadata model.

                      +
                      + +
                      +
                      +token_metadata_enabled = True
                      +

                      Flag indicating whether internal token metadata is updated.

                      +

                      When disabled, the driver does not query node token information on connect, or on topology change events. This +can be used to speed initial connection, and reduce load on client and server during operation. It is most useful +in large clusters using vnodes, where the token map can be expensive to compute. Turning this off +gives away token aware request routing, and programmatic inspection of the token ring.

                      +
                      + +
                      +
                      +timestamp_generator = None
                      +
                      + +
                      +
                      +endpoint_factory = None
                      +
                      + +
                      +
                      +cloud = None
                      +
                      + +
                      +
                      +connect(keyspace=None, wait_for_all_pools=False)
                      +

                      Creates and returns a new Session object.

                      +

                      If keyspace is specified, that keyspace will be the default keyspace for +operations on the Session.

                      +

                      wait_for_all_pools specifies whether this call should wait for all connection pools to be +established or attempted. Default is False, which means it will return when the first +successful connection is established. Remaining pools are added asynchronously.

                      +
                      + +
                      +
                      +shutdown()
                      +

                      Closes all sessions and connection associated with this Cluster. +To ensure all connections are properly closed, you should always +call shutdown() on a Cluster instance when you are done with it.

                      +

                      Once shutdown, a Cluster should not be used for any purpose.

                      +
                      + +
                      +
                      +register_user_type(keyspace, user_type, klass)
                      +

                      Registers a class to use to represent a particular user-defined type. +Query parameters for this user-defined type will be assumed to be +instances of klass. Result sets for this user-defined type will +be instances of klass. If no class is registered for a user-defined +type, a namedtuple will be used for result sets, and non-prepared +statements may not encode parameters for this type correctly.

                      +

                      keyspace is the name of the keyspace that the UDT is defined in.

                      +

                      user_type is the string name of the UDT to register the mapping +for.

                      +

                      klass should be a class with attributes whose names match the +fields of the user-defined type. The constructor must accepts kwargs +for each of the fields in the UDT.

                      +

                      This method should only be called after the type has been created +within Cassandra.

                      +

                      Example:

                      +
                      cluster = Cluster(protocol_version=3)
                      +session = cluster.connect()
                      +session.set_keyspace('mykeyspace')
                      +session.execute("CREATE TYPE address (street text, zipcode int)")
                      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location address)")
                      +
                      +# create a class to map to the "address" UDT
                      +class Address(object):
                      +
                      +    def __init__(self, street, zipcode):
                      +        self.street = street
                      +        self.zipcode = zipcode
                      +
                      +cluster.register_user_type('mykeyspace', 'address', Address)
                      +
                      +# insert a row using an instance of Address
                      +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
                      +                (0, Address("123 Main St.", 78723)))
                      +
                      +# results will include Address instances
                      +results = session.execute("SELECT * FROM users")
                      +row = results[0]
                      +print row.id, row.location.street, row.location.zipcode
                      +
                      +
                      +
                      + +
                      +
                      +register_listener(listener)
                      +

                      Adds a cassandra.policies.HostStateListener subclass instance to +the list of listeners to be notified when a host is added, removed, +marked up, or marked down.

                      +
                      + +
                      +
                      +unregister_listener(listener)
                      +

                      Removes a registered listener.

                      +
                      + +
                      +
                      +add_execution_profile(name, profile, pool_wait_timeout=5)
                      +

                      Adds an ExecutionProfile to the cluster. This makes it available for use by name in Session.execute() +and Session.execute_async(). This method will raise if the profile already exists.

                      +

                      Normally profiles will be injected at cluster initialization via Cluster(execution_profiles). This method +provides a way of adding them dynamically.

                      +

                      Adding a new profile updates the connection pools according to the specified load_balancing_policy. By default, +this method will wait up to five seconds for the pool creation to complete, so the profile can be used immediately +upon return. This behavior can be controlled using pool_wait_timeout (see +concurrent.futures.wait +for timeout semantics).

                      +
                      + +
                      +
                      +set_max_requests_per_connection(host_distance, max_requests)
                      +

                      Sets a threshold for concurrent requests per connection, above which new +connections will be created to a host (up to max connections; +see set_max_connections_per_host()).

                      +

                      Pertains to connection pool management in protocol versions {1,2}.

                      +
                      + +
                      +
                      +get_max_requests_per_connection(host_distance)
                      +
                      + +
                      +
                      +set_min_requests_per_connection(host_distance, min_requests)
                      +

                      Sets a threshold for concurrent requests per connection, below which +connections will be considered for disposal (down to core connections; +see set_core_connections_per_host()).

                      +

                      Pertains to connection pool management in protocol versions {1,2}.

                      +
                      + +
                      +
                      +get_min_requests_per_connection(host_distance)
                      +
                      + +
                      +
                      +get_core_connections_per_host(host_distance)
                      +

                      Gets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                      +

                      This property is ignored if protocol_version is +3 or higher.

                      +
                      + +
                      +
                      +set_core_connections_per_host(host_distance, core_connections)
                      +

                      Sets the minimum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                      +

                      Protocol version 1 and 2 are limited in the number of concurrent +requests they can send per connection. The driver implements connection +pooling to support higher levels of concurrency.

                      +

                      If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

                      +
                      + +
                      +
                      +get_max_connections_per_host(host_distance)
                      +

                      Gets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 8 for LOCAL and 2 for +REMOTE.

                      +

                      This property is ignored if protocol_version is +3 or higher.

                      +
                      + +
                      +
                      +set_max_connections_per_host(host_distance, max_connections)
                      +

                      Sets the maximum number of connections per Session that will be opened +for each host with HostDistance equal to host_distance. +The default is 2 for LOCAL and 1 for +REMOTE.

                      +

                      If protocol_version is set to 3 or higher, this +is not supported (there is always one connection per host, unless +the host is remote and connect_to_remote_hosts is False) +and using this will result in an UnsupportedOperation.

                      +
                      + +
                      +
                      +get_control_connection_host()
                      +

                      Returns the control connection host metadata.

                      +
                      + +
                      +
                      +refresh_schema_metadata(max_schema_agreement_wait=None)
                      +

                      Synchronously refresh all schema metadata.

                      +

                      By default, the timeout for this operation is governed by max_schema_agreement_wait +and control_connection_timeout.

                      +

                      Passing max_schema_agreement_wait here overrides max_schema_agreement_wait.

                      +

                      Setting max_schema_agreement_wait <= 0 will bypass schema agreement and refresh schema immediately.

                      +

                      An Exception is raised if schema refresh fails for any reason.

                      +
                      + +
                      +
                      +refresh_keyspace_metadata(keyspace, max_schema_agreement_wait=None)
                      +

                      Synchronously refresh keyspace metadata. This applies to keyspace-level information such as replication +and durability settings. It does not refresh tables, types, etc. contained in the keyspace.

                      +

                      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                      +
                      + +
                      +
                      +refresh_table_metadata(keyspace, table, max_schema_agreement_wait=None)
                      +

                      Synchronously refresh table metadata. This applies to a table, and any triggers or indexes attached +to the table.

                      +

                      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                      +
                      + +
                      +
                      +refresh_user_type_metadata(keyspace, user_type, max_schema_agreement_wait=None)
                      +

                      Synchronously refresh user defined type metadata.

                      +

                      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                      +
                      + +
                      +
                      +refresh_user_function_metadata(keyspace, function, max_schema_agreement_wait=None)
                      +

                      Synchronously refresh user defined function metadata.

                      +

                      function is a cassandra.UserFunctionDescriptor.

                      +

                      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                      +
                      + +
                      +
                      +refresh_user_aggregate_metadata(keyspace, aggregate, max_schema_agreement_wait=None)
                      +

                      Synchronously refresh user defined aggregate metadata.

                      +

                      aggregate is a cassandra.UserAggregateDescriptor.

                      +

                      See refresh_schema_metadata() for description of max_schema_agreement_wait behavior

                      +
                      + +
                      +
                      +refresh_nodes(force_token_rebuild=False)
                      +

                      Synchronously refresh the node list and token metadata

                      +

                      force_token_rebuild can be used to rebuild the token map metadata, even if no new nodes are discovered.

                      +

                      An Exception is raised if node refresh fails for any reason.

                      +
                      + +
                      +
                      +set_meta_refresh_enabled(enabled)
                      +

                      Deprecated: set schema_metadata_enabled token_metadata_enabled instead

                      +

                      Sets a flag to enable (True) or disable (False) all metadata refresh queries. +This applies to both schema and node topology.

                      +

                      Disabling this is useful to minimize refreshes during multiple changes.

                      +

                      Meta refresh must be enabled for the driver to become aware of any cluster +topology changes or schema updates.

                      +
                      + +
                      + +
                      +
                      +class cassandra.cluster.ExecutionProfile(load_balancing_policy=<object object>, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=10.0, row_factory=<function named_tuple_factory>, speculative_execution_policy=None)
                      +
                      +
                      +consistency_level = LOCAL_ONE
                      +
                      + +
                      +
                      +static row_factory(colnames, rows)
                      +

                      Returns each row as a namedtuple. +This is the default row factory.

                      +

                      Example:

                      +
                      >>> from cassandra.query import named_tuple_factory
                      +>>> session = cluster.connect('mykeyspace')
                      +>>> session.row_factory = named_tuple_factory
                      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                      +>>> user = rows[0]
                      +
                      +>>> # you can access field by their name:
                      +>>> print "name: %s, age: %d" % (user.name, user.age)
                      +name: Bob, age: 42
                      +
                      +>>> # or you can access fields by their position (like a tuple)
                      +>>> name, age = user
                      +>>> print "name: %s, age: %d" % (name, age)
                      +name: Bob, age: 42
                      +>>> name = user[0]
                      +>>> age = user[1]
                      +>>> print "name: %s, age: %d" % (name, age)
                      +name: Bob, age: 42
                      +
                      +
                      +
                      +

                      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                      +
                      +
                      + +
                      + +
                      +
                      +class cassandra.cluster.GraphExecutionProfile(load_balancing_policy=_NOT_SET, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=30.0, row_factory=None, graph_options=None, continuous_paging_options=_NOT_SET)
                      +

                      Default execution profile for graph execution.

                      +

                      See ExecutionProfile for base attributes. Note that if not explicitly set, +the row_factory and graph_options.graph_protocol are resolved during the query execution. +These options will resolve to graph_graphson3_row_factory and GraphProtocol.GRAPHSON_3_0 +for the core graph engine (DSE 6.8+), otherwise graph_object_row_factory and GraphProtocol.GRAPHSON_1_0

                      +

                      In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy.

                      +
                      + +
                      +
                      +class cassandra.cluster.GraphAnalyticsExecutionProfile(load_balancing_policy=None, retry_policy=None, consistency_level=ConsistencyLevel.LOCAL_ONE, serial_consistency_level=None, request_timeout=3600. * 24. * 7., row_factory=None, graph_options=None)
                      +

                      Execution profile with timeout and load balancing appropriate for graph analytics queries.

                      +

                      See also GraphExecutionPolicy.

                      +

                      In addition to default parameters shown in the signature, this profile also defaults retry_policy to +cassandra.policies.NeverRetryPolicy, and load_balancing_policy to one that targets the current Spark +master.

                      +

                      Note: The graph_options.graph_source is set automatically to b’a’ (analytics) +when using GraphAnalyticsExecutionProfile. This is mandatory to target analytics nodes.

                      +
                      + +
                      +
                      +cassandra.cluster.EXEC_PROFILE_DEFAULT
                      +

                      The base class of the class hierarchy.

                      +

                      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                      +
                      + +
                      +
                      +cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT
                      +

                      The base class of the class hierarchy.

                      +

                      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                      +
                      + +
                      +
                      +cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT
                      +

                      The base class of the class hierarchy.

                      +

                      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                      +
                      + +
                      +
                      +cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT
                      +

                      The base class of the class hierarchy.

                      +

                      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                      +
                      + +
                      +
                      +class cassandra.cluster.Session
                      +

                      A collection of connection pools for each host in the cluster. +Instances of this class should not be created directly, only +using Cluster.connect().

                      +

                      Queries and statements can be executed through Session instances +using the execute() and execute_async() +methods.

                      +

                      Example usage:

                      +
                      >>> session = cluster.connect()
                      +>>> session.set_keyspace("mykeyspace")
                      +>>> session.execute("SELECT * FROM mycf")
                      +
                      +
                      +
                      +
                      +default_timeout = 10.0
                      +

                      A default timeout, measured in seconds, for queries executed through +execute() or execute_async(). This default may be +overridden with the timeout parameter for either of those methods.

                      +

                      Setting this to None will cause no timeouts to be set by default.

                      +

                      Please see ResponseFuture.result() for details on the scope and +effect of this timeout.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      + +
                      +
                      +default_consistency_level = LOCAL_ONE
                      +

                      Deprecated: use execution profiles instead +The default ConsistencyLevel for operations executed through +this session. This default may be overridden by setting the +consistency_level on individual statements.

                      +
                      +

                      New in version 1.2.0.

                      +
                      +
                      +

                      Changed in version 3.0.0: default changed from ONE to LOCAL_ONE

                      +
                      +
                      + +
                      +
                      +default_serial_consistency_level = None
                      +

                      The default ConsistencyLevel for serial phase of conditional updates executed through +this session. This default may be overridden by setting the +serial_consistency_level on individual statements.

                      +

                      Only valid for protocol_version >= 2.

                      +
                      + +
                      +
                      +row_factory = <function named_tuple_factory>
                      +

                      The format to return row results in. By default, each +returned row will be a named tuple. You can alternatively +use any of the following:

                      + +
                      + +
                      +
                      +default_fetch_size = 5000
                      +
                      + +
                      +
                      +use_client_timestamp = True
                      +
                      + +
                      +
                      +timestamp_generator = None
                      +
                      + +
                      +
                      +encoder = None
                      +
                      + +
                      +
                      +client_protocol_handler = <class 'cassandra.protocol.cython_protocol_handler.<locals>.CythonProtocolHandler'>
                      +
                      + +
                      +
                      +execute(statement[, parameters][, timeout][, trace][, custom_payload][, paging_state][, host][, execute_as])
                      +

                      Execute the given query and synchronously wait for the response.

                      +

                      If an error is encountered while executing the query, an Exception +will be raised.

                      +

                      query may be a query string or an instance of cassandra.query.Statement.

                      +

                      parameters may be a sequence or dict of parameters to bind. If a +sequence is used, %s should be used the placeholder for each +argument. If a dict is used, %(name)s style placeholders must +be used.

                      +

                      timeout should specify a floating-point timeout (in seconds) after +which an OperationTimedOut exception will be raised if the query +has not completed. If not set, the timeout defaults to the request_timeout of the selected execution_profile. +If set to None, there is no timeout. Please see ResponseFuture.result() for details on +the scope and effect of this timeout.

                      +

                      If trace is set to True, the query will be sent with tracing enabled. +The trace details can be obtained using the returned ResultSet object.

                      +

                      custom_payload is a Custom Payloads dict to be passed to the server. +If query is a Statement with its own custom_payload. The message payload +will be a union of the two, with the values specified here taking precedence.

                      +

                      execution_profile is the execution profile to use for this request. It can be a key to a profile configured +via Cluster.add_execution_profile() or an instance (from Session.execution_profile_clone_update(), +for example

                      +

                      paging_state is an optional paging state, reused from a previous ResultSet.

                      +

                      host is the cassandra.pool.Host that should handle the query. If the host specified is down or +not yet connected, the query will fail with NoHostAvailable. Using this is +discouraged except in a few cases, e.g., querying node-local tables and applying schema changes.

                      +

                      execute_as the user that will be used on the server to execute the request. This is only available +on a DSE cluster.

                      +
                      + +
                      +
                      +execute_async(statement[, parameters][, trace][, custom_payload][, paging_state][, host][, execute_as])
                      +

                      Execute the given query and return a ResponseFuture object +which callbacks may be attached to for asynchronous response +delivery. You may also call result() +on the ResponseFuture to synchronously block for results at +any time.

                      +

                      See Session.execute() for parameter definitions.

                      +

                      Example usage:

                      +
                      >>> session = cluster.connect()
                      +>>> future = session.execute_async("SELECT * FROM mycf")
                      +
                      +>>> def log_results(results):
                      +...     for row in results:
                      +...         log.info("Results: %s", row)
                      +
                      +>>> def log_error(exc):
                      +>>>     log.error("Operation failed: %s", exc)
                      +
                      +>>> future.add_callbacks(log_results, log_error)
                      +
                      +
                      +

                      Async execution with blocking wait for results:

                      +
                      >>> future = session.execute_async("SELECT * FROM mycf")
                      +>>> # do other stuff...
                      +
                      +>>> try:
                      +...     results = future.result()
                      +... except Exception:
                      +...     log.exception("Operation failed:")
                      +
                      +
                      +
                      + +
                      +
                      +execute_graph(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
                      +

                      Executes a Gremlin query string or GraphStatement synchronously, +and returns a ResultSet from this execution.

                      +

                      parameters is dict of named parameters to bind. The values must be +JSON-serializable.

                      +

                      execution_profile: Selects an execution profile for the request.

                      +

                      execute_as the user that will be used on the server to execute the request.

                      +
                      + +
                      +
                      +execute_graph_async(statement[, parameters][, trace][, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT][, execute_as])
                      +

                      Execute the graph query and return a ResponseFuture +object which callbacks may be attached to for asynchronous response delivery. You may also call ResponseFuture.result() to synchronously block for +results at any time.

                      +
                      + +
                      +
                      +prepare(statement)
                      +

                      Prepares a query string, returning a PreparedStatement +instance which can be used as follows:

                      +
                      >>> session = cluster.connect("mykeyspace")
                      +>>> query = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)"
                      +>>> prepared = session.prepare(query)
                      +>>> session.execute(prepared, (user.id, user.name, user.age))
                      +
                      +
                      +

                      Or you may bind values to the prepared statement ahead of time:

                      +
                      >>> prepared = session.prepare(query)
                      +>>> bound_stmt = prepared.bind((user.id, user.name, user.age))
                      +>>> session.execute(bound_stmt)
                      +
                      +
                      +

                      Of course, prepared statements may (and should) be reused:

                      +
                      >>> prepared = session.prepare(query)
                      +>>> for user in users:
                      +...     bound = prepared.bind((user.id, user.name, user.age))
                      +...     session.execute(bound)
                      +
                      +
                      +

                      Alternatively, if protocol_version is 5 or higher +(requires Cassandra 4.0+), the keyspace can be specified as a +parameter. This will allow you to avoid specifying the keyspace in the +query without specifying a keyspace in connect(). It +even will let you prepare and use statements against a keyspace other +than the one originally specified on connection:

                      +
                      >>> analyticskeyspace_prepared = session.prepare(
                      +...     "INSERT INTO user_activity id, last_activity VALUES (?, ?)",
                      +...     keyspace="analyticskeyspace")  # note the different keyspace
                      +
                      +
                      +

                      Important: PreparedStatements should be prepared only once. +Preparing the same query more than once will likely affect performance.

                      +

                      custom_payload is a key value map to be passed along with the prepare +message. See Custom Payloads.

                      +
                      + +
                      +
                      +shutdown()
                      +

                      Close all connections. Session instances should not be used +for any purpose after being shutdown.

                      +
                      + +
                      +
                      +set_keyspace(keyspace)
                      +

                      Set the default keyspace for all queries made through this Session. +This operation blocks until complete.

                      +
                      + +
                      +
                      +get_execution_profile(name)
                      +

                      Returns the execution profile associated with the provided name.

                      +
                      +
                      Parameters:
                      +

                      name – The name (or key) of the execution profile.

                      +
                      +
                      +
                      + +
                      +
                      +execution_profile_clone_update(ep, **kwargs)
                      +

                      Returns a clone of the ep profile. kwargs can be specified to update attributes +of the returned profile.

                      +

                      This is a shallow clone, so any objects referenced by the profile are shared. This means Load Balancing Policy +is maintained by inclusion in the active profiles. It also means updating any other rich objects will be seen +by the active profile. In cases where this is not desirable, be sure to replace the instance instead of manipulating +the shared object.

                      +
                      + +
                      +
                      +add_request_init_listener(fn, *args, **kwargs)
                      +

                      Adds a callback with arguments to be called when any request is created.

                      +

                      It will be invoked as fn(response_future, *args, **kwargs) after each client request is created, +and before the request is sent. This can be used to create extensions by adding result callbacks to the +response future.

                      +

                      response_future is the ResponseFuture for the request.

                      +

                      Note that the init callback is done on the client thread creating the request, so you may need to consider +synchronization if you have multiple threads. Any callbacks added to the response future will be executed +on the event loop thread, so the normal advice about minimizing cycles and avoiding blocking apply (see Note in +ResponseFuture.add_callbacks().

                      +

                      See this example in the +source tree for an example.

                      +
                      + +
                      +
                      +remove_request_init_listener(fn, *args, **kwargs)
                      +

                      Removes a callback and arguments from the list.

                      +

                      See Session.add_request_init_listener().

                      +
                      + +
                      + +
                      +
                      +class cassandra.cluster.ResponseFuture
                      +

                      An asynchronous response delivery mechanism that is returned from calls +to Session.execute_async().

                      +
                      +
                      There are two ways for results to be delivered:
                      +
                      +
                      +
                      +
                      +query = None
                      +
                      + +
                      +
                      +result()
                      +

                      Return the final result or raise an Exception if errors were +encountered. If the final result or error has not been set +yet, this method will block until it is set, or the timeout +set for the request expires.

                      +

                      Timeout is specified in the Session request execution functions. +If the timeout is exceeded, an cassandra.OperationTimedOut will be raised. +This is a client-side timeout. For more information +about server-side coordinator timeouts, see policies.RetryPolicy.

                      +

                      Example usage:

                      +
                      >>> future = session.execute_async("SELECT * FROM mycf")
                      +>>> # do other stuff...
                      +
                      +>>> try:
                      +...     rows = future.result()
                      +...     for row in rows:
                      +...         ... # process results
                      +... except Exception:
                      +...     log.exception("Operation failed:")
                      +
                      +
                      +
                      + +
                      +
                      +get_query_trace()
                      +

                      Fetches and returns the query trace of the last response, or None if tracing was +not enabled.

                      +

                      Note that this may raise an exception if there are problems retrieving the trace +details from Cassandra. If the trace is not available after max_wait, +cassandra.query.TraceUnavailable will be raised.

                      +

                      If the ResponseFuture is not done (async execution) and you try to retrieve the trace, +cassandra.query.TraceUnavailable will be raised.

                      +

                      query_cl is the consistency level used to poll the trace tables.

                      +
                      + +
                      +
                      +get_all_query_traces()
                      +

                      Fetches and returns the query traces for all query pages, if tracing was enabled.

                      +

                      See note in get_query_trace() regarding possible exceptions.

                      +
                      + +
                      +
                      +custom_payload
                      +

                      The custom payload returned from the server, if any. This will only be +set by Cassandra servers implementing a custom QueryHandler, and only +for protocol_version 4+.

                      +

                      Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

                      +
                      +
                      Returns:
                      +

                      Custom Payloads.

                      +
                      +
                      +
                      + +
                      +
                      +is_schema_agreed = True
                      +
                      + +
                      +
                      +has_more_pages
                      +

                      Returns True if there are more pages left in the +query results, False otherwise. This should only +be checked after the first page has been returned.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      + +
                      +
                      +warnings
                      +

                      Warnings returned from the server, if any. This will only be +set for protocol_version 4+.

                      +

                      Warnings may be returned for such things as oversized batches, +or too many tombstones in slice queries.

                      +

                      Ensure the future is complete before trying to access this property +(call result(), or after callback is invoked). +Otherwise it may throw if the response has not been received.

                      +
                      + +
                      +
                      +start_fetching_next_page()
                      +

                      If there are more pages left in the query result, this asynchronously +starts fetching the next page. If there are no pages left, QueryExhausted +is raised. Also see has_more_pages.

                      +

                      This should only be called after the first page has been returned.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      + +
                      +
                      +add_callback(fn, *args, **kwargs)
                      +

                      Attaches a callback function to be called when the final results arrive.

                      +

                      By default, fn will be called with the results as the first and only +argument. If *args or **kwargs are supplied, they will be passed +through as additional positional or keyword arguments to fn.

                      +

                      If an error is hit while executing the operation, a callback attached +here will not be called. Use add_errback() or add_callbacks() +if you wish to handle that case.

                      +

                      If the final result has already been seen when this method is called, +the callback will be called immediately (before this method returns).

                      +

                      Note: in the case that the result is not available when the callback is added, +the callback is executed by IO event thread. This means that the callback +should not block or attempt further synchronous requests, because no further +IO will be processed until the callback returns.

                      +

                      Important: if the callback you attach results in an exception being +raised, the exception will be ignored, so please ensure your +callback handles all error cases that you care about.

                      +

                      Usage example:

                      +
                      >>> session = cluster.connect("mykeyspace")
                      +
                      +>>> def handle_results(rows, start_time, should_log=False):
                      +...     if should_log:
                      +...         log.info("Total time: %f", time.time() - start_time)
                      +...     ...
                      +
                      +>>> future = session.execute_async("SELECT * FROM users")
                      +>>> future.add_callback(handle_results, time.time(), should_log=True)
                      +
                      +
                      +
                      + +
                      +
                      +add_errback(fn, *args, **kwargs)
                      +

                      Like add_callback(), but handles error cases. +An Exception instance will be passed as the first positional argument +to fn.

                      +
                      + +
                      +
                      +add_callbacks(callback, errback, callback_args=(), callback_kwargs=None, errback_args=(), errback_kwargs=None)
                      +

                      A convenient combination of add_callback() and +add_errback().

                      +

                      Example usage:

                      +
                      >>> session = cluster.connect()
                      +>>> query = "SELECT * FROM mycf"
                      +>>> future = session.execute_async(query)
                      +
                      +>>> def log_results(results, level='debug'):
                      +...     for row in results:
                      +...         log.log(level, "Result: %s", row)
                      +
                      +>>> def log_error(exc, query):
                      +...     log.error("Query '%s' failed: %s", query, exc)
                      +
                      +>>> future.add_callbacks(
                      +...     callback=log_results, callback_kwargs={'level': 'info'},
                      +...     errback=log_error, errback_args=(query,))
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +class cassandra.cluster.ResultSet
                      +

                      An iterator over the rows from a query result. Also supplies basic equality +and indexing methods for backward-compatability. These methods materialize +the entire result set (loading all pages), and should only be used if the +total result size is understood. Warnings are emitted when paged results +are materialized in this fashion.

                      +

                      You can treat this as a normal iterator over rows:

                      +
                      >>> from cassandra.query import SimpleStatement
                      +>>> statement = SimpleStatement("SELECT * FROM users", fetch_size=10)
                      +>>> for user_row in session.execute(statement):
                      +...     process_user(user_row)
                      +
                      +
                      +

                      Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

                      +
                      +
                      +all()
                      +

                      Returns all the remaining rows as a list. This is basically +a convenient shortcut to list(result_set).

                      +

                      This function is not recommended for queries that return a large number of elements.

                      +
                      + +
                      +
                      +property current_rows
                      +

                      The list of current page rows. May be empty if the result was empty, +or this is the last page.

                      +
                      + +
                      +
                      +fetch_next_page()
                      +

                      Manually, synchronously fetch the next page. Supplied for manually retrieving pages +and inspecting current_page(). It is not necessary to call this when iterating +through results; paging happens implicitly in iteration.

                      +
                      + +
                      +
                      +get_all_query_traces(max_wait_sec_per=None)
                      +

                      Gets all query traces from the associated future. +See ResponseFuture.get_all_query_traces() for details.

                      +
                      + +
                      +
                      +get_query_trace(max_wait_sec=None)
                      +

                      Gets the last query trace from the associated future. +See ResponseFuture.get_query_trace() for details.

                      +
                      + +
                      +
                      +property has_more_pages
                      +

                      True if the last response indicated more pages; False otherwise

                      +
                      + +
                      +
                      +one()
                      +

                      Return a single row of the results or None if empty. This is basically +a shortcut to result_set.current_rows[0] and should only be used when +you know a query returns a single row. Consider using an iterator if the +ResultSet contains more than one row.

                      +
                      + +
                      +
                      +property paging_state
                      +

                      Server paging state of the query. Can be None if the query was not paged.

                      +

                      The driver treats paging state as opaque, but it may contain primary key data, so applications may want to +avoid sending this to untrusted parties.

                      +
                      + +
                      +
                      +property was_applied
                      +

                      For LWT results, returns whether the transaction was applied.

                      +

                      Result is indeterminate if called on a result that was not an LWT request or on +a query.BatchStatement containing LWT. In the latter case either all the batch +succeeds or fails.

                      +

                      Only valid when one of the of the internal row factories is in use.

                      +
                      + +
                      + +
                      +
                      +exception cassandra.cluster.QueryExhausted
                      +

                      Raised when ResponseFuture.start_fetching_next_page() is called and +there are no more pages. You can check ResponseFuture.has_more_pages +before calling to avoid this.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      + +
                      +
                      +exception cassandra.cluster.NoHostAvailable
                      +

                      Raised when an operation is attempted but all connections are +busy, defunct, closed, or resulted in errors when used.

                      +
                      + +
                      +
                      +exception cassandra.cluster.UserTypeDoesNotExist
                      +

                      An attempt was made to use a user-defined type that does not exist.

                      +
                      +

                      New in version 2.1.0.

                      +
                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/concurrent.html b/stable/api/cassandra/concurrent.html new file mode 100644 index 0000000000..99218af78c --- /dev/null +++ b/stable/api/cassandra/concurrent.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + cassandra.concurrent - Utilities for Concurrent Statement Execution | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.concurrent - Utilities for Concurrent Statement Execution

                      +
                      +
                      +cassandra.concurrent.execute_concurrent(session, statements_and_parameters, concurrency=100, raise_on_first_error=True, results_generator=False, execution_profile=<object object>)
                      +

                      Executes a sequence of (statement, parameters) tuples concurrently. Each +parameters item must be a sequence or None.

                      +

                      The concurrency parameter controls how many statements will be executed +concurrently. When Cluster.protocol_version is set to 1 or 2, +it is recommended that this be kept below 100 times the number of +core connections per host times the number of connected hosts (see +Cluster.set_core_connections_per_host()). If that amount is exceeded, +the event loop thread may attempt to block on new connection creation, +substantially impacting throughput. If protocol_version +is 3 or higher, you can safely experiment with higher levels of concurrency.

                      +

                      If raise_on_first_error is left as True, execution will stop +after the first failed statement and the corresponding exception will be +raised.

                      +

                      results_generator controls how the results are returned.

                      +
                        +
                      • If False, the results are returned only after all requests have completed.

                      • +
                      • If True, a generator expression is returned. Using a generator results in a constrained +memory footprint when the results set will be large – results are yielded +as they return instead of materializing the entire list at once. The trade for lower memory +footprint is marginal CPU overhead (more thread coordination and sorting out-of-order results +on-the-fly).

                      • +
                      +

                      execution_profile argument is the execution profile to use for this +request, it is passed directly to Session.execute_async().

                      +

                      A sequence of ExecutionResult(success, result_or_exc) namedtuples is returned +in the same order that the statements were passed in. If success is False, +there was an error executing the statement, and result_or_exc will be +an Exception. If success is True, result_or_exc +will be the query result.

                      +

                      Example usage:

                      +
                      select_statement = session.prepare("SELECT * FROM users WHERE id=?")
                      +
                      +statements_and_params = []
                      +for user_id in user_ids:
                      +    params = (user_id, )
                      +    statements_and_params.append((select_statement, params))
                      +
                      +results = execute_concurrent(
                      +    session, statements_and_params, raise_on_first_error=False)
                      +
                      +for (success, result) in results:
                      +    if not success:
                      +        handle_error(result)  # result will be an Exception
                      +    else:
                      +        process_user(result[0])  # result will be a list of rows
                      +
                      +
                      +

                      Note: in the case that generators are used, it is important to ensure the consumers do not +block or attempt further synchronous requests, because no further IO will be processed until +the consumer returns. This may also produce a deadlock in the IO event thread.

                      +
                      + +
                      +
                      +cassandra.concurrent.execute_concurrent_with_args(session, statement, parameters, *args, **kwargs)
                      +

                      Like execute_concurrent(), but takes a single +statement and a sequence of parameters. Each item in parameters +should be a sequence or None.

                      +

                      Example usage:

                      +
                      statement = session.prepare("INSERT INTO mytable (a, b) VALUES (1, ?)")
                      +parameters = [(x,) for x in range(1000)]
                      +execute_concurrent_with_args(session, statement, parameters, concurrency=50)
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/connection.html b/stable/api/cassandra/connection.html new file mode 100644 index 0000000000..ca400eef1c --- /dev/null +++ b/stable/api/cassandra/connection.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + cassandra.connection - Low Level Connection Info | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.connection - Low Level Connection Info

                      +
                      +
                      +exception cassandra.connection.ConnectionException
                      +

                      An unrecoverable error was hit when attempting to use a connection, +or the connection was already closed or defunct.

                      +
                      + +
                      +
                      +exception cassandra.connection.ConnectionShutdown
                      +

                      Raised when a connection has been marked as defunct or has been closed.

                      +
                      + +
                      +
                      +exception cassandra.connection.ConnectionBusy
                      +

                      An attempt was made to send a message through a Connection that +was already at the max number of in-flight operations.

                      +
                      + +
                      +
                      +exception cassandra.connection.ProtocolError
                      +

                      Communication did not match the protocol that this driver expects.

                      +
                      + +
                      +
                      +class cassandra.connection.EndPoint
                      +

                      Represents the information to connect to a cassandra node.

                      +
                      +
                      +property address
                      +

                      The IP address of the node. This is the RPC address the driver uses when connecting to the node

                      +
                      + +
                      +
                      +property port
                      +

                      The port of the node.

                      +
                      + +
                      +
                      +resolve()
                      +

                      Resolve the endpoint to an address/port. This is called +only on socket connection.

                      +
                      + +
                      +
                      +property socket_family
                      +

                      The socket family of the endpoint.

                      +
                      + +
                      +
                      +property ssl_options
                      +

                      SSL options specific to this endpoint.

                      +
                      + +
                      + +
                      +
                      +class cassandra.connection.EndPointFactory
                      +
                      +
                      +configure(cluster)
                      +

                      This is called by the cluster during its initialization.

                      +
                      + +
                      +
                      +create(row)
                      +

                      Create an EndPoint from a system.peers row.

                      +
                      + +
                      + +
                      +
                      +class cassandra.connection.SniEndPoint(proxy_address, server_name, port=9042)
                      +

                      SNI Proxy EndPoint implementation.

                      +
                      + +
                      +
                      +class cassandra.connection.SniEndPointFactory(proxy_address, port, node_domain=None)
                      +
                      + +
                      +
                      +class cassandra.connection.UnixSocketEndPoint(unix_socket_path)
                      +

                      Unix Socket EndPoint implementation.

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cqlengine/columns.html b/stable/api/cassandra/cqlengine/columns.html new file mode 100644 index 0000000000..feb91ae0c8 --- /dev/null +++ b/stable/api/cassandra/cqlengine/columns.html @@ -0,0 +1,975 @@ + + + + + + + + + + + + + cassandra.cqlengine.columns - Column types for object mapping models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cqlengine.columns - Column types for object mapping models

                      +
                      +

                      Columns

                      +

                      Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column.

                      +

                      Just as in CQL, the order you define your columns in is important, and is the same order they are defined in on a model’s corresponding table.

                      +

                      Each column on your model definitions needs to be an instance of a Column class.

                      +
                      +
                      +class cassandra.cqlengine.columns.Column(**kwargs)
                      +
                      +
                      +primary_key = False
                      +

                      bool flag, indicates this column is a primary key. The first primary key defined +on a model is the partition key (unless partition keys are set), all others are cluster keys

                      +
                      + +
                      +
                      +partition_key = False
                      +

                      indicates that this column should be the partition key, defining +more than one partition key column creates a compound partition key

                      +
                      + +
                      +
                      +index = False
                      +

                      bool flag, indicates an index should be created for this column

                      +
                      + +
                      +
                      +custom_index = False
                      +

                      bool flag, indicates an index is managed outside of cqlengine. This is +useful if you want to do filter queries on fields that have custom +indexes.

                      +
                      + +
                      +
                      +db_field = None
                      +

                      the fieldname this field will map to in the database

                      +
                      + +
                      +
                      +default = None
                      +

                      the default value, can be a value or a callable (no args)

                      +
                      + +
                      +
                      +required = False
                      +

                      boolean, is the field required? Model validation will raise and +exception if required is set to True and there is a None value assigned

                      +
                      + +
                      +
                      +clustering_order = None
                      +

                      only applicable on clustering keys (primary keys that are not partition keys) +determines the order that the clustering keys are sorted on disk

                      +
                      + +
                      +
                      +discriminator_column = False
                      +

                      boolean, if set to True, this column will be used for discriminating records +of inherited models.

                      +

                      Should only be set on a column of an abstract model being used for inheritance.

                      +

                      There may only be one discriminator column per model. See __discriminator_value__ +for how to specify the value of this column on specialized models.

                      +
                      + +
                      +
                      +static = False
                      +

                      boolean, if set to True, this is a static column, with a single value per partition

                      +
                      + +
                      + +
                      +
                      +

                      Column Types

                      +

                      Columns of all types are initialized by passing Column attributes to the constructor by keyword.

                      +
                      +
                      +class cassandra.cqlengine.columns.Ascii(**kwargs)
                      +

                      Stores a US-ASCII character string

                      +
                      +
                      Parameters:
                      +
                        +
                      • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

                      • +
                      • max_length (int) – Sets the maximum length of this string, for validation purposes.

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.BigInt(**kwargs)
                      +

                      Stores a 64-bit signed integer value

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Blob(**kwargs)
                      +

                      Stores a raw binary value

                      +
                      + +
                      +
                      +cassandra.cqlengine.columns.Bytes
                      +

                      alias of Blob

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Boolean(**kwargs)
                      +

                      Stores a boolean True or False value

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Counter(index=False, db_field=None, required=False)
                      +

                      Stores a counter that can be incremented and decremented

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Date(**kwargs)
                      +

                      Stores a simple date, with no time-of-day

                      +
                      +

                      Changed in version 2.6.0: removed overload of Date and DateTime. DateTime is a drop-in replacement for legacy models

                      +
                      +

                      requires C* 2.2+ and protocol v4+

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.DateTime(**kwargs)
                      +

                      Stores a datetime value

                      +
                      +
                      +truncate_microseconds = False
                      +

                      Set this True to have model instances truncate the date, quantizing it in the same way it will be in the database. +This allows equality comparison between assigned values and values read back from the database:

                      +
                      DateTime.truncate_microseconds = True
                      +assert Model.create(id=0, d=datetime.utcnow()) == Model.objects(id=0).first()
                      +
                      +
                      +

                      Defaults to False to preserve legacy behavior. May change in the future.

                      +
                      + +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Decimal(**kwargs)
                      +

                      Stores a variable precision decimal value

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Double(**kwargs)
                      +

                      Stores a double-precision floating-point value

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Float(primary_key=False, partition_key=False, index=False, db_field=None, default=None, required=False, clustering_order=None, discriminator_column=False, static=False, custom_index=False)
                      +

                      Stores a single-precision floating-point value

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Integer(**kwargs)
                      +

                      Stores a 32-bit signed integer value

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.List(value_type, default=<class 'list'>, **kwargs)
                      +

                      Stores a list of ordered values

                      +

                      http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_list_t.html

                      +
                      +
                      Parameters:
                      +

                      value_type – a column class indicating the types of the value

                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Map(key_type, value_type, default=<class 'dict'>, **kwargs)
                      +

                      Stores a key -> value map (dictionary)

                      +

                      https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/useMap.html

                      +
                      +
                      Parameters:
                      +
                        +
                      • key_type – a column class indicating the types of the key

                      • +
                      • value_type – a column class indicating the types of the value

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Set(value_type, strict=True, default=<class 'set'>, **kwargs)
                      +

                      Stores a set of unordered, unique values

                      +

                      http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use_set_t.html

                      +
                      +
                      Parameters:
                      +
                        +
                      • value_type – a column class indicating the types of the value

                      • +
                      • strict – sets whether non set values will be coerced to set +type on validation, or raise a validation error, defaults to True

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.SmallInt(**kwargs)
                      +

                      Stores a 16-bit signed integer value

                      +
                      +

                      New in version 2.6.0.

                      +
                      +

                      requires C* 2.2+ and protocol v4+

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Text(min_length=None, max_length=None, **kwargs)
                      +

                      Stores a UTF-8 encoded string

                      +
                      +
                      Parameters:
                      +
                        +
                      • min_length (int) – Sets the minimum length of this string, for validation purposes. +Defaults to 1 if this is a required column. Otherwise, None.

                      • +
                      • max_length (int) – Sets the maximum length of this string, for validation purposes.

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.Time(**kwargs)
                      +

                      Stores a timezone-naive time-of-day, with nanosecond precision

                      +
                      +

                      New in version 2.6.0.

                      +
                      +

                      requires C* 2.2+ and protocol v4+

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.TimeUUID(**kwargs)
                      +

                      UUID containing timestamp

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.TinyInt(**kwargs)
                      +

                      Stores an 8-bit signed integer value

                      +
                      +

                      New in version 2.6.0.

                      +
                      +

                      requires C* 2.2+ and protocol v4+

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.UserDefinedType(user_type, **kwargs)
                      +

                      User Defined Type column

                      +

                      http://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html

                      +

                      These columns are represented by a specialization of cassandra.cqlengine.usertype.UserType.

                      +

                      Please see User Defined Types for examples and discussion.

                      +
                      +
                      Parameters:
                      +

                      user_type (type) – specifies the UserType model of the column

                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.UUID(**kwargs)
                      +

                      Stores a type 1 or 4 UUID

                      +
                      + +
                      +
                      +class cassandra.cqlengine.columns.VarInt(**kwargs)
                      +

                      Stores an arbitrary-precision integer

                      +
                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cqlengine/connection.html b/stable/api/cassandra/cqlengine/connection.html new file mode 100644 index 0000000000..52ea7dc04f --- /dev/null +++ b/stable/api/cassandra/cqlengine/connection.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + cassandra.cqlengine.connection - Connection management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cqlengine.connection - Connection management for cqlengine

                      +
                      +
                      +cassandra.cqlengine.connection.default()
                      +

                      Configures the default connection to localhost, using the driver defaults +(except for row_factory)

                      +
                      + +
                      +
                      +cassandra.cqlengine.connection.set_session(s)
                      +

                      Configures the default connection with a preexisting cassandra.cluster.Session

                      +

                      Note: the mapper presently requires a Session cassandra.cluster.Session.row_factory set to dict_factory. +This may be relaxed in the future

                      +
                      + +
                      +
                      +cassandra.cqlengine.connection.setup(hosts, default_keyspace, consistency=None, lazy_connect=False, retry_connect=False, **kwargs)
                      +

                      Setup a the driver connection used by the mapper

                      +
                      +
                      Parameters:
                      +
                        +
                      • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster)

                      • +
                      • default_keyspace (str) – The default keyspace to use

                      • +
                      • consistency (int) – The global default ConsistencyLevel - default is the same as Session.default_consistency_level

                      • +
                      • lazy_connect (bool) – True if should not connect until first use

                      • +
                      • retry_connect (bool) – True if we should retry to connect even if there was a connection failure initially

                      • +
                      • **kwargs – Pass-through keyword arguments for cassandra.cluster.Cluster

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +cassandra.cqlengine.connection.register_connection(name, hosts=None, consistency=None, lazy_connect=False, retry_connect=False, cluster_options=None, default=False, session=None)
                      +

                      Add a connection to the connection registry. hosts and session are +mutually exclusive, and consistency, lazy_connect, +retry_connect, and cluster_options only work with hosts. Using +hosts will create a new cassandra.cluster.Cluster and +cassandra.cluster.Session.

                      +
                      +
                      Parameters:
                      +
                        +
                      • hosts (list) – list of hosts, (contact_points for cassandra.cluster.Cluster).

                      • +
                      • consistency (int) – The default ConsistencyLevel for the +registered connection’s new session. Default is the same as +Session.default_consistency_level. For use with hosts only; +will fail when used with session.

                      • +
                      • lazy_connect (bool) – True if should not connect until first use. For +use with hosts only; will fail when used with session.

                      • +
                      • retry_connect (bool) – True if we should retry to connect even if there +was a connection failure initially. For use with hosts only; will +fail when used with session.

                      • +
                      • cluster_options (dict) – A dict of options to be used as keyword +arguments to cassandra.cluster.Cluster. For use with hosts +only; will fail when used with session.

                      • +
                      • default (bool) – If True, set the new connection as the cqlengine +default

                      • +
                      • session (Session) – A cassandra.cluster.Session to be used in +the created connection.

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +cassandra.cqlengine.connection.unregister_connection(name)
                      +
                      + +
                      +
                      +cassandra.cqlengine.connection.set_default_connection(name)
                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cqlengine/management.html b/stable/api/cassandra/cqlengine/management.html new file mode 100644 index 0000000000..32637e42f8 --- /dev/null +++ b/stable/api/cassandra/cqlengine/management.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + cassandra.cqlengine.management - Schema management for cqlengine | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cqlengine.management - Schema management for cqlengine

                      +

                      A collection of functions for managing keyspace and table schema.

                      +
                      +
                      +cassandra.cqlengine.management.create_keyspace_simple(name, replication_factor, durable_writes=True, connections=None)
                      +

                      Creates a keyspace with SimpleStrategy for replica placement

                      +

                      If the keyspace already exists, it will not be modified.

                      +

                      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                      +

                      There are plans to guard schema-modifying functions with an environment-driven conditional.

                      +
                      +
                      Parameters:
                      +
                        +
                      • name (str) – name of keyspace to create

                      • +
                      • replication_factor (int) – keyspace replication factor, used with SimpleStrategy

                      • +
                      • durable_writes (bool) – Write log is bypassed if set to False

                      • +
                      • connections (list) – List of connection names

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +cassandra.cqlengine.management.create_keyspace_network_topology(name, dc_replication_map, durable_writes=True, connections=None)
                      +

                      Creates a keyspace with NetworkTopologyStrategy for replica placement

                      +

                      If the keyspace already exists, it will not be modified.

                      +

                      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                      +

                      There are plans to guard schema-modifying functions with an environment-driven conditional.

                      +
                      +
                      Parameters:
                      +
                        +
                      • name (str) – name of keyspace to create

                      • +
                      • dc_replication_map (dict) – map of dc_names: replication_factor

                      • +
                      • durable_writes (bool) – Write log is bypassed if set to False

                      • +
                      • connections (list) – List of connection names

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +cassandra.cqlengine.management.drop_keyspace(name, connections=None)
                      +

                      Drops a keyspace, if it exists.

                      +

                      There are plans to guard schema-modifying functions with an environment-driven conditional.

                      +

                      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                      +
                      +
                      Parameters:
                      +
                        +
                      • name (str) – name of keyspace to drop

                      • +
                      • connections (list) – List of connection names

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +cassandra.cqlengine.management.sync_table(model, keyspaces=None, connections=None)
                      +

                      Inspects the model and creates / updates the corresponding table and columns.

                      +

                      If keyspaces is specified, the table will be synched for all specified keyspaces. +Note that the Model.__keyspace__ is ignored in that case.

                      +

                      If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

                      +

                      Any User Defined Types used in the table are implicitly synchronized.

                      +

                      This function can only add fields that are not part of the primary key.

                      +

                      Note that the attributes removed from the model are not deleted on the database. +They become effectively ignored by (will not show up on) the model.

                      +

                      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                      +

                      There are plans to guard schema-modifying functions with an environment-driven conditional.

                      +
                      + +
                      +
                      +cassandra.cqlengine.management.sync_type(ks_name, type_model, connection=None)
                      +

                      Inspects the type_model and creates / updates the corresponding type.

                      +

                      Note that the attributes removed from the type_model are not deleted on the database (this operation is not supported). +They become effectively ignored by (will not show up on) the type_model.

                      +

                      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                      +

                      There are plans to guard schema-modifying functions with an environment-driven conditional.

                      +
                      + +
                      +
                      +cassandra.cqlengine.management.drop_table(model, keyspaces=None, connections=None)
                      +

                      Drops the table indicated by the model, if it exists.

                      +

                      If keyspaces is specified, the table will be dropped for all specified keyspaces. Note that the Model.__keyspace__ is ignored in that case.

                      +

                      If connections is specified, the table will be synched for all specified connections. Note that the Model.__connection__ is ignored in that case. +If not specified, it will try to get the connection from the Model.

                      +

                      This function should be used with caution, especially in production environments. +Take care to execute schema modifications in a single context (i.e. not concurrently with other clients).

                      +

                      There are plans to guard schema-modifying functions with an environment-driven conditional.

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cqlengine/models.html b/stable/api/cassandra/cqlengine/models.html new file mode 100644 index 0000000000..c82ccefb83 --- /dev/null +++ b/stable/api/cassandra/cqlengine/models.html @@ -0,0 +1,955 @@ + + + + + + + + + + + + + cassandra.cqlengine.models - Table models for object mapping | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cqlengine.models - Table models for object mapping

                      +
                      +

                      Model

                      +
                      +
                      +class cassandra.cqlengine.models.Model(\*\*kwargs)
                      +

                      The initializer creates an instance of the model. Pass in keyword arguments for columns you’ve defined on the model.

                      +
                      class Person(Model):
                      +    id = columns.UUID(primary_key=True)
                      +    first_name  = columns.Text()
                      +    last_name = columns.Text()
                      +
                      +person = Person(first_name='Blake', last_name='Eggleston')
                      +person.first_name  #returns 'Blake'
                      +person.last_name  #returns 'Eggleston'
                      +
                      +
                      +

                      Model attributes define how the model maps to tables in the database. These are class variables that should be set +when defining Model deriviatives.

                      +
                      +
                      +__abstract__ = False
                      +

                      Optional. Indicates that this model is only intended to be used as a base class for other models. +You can’t create tables for abstract models, but checks around schema validity are skipped during class construction.

                      +
                      + +
                      +
                      +__table_name__ = None
                      +

                      Optional. Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it’s module name as it’s prefix. Manually defined table names are not inherited.

                      +
                      + +
                      +
                      +__table_name_case_sensitive__ = False
                      +

                      Optional. By default, __table_name__ is case insensitive. Set this to True if you want to preserve the case sensitivity.

                      +
                      + +
                      +
                      +__keyspace__ = None
                      +

                      Sets the name of the keyspace used by this model.

                      +
                      + +
                      +
                      +__connection__ = None
                      +

                      Sets the name of the default connection used by this model.

                      +
                      + +
                      +
                      +__default_ttl__ = None
                      +

                      Will be deprecated in release 4.0. You can set the default ttl by configuring the table __options__. See Default TTL and Per Query TTL for more details.

                      +
                      + +
                      +
                      +__discriminator_value__ = None
                      +

                      Optional Specifies a value for the discriminator column when using model inheritance.

                      +

                      See Model Inheritance for usage examples.

                      +
                      + +

                      Each table can have its own set of configuration options, including compaction. Unspecified, these default to sensible values in +the server. To override defaults, set options using the model __options__ attribute, which allows options specified a dict.

                      +

                      When a table is synced, it will be altered to match the options set on your table. +This means that if you are changing settings manually they will be changed back on resync.

                      +

                      Do not use the options settings of cqlengine if you want to manage your compaction settings manually.

                      +

                      See the list of supported table properties for more information.

                      +
                      +
                      +__options__
                      +

                      For example:

                      +
                      class User(Model):
                      +    __options__ = {'compaction': {'class': 'LeveledCompactionStrategy',
                      +                                  'sstable_size_in_mb': '64',
                      +                                  'tombstone_threshold': '.2'},
                      +                   'comment': 'User data stored here'}
                      +
                      +    user_id = columns.UUID(primary_key=True)
                      +    name = columns.Text()
                      +
                      +
                      +

                      or :

                      +
                      class TimeData(Model):
                      +    __options__ = {'compaction': {'class': 'SizeTieredCompactionStrategy',
                      +                                  'bucket_low': '.3',
                      +                                  'bucket_high': '2',
                      +                                  'min_threshold': '2',
                      +                                  'max_threshold': '64',
                      +                                  'tombstone_compaction_interval': '86400'},
                      +                   'gc_grace_seconds': '0'}
                      +
                      +
                      +
                      + +
                      +
                      +__compute_routing_key__ = True
                      +

                      Optional Setting False disables computing the routing key for TokenAwareRouting

                      +
                      + +

                      The base methods allow creating, storing, and querying modeled objects.

                      +
                      +
                      +classmethod create(**kwargs)
                      +

                      Create an instance of this model in the database.

                      +

                      Takes the model column values as keyword arguments. Setting a value to +None is equivalent to running a CQL DELETE on that column.

                      +

                      Returns the instance.

                      +
                      + +
                      +
                      +if_not_exists()
                      +

                      Check the existence of an object before insertion. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

                      +

                      If the insertion isn’t applied, a LWTException is raised.

                      +
                      try:
                      +    TestIfNotExistsModel.if_not_exists().create(id=id, count=9, text='111111111111')
                      +except LWTException as e:
                      +    # handle failure case
                      +    print e.existing  # dict containing LWT result fields
                      +
                      +
                      +

                      This method is supported on Cassandra 2.0 or later.

                      +
                      + +
                      +
                      +if_exists()
                      +

                      Check the existence of an object before an update or delete. The existence of an +object is determined by its primary key(s). And please note using this flag +would incur performance cost.

                      +

                      If the update or delete isn’t applied, a LWTException is raised.

                      +
                      try:
                      +    TestIfExistsModel.objects(id=id).if_exists().update(count=9, text='111111111111')
                      +except LWTException as e:
                      +    # handle failure case
                      +    pass
                      +
                      +
                      +

                      This method is supported on Cassandra 2.0 or later.

                      +
                      + +
                      +
                      +save()
                      +

                      Saves an object to the database.

                      +
                      #create a person instance
                      +person = Person(first_name='Kimberly', last_name='Eggleston')
                      +#saves it to Cassandra
                      +person.save()
                      +
                      +
                      +
                      + +
                      +
                      +update(**values)
                      +

                      Performs an update on the model instance. You can pass in values to set on the model +for updating, or you can call without values to execute an update against any modified +fields. If no fields on the model have been modified since loading, no query will be +performed. Model validation is performed normally. Setting a value to None is +equivalent to running a CQL DELETE on that column.

                      +

                      It is possible to do a blind update, that is, to update a field without having first selected the object out of the database. +See Blind Updates

                      +
                      + +
                      +
                      +iff(**values)
                      +

                      Checks to ensure that the values specified are correct on the Cassandra cluster. +Simply specify the column(s) and the expected value(s). As with if_not_exists, +this incurs a performance cost.

                      +

                      If the insertion isn’t applied, a LWTException is raised.

                      +
                      t = TestTransactionModel(text='some text', count=5)
                      +try:
                      +     t.iff(count=5).update('other text')
                      +except LWTException as e:
                      +    # handle failure case
                      +    print e.existing # existing object
                      +
                      +
                      +
                      + +
                      +
                      +classmethod get(*args, **kwargs)
                      +

                      Returns a single object based on the passed filter constraints.

                      +

                      This is a pass-through to the model objects().:method:~cqlengine.queries.get.

                      +
                      + +
                      +
                      +classmethod filter(*args, **kwargs)
                      +

                      Returns a queryset based on filter parameters.

                      +

                      This is a pass-through to the model objects().:method:~cqlengine.queries.filter.

                      +
                      + +
                      +
                      +classmethod all()
                      +

                      Returns a queryset representing all stored objects

                      +

                      This is a pass-through to the model objects().all()

                      +
                      + +
                      +
                      +delete()
                      +

                      Deletes the object from the database

                      +
                      + +
                      +
                      +batch(batch_object)
                      +

                      Sets the batch object to run instance updates and inserts queries with.

                      +

                      See Batch Queries for usage examples

                      +
                      + +
                      +
                      +timeout(timeout)
                      +

                      Sets a timeout for use in save(), update(), and delete() +operations

                      +
                      + +
                      +
                      +timestamp(timedelta_or_datetime)
                      +

                      Sets the timestamp for the query

                      +
                      + +
                      +
                      +ttl(ttl_in_sec)
                      +

                      Sets the ttl values to run instance updates and inserts queries with.

                      +
                      + +
                      +
                      +using(connection=None)
                      +

                      Change the context on the fly of the model instance (keyspace, connection)

                      +
                      + +
                      +
                      +classmethod column_family_name(include_keyspace=True)
                      +

                      Returns the column family name if it’s been defined +otherwise, it creates it from the module and class name

                      +
                      + +

                      Models also support dict-like access:

                      +
                      +
                      +len(m)
                      +

                      Returns the number of columns defined in the model

                      +
                      + +
                      +
                      +m[col_name]()
                      +

                      Returns the value of column col_name

                      +
                      + +
                      +
                      +m[col_name] = value
                      +

                      Set m[col_name] to value

                      +
                      + +
                      +
                      +keys()
                      +

                      Returns a list of column IDs.

                      +
                      + +
                      +
                      +values()
                      +

                      Returns list of column values.

                      +
                      + +
                      +
                      +items()
                      +

                      Returns a list of column ID/value tuples.

                      +
                      + +
                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cqlengine/query.html b/stable/api/cassandra/cqlengine/query.html new file mode 100644 index 0000000000..a496aa3543 --- /dev/null +++ b/stable/api/cassandra/cqlengine/query.html @@ -0,0 +1,1051 @@ + + + + + + + + + + + + + cassandra.cqlengine.query - Query and filter model objects | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cqlengine.query - Query and filter model objects

                      +
                      +

                      QuerySet

                      +

                      QuerySet objects are typically obtained by calling objects() on a model class. +The methods here are used to filter, order, and constrain results.

                      +
                      +
                      +class cassandra.cqlengine.query.ModelQuerySet(model)
                      +
                      +
                      +all()
                      +

                      Returns a queryset matching all rows

                      +
                      for user in User.objects().all():
                      +    print(user)
                      +
                      +
                      +
                      + +
                      +
                      +batch(batch_obj)
                      +

                      Set a batch object to run the query on.

                      +

                      Note: running a select query with a batch object will raise an exception

                      +
                      + +
                      +
                      +consistency(consistency)
                      +

                      Sets the consistency level for the operation. See ConsistencyLevel.

                      +
                      for user in User.objects(id=3).consistency(CL.ONE):
                      +    print(user)
                      +
                      +
                      +
                      + +
                      +
                      +count()
                      +

                      Returns the number of rows matched by this query.

                      +

                      Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

                      +
                      + +
                      +
                      +len(queryset)
                      +

                      Returns the number of rows matched by this query. This function uses count() internally.

                      +

                      Note: This function executes a SELECT COUNT() and has a performance cost on large datasets

                      +
                      + +
                      +
                      +distinct(distinct_fields=None)
                      +

                      Returns the DISTINCT rows matched by this query.

                      +

                      distinct_fields default to the partition key fields if not specified.

                      +

                      Note: distinct_fields must be a partition key or a static column

                      +
                      class Automobile(Model):
                      +    manufacturer = columns.Text(partition_key=True)
                      +    year = columns.Integer(primary_key=True)
                      +    model = columns.Text(primary_key=True)
                      +    price = columns.Decimal()
                      +
                      +sync_table(Automobile)
                      +
                      +# create rows
                      +
                      +Automobile.objects.distinct()
                      +
                      +# or
                      +
                      +Automobile.objects.distinct(['manufacturer'])
                      +
                      +
                      +
                      + +
                      +
                      +filter(*args, **kwargs)
                      +

                      Adds WHERE arguments to the queryset, returning a new queryset

                      +

                      See Retrieving objects with filters

                      +

                      Returns a QuerySet filtered on the keyword arguments

                      +
                      + +
                      +
                      +get(*args, **kwargs)
                      +

                      Returns a single instance matching this query, optionally with additional filter kwargs.

                      +

                      See Retrieving objects with filters

                      +

                      Returns a single object matching the QuerySet.

                      +
                      user = User.get(id=1)
                      +
                      +
                      +

                      If no objects are matched, a DoesNotExist exception is raised.

                      +

                      If more than one object is found, a MultipleObjectsReturned exception is raised.

                      +
                      + +
                      +
                      +limit(v)
                      +

                      Limits the number of results returned by Cassandra. Use 0 or None to disable.

                      +

                      Note that CQL’s default limit is 10,000, so all queries without a limit set explicitly will have an implicit limit of 10,000

                      +
                      # Fetch 100 users
                      +for user in User.objects().limit(100):
                      +    print(user)
                      +
                      +# Fetch all users
                      +for user in User.objects().limit(None):
                      +    print(user)
                      +
                      +
                      +
                      + +
                      +
                      +fetch_size(v)
                      +

                      Sets the number of rows that are fetched at a time.

                      +

                      Note that driver’s default fetch size is 5000.

                      +
                      for user in User.objects().fetch_size(500):
                      +    print(user)
                      +
                      +
                      +
                      + +
                      +
                      +if_not_exists()
                      +

                      Check the existence of an object before insertion.

                      +

                      If the insertion isn’t applied, a LWTException is raised.

                      +
                      + +
                      +
                      +if_exists()
                      +

                      Check the existence of an object before an update or delete.

                      +

                      If the update or delete isn’t applied, a LWTException is raised.

                      +
                      + +
                      +
                      +order_by(*colnames)
                      +

                      Sets the column(s) to be used for ordering

                      +

                      Default order is ascending, prepend a ‘-’ to any column name for descending

                      +

                      Note: column names must be a clustering key

                      +
                      from uuid import uuid1,uuid4
                      +
                      +class Comment(Model):
                      +    photo_id = UUID(primary_key=True)
                      +    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
                      +    comment = Text()
                      +
                      +sync_table(Comment)
                      +
                      +u = uuid4()
                      +for x in range(5):
                      +    Comment.create(photo_id=u, comment="test %d" % x)
                      +
                      +print("Normal")
                      +for comment in Comment.objects(photo_id=u):
                      +    print comment.comment_id
                      +
                      +print("Reversed")
                      +for comment in Comment.objects(photo_id=u).order_by("-comment_id"):
                      +    print comment.comment_id
                      +
                      +
                      +
                      + +
                      +
                      +allow_filtering()
                      +

                      Enables the (usually) unwise practive of querying on a clustering key without also defining a partition key

                      +
                      + +
                      +
                      +only(fields)
                      +

                      Load only these fields for the returned query

                      +
                      + +
                      +
                      +defer(fields)
                      +

                      Don’t load these fields for the returned query

                      +
                      + +
                      +
                      +timestamp(timestamp)
                      +

                      Allows for custom timestamps to be saved with the record.

                      +
                      + +
                      +
                      +ttl(ttl)
                      +

                      Sets the ttl (in seconds) for modified data.

                      +

                      Note that running a select query with a ttl value will raise an exception

                      +
                      + +
                      +
                      +using(keyspace=None, connection=None)
                      +

                      Change the context on-the-fly of the Model class (keyspace, connection)

                      +
                      + +
                      +
                      +update(**values)
                      +

                      Performs an update on the row selected by the queryset. Include values to update in the +update like so:

                      +
                      Model.objects(key=n).update(value='x')
                      +
                      +
                      +

                      Passing in updates for columns which are not part of the model will raise a ValidationError.

                      +

                      Per column validation will be performed, but instance level validation will not +(i.e., Model.validate is not called). This is sometimes referred to as a blind update.

                      +

                      For example:

                      +
                      class User(Model):
                      +    id = Integer(primary_key=True)
                      +    name = Text()
                      +
                      +setup(["localhost"], "test")
                      +sync_table(User)
                      +
                      +u = User.create(id=1, name="jon")
                      +
                      +User.objects(id=1).update(name="Steve")
                      +
                      +# sets name to null
                      +User.objects(id=1).update(name=None)
                      +
                      +
                      +

                      Also supported is blindly adding and removing elements from container columns, +without loading a model instance from Cassandra.

                      +

                      Using the syntax .update(column_name={x, y, z}) will overwrite the contents of the container, like updating a +non container column. However, adding __<operation> to the end of the keyword arg, makes the update call add +or remove items from the collection, without overwriting then entire column.

                      +

                      Given the model below, here are the operations that can be performed on the different container columns:

                      +
                      class Row(Model):
                      +    row_id      = columns.Integer(primary_key=True)
                      +    set_column  = columns.Set(Integer)
                      +    list_column = columns.List(Integer)
                      +    map_column  = columns.Map(Integer, Integer)
                      +
                      +
                      +

                      Set

                      +
                        +
                      • add: adds the elements of the given set to the column

                      • +
                      • remove: removes the elements of the given set to the column

                      • +
                      +
                      # add elements to a set
                      +Row.objects(row_id=5).update(set_column__add={6})
                      +
                      +# remove elements to a set
                      +Row.objects(row_id=5).update(set_column__remove={4})
                      +
                      +
                      +

                      List

                      +
                        +
                      • append: appends the elements of the given list to the end of the column

                      • +
                      • prepend: prepends the elements of the given list to the beginning of the column

                      • +
                      +
                      # append items to a list
                      +Row.objects(row_id=5).update(list_column__append=[6, 7])
                      +
                      +# prepend items to a list
                      +Row.objects(row_id=5).update(list_column__prepend=[1, 2])
                      +
                      +
                      +

                      Map

                      +
                        +
                      • update: adds the given keys/values to the columns, creating new entries if they didn’t exist, and overwriting old ones if they did

                      • +
                      +
                      # add items to a map
                      +Row.objects(row_id=5).update(map_column__update={1: 2, 3: 4})
                      +
                      +# remove items from a map
                      +Row.objects(row_id=5).update(map_column__remove={1, 2})
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +class cassandra.cqlengine.query.BatchQuery(batch_type=None, timestamp=None, consistency=None, execute_on_exception=False, timeout=<object object>, connection=None)
                      +

                      Handles the batching of queries

                      +

                      http://docs.datastax.com/en/cql/3.0/cql/cql_reference/batch_r.html

                      +

                      See Batch Queries for more details.

                      +
                      +
                      Parameters:
                      +
                        +
                      • batch_type (BatchType, str or None) – (optional) One of batch type values available through BatchType enum

                      • +
                      • timestamp (datetime or timedelta or None) – (optional) A datetime or timedelta object with desired timestamp to be applied +to the batch conditional.

                      • +
                      • consistency (The ConsistencyLevel to be used for the batch query, or None.) – (optional) One of consistency values (“ANY”, “ONE”, “QUORUM” etc)

                      • +
                      • execute_on_exception (bool) – (Defaults to False) Indicates that when the BatchQuery instance is used +as a context manager the queries accumulated within the context must be executed despite +encountering an error within the context. By default, any exception raised from within +the context scope will cause the batched queries not to be executed.

                      • +
                      • timeout (float or None) – (optional) Timeout for the entire batch (in seconds), if not specified fallback +to default session timeout

                      • +
                      • connection (str) – Connection name to use for the batch execution

                      • +
                      +
                      +
                      +
                      +
                      +add_query(query)
                      +
                      + +
                      +
                      +execute()
                      +
                      + +
                      +
                      +add_callback(fn, *args, **kwargs)
                      +

                      Add a function and arguments to be passed to it to be executed after the batch executes.

                      +

                      A batch can support multiple callbacks.

                      +

                      Note, that if the batch does not execute, the callbacks are not executed. +A callback, thus, is an “on batch success” handler.

                      +
                      +
                      Parameters:
                      +
                        +
                      • fn (callable) – Callable object

                      • +
                      • *args – Positional arguments to be passed to the callback at the time of execution

                      • +
                      • **kwargs – Named arguments to be passed to the callback at the time of execution

                      • +
                      +
                      +
                      +
                      + +
                      + +
                      +
                      +class cassandra.cqlengine.query.ContextQuery(*args, **kwargs)
                      +

                      A Context manager to allow a Model to switch context easily. Presently, the context only +specifies a keyspace for model IO.

                      +
                      +
                      Parameters:
                      +
                        +
                      • *args – One or more models. A model should be a class type, not an instance.

                      • +
                      • **kwargs – (optional) Context parameters: can be keyspace or connection

                      • +
                      +
                      +
                      +

                      For example:

                      +
                      with ContextQuery(Automobile, keyspace='test2') as A:
                      +    A.objects.create(manufacturer='honda', year=2008, model='civic')
                      +    print len(A.objects.all())  # 1 result
                      +
                      +with ContextQuery(Automobile, keyspace='test4') as A:
                      +    print len(A.objects.all())  # 0 result
                      +
                      +# Multiple models
                      +with ContextQuery(Automobile, Automobile2, connection='cluster2') as (A, A2):
                      +    print len(A.objects.all())
                      +    print len(A2.objects.all())
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.cqlengine.query.DoesNotExist
                      +
                      + +
                      +
                      +class cassandra.cqlengine.query.MultipleObjectsReturned
                      +
                      + +
                      +
                      +class cassandra.cqlengine.query.LWTException(existing)
                      +

                      Lightweight conditional exception.

                      +

                      This exception will be raised when a write using an IF clause could not be +applied due to existing data violating the condition. The existing data is +available through the existing attribute.

                      +
                      +
                      Parameters:
                      +

                      existing – The current state of the data which prevented the write.

                      +
                      +
                      +
                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/cqlengine/usertype.html b/stable/api/cassandra/cqlengine/usertype.html new file mode 100644 index 0000000000..a4e0ec7f12 --- /dev/null +++ b/stable/api/cassandra/cqlengine/usertype.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + cassandra.cqlengine.usertype - Model classes for User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.cqlengine.usertype - Model classes for User Defined Types

                      +
                      +

                      UserType

                      +
                      +
                      +class cassandra.cqlengine.usertype.UserType(**values)
                      +

                      This class is used to model User Defined Types. To define a type, declare a class inheriting from this, +and assign field types as class attributes:

                      +
                      # connect with default keyspace ...
                      +
                      +from cassandra.cqlengine.columns import Text, Integer
                      +from cassandra.cqlengine.usertype import UserType
                      +
                      +class address(UserType):
                      +    street = Text()
                      +    zipcode = Integer()
                      +
                      +from cassandra.cqlengine import management
                      +management.sync_type(address)
                      +
                      +
                      +

                      Please see User Defined Types for a complete example and discussion.

                      +
                      +
                      +__type_name__ = None
                      +

                      Optional. Sets the name of the CQL type for this type.

                      +

                      If not specified, the type name will be the name of the class, with it’s module name as it’s prefix.

                      +
                      + +
                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/datastax/graph/fluent/index.html b/stable/api/cassandra/datastax/graph/fluent/index.html new file mode 100644 index 0000000000..b8a7181d9c --- /dev/null +++ b/stable/api/cassandra/datastax/graph/fluent/index.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.datastax.graph.fluent

                      +
                      +
                      +class cassandra.datastax.graph.fluent.DseGraph
                      +

                      Dse Graph utility class for GraphTraversal construction and execution.

                      +
                      +
                      +DSE_GRAPH_QUERY_LANGUAGE = 'bytecode-json'
                      +

                      Graph query language, Default is ‘bytecode-json’ (GraphSON).

                      +
                      + +
                      +
                      +static create_execution_profile(graph_name, graph_protocol=b'graphson-2.0', **kwargs)
                      +

                      Creates an ExecutionProfile for GraphTraversal execution. You need to register that execution profile to the +cluster by using cluster.add_execution_profile.

                      +
                      +
                      Parameters:
                      +
                        +
                      • graph_name – The graph name

                      • +
                      • graph_protocol – (Optional) The graph protocol, default is DSE_GRAPH_QUERY_PROTOCOL.

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +static query_from_traversal(traversal, graph_protocol=b'graphson-2.0', context=None)
                      +

                      From a GraphTraversal, return a query string based on the language specified in DseGraph.DSE_GRAPH_QUERY_LANGUAGE.

                      +
                      +
                      Parameters:
                      +
                        +
                      • traversal – The GraphTraversal object

                      • +
                      • graph_protocol – The graph protocol. Default is DseGraph.DSE_GRAPH_QUERY_PROTOCOL.

                      • +
                      • context – The dict of the serialization context, needed for GraphSON3 (tuple, udt). +e.g: {‘cluster’: cluster, ‘graph_name’: name}

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +static traversal_source(session=None, graph_name=None, execution_profile=EXEC_PROFILE_GRAPH_DEFAULT, traversal_class=None)
                      +

                      Returns a TinkerPop GraphTraversalSource binded to the session and graph_name if provided.

                      +
                      +
                      Parameters:
                      +
                        +
                      • session – (Optional) A DSE session

                      • +
                      • graph_name – (Optional) DSE Graph name

                      • +
                      • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

                      • +
                      • traversal_class – (Optional) The GraphTraversalSource class to use (DSL).

                      • +
                      +
                      +
                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.datastax.graph.fluent import DseGraph
                      +
                      +c = Cluster()
                      +session = c.connect()
                      +
                      +g = DseGraph.traversal_source(session, 'my_graph')
                      +print g.V().valueMap().toList()
                      +
                      +
                      +
                      + +
                      +
                      +static batch(session=None, execution_profile=None)
                      +

                      Returns the cassandra.datastax.graph.fluent.query.TraversalBatch object allowing to +execute multiple traversals in the same transaction.

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection(session[, graph_name, execution_profile])
                      +

                      A Tinkerpop RemoteConnection to execute traversal queries on DSE.

                      +
                      +
                      Parameters:
                      +
                        +
                      • session – A DSE session

                      • +
                      • graph_name – (Optional) DSE Graph name.

                      • +
                      • execution_profile – (Optional) Execution profile for traversal queries. Default is set to EXEC_PROFILE_GRAPH_DEFAULT.

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.datastax.graph.fluent.BaseGraphRowFactory(cluster)
                      +

                      Base row factory for graph traversal. This class basically wraps a +graphson reader function to handle additional features of Gremlin/DSE +and is callable as a normal row factory.

                      +
                      +
                      Currently supported:
                        +
                      • bulk results

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +cassandra.datastax.graph.fluent.graph_traversal_row_factory
                      +

                      alias of _GremlinGraphSON2RowFactory

                      +
                      + +
                      +
                      +cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory
                      +

                      alias of _DseGraphSON2RowFactory

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/datastax/graph/fluent/predicates.html b/stable/api/cassandra/datastax/graph/fluent/predicates.html new file mode 100644 index 0000000000..6479c2918b --- /dev/null +++ b/stable/api/cassandra/datastax/graph/fluent/predicates.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.predicates | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.datastax.graph.fluent.predicates

                      +
                      +
                      +class cassandra.datastax.graph.fluent.predicates.Search
                      +
                      +
                      +static token(value)
                      +

                      Search any instance of a certain token within the text property targeted. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static token_prefix(value)
                      +

                      Search any instance of a certain token prefix withing the text property targeted. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static token_regex(value)
                      +

                      Search any instance of the provided regular expression for the targeted property. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static prefix(value)
                      +

                      Search for a specific prefix at the beginning of the text property targeted. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static regex(value)
                      +

                      Search for this regular expression inside the text property targeted. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static fuzzy(value, distance)
                      +

                      Search for a fuzzy string inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the fuzzy search. ie. 1, to allow a one-letter misspellings.

                      +
                      + +
                      +
                      +static token_fuzzy(value, distance)
                      +

                      Search for a token fuzzy inside the text property targeted. +:param value: the value to look for. +:param distance: The distance for the token fuzzy search. ie. 1, to allow a one-letter misspellings.

                      +
                      + +
                      +
                      +static phrase(value, proximity)
                      +

                      Search for a phrase inside the text property targeted. +:param value: the value to look for. +:param proximity: The proximity for the phrase search. ie. phrase(‘David Felcey’, 2).. to find ‘David Felcey’ with up to two middle names.

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.fluent.predicates.CqlCollection
                      +
                      +
                      +static contains(value)
                      +

                      Search for a value inside a cql list/set column. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static contains_value(value)
                      +

                      Search for a map value. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static contains_key(value)
                      +

                      Search for a map key. +:param value: the value to look for.

                      +
                      + +
                      +
                      +static entry_eq(value)
                      +

                      Search for a map entry. +:param value: the value to look for.

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.fluent.predicates.Geo
                      +
                      +
                      +static inside(value, units=1)
                      +

                      Search any instance of geometry inside the Distance targeted. +:param value: A Distance to look for. +:param units: The units for value. See GeoUnit enum. (Can also +provide an integer to use as a multiplier to convert value to +degrees.)

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/datastax/graph/fluent/query.html b/stable/api/cassandra/datastax/graph/fluent/query.html new file mode 100644 index 0000000000..c6907b04a8 --- /dev/null +++ b/stable/api/cassandra/datastax/graph/fluent/query.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + cassandra.datastax.graph.fluent.query | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.datastax.graph.fluent.query

                      +
                      +
                      +class cassandra.datastax.graph.fluent.query.TraversalBatch(session=None, execution_profile=None)
                      +

                      A TraversalBatch is used to execute multiple graph traversals in a +single transaction. If any traversal in the batch fails, the entire +batch will fail to apply.

                      +

                      If a TraversalBatch is bounded to a DSE session, it can be executed using +traversal_batch.execute().

                      +
                      +
                      Parameters:
                      +
                        +
                      • session – (Optional) A DSE session

                      • +
                      • execution_profile – (Optional) The execution profile to use for the batch execution

                      • +
                      +
                      +
                      +
                      +
                      +add(traversal)
                      +

                      Add a traversal to the batch.

                      +
                      +
                      Parameters:
                      +

                      traversal – A gremlin GraphTraversal

                      +
                      +
                      +
                      + +
                      +
                      +add_all(traversals)
                      +

                      Adds a sequence of traversals to the batch.

                      +
                      +
                      Parameters:
                      +

                      traversals – A sequence of gremlin GraphTraversal

                      +
                      +
                      +
                      + +
                      +
                      +execute()
                      +

                      Execute the traversal batch if bounded to a DSE Session.

                      +
                      + +
                      +
                      +as_graph_statement(graph_protocol=b'graphson-2.0')
                      +

                      Return the traversal batch as GraphStatement.

                      +
                      +
                      Parameters:
                      +

                      graph_protocol – The graph protocol for the GraphSONWriter. Default is GraphProtocol.GRAPHSON_2_0.

                      +
                      +
                      +
                      + +
                      +
                      +clear()
                      +

                      Clear a traversal batch for reuse.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/datastax/graph/index.html b/stable/api/cassandra/datastax/graph/index.html new file mode 100644 index 0000000000..6a8130eddd --- /dev/null +++ b/stable/api/cassandra/datastax/graph/index.html @@ -0,0 +1,1056 @@ + + + + + + + + + + + + + cassandra.datastax.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.datastax.graph - Graph Statements, Options, and Row Factories

                      +
                      +
                      +cassandra.datastax.graph.single_object_row_factory(column_names, rows)
                      +

                      returns the JSON string value of graph results

                      +
                      + +
                      +
                      +cassandra.datastax.graph.graph_result_row_factory(column_names, rows)
                      +

                      Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.graph_object_row_factory(column_names, rows)
                      +

                      Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.graph_graphson2_row_factory(cluster)
                      +

                      Row factory to deserialize GraphSON2 results.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.graph_graphson3_row_factory(cluster)
                      +

                      Row factory to deserialize GraphSON3 results.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.to_int(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Int.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.to_bigint(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Bigint.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.to_smallint(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Smallint.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.to_float(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Float.

                      +
                      + +
                      +
                      +cassandra.datastax.graph.to_double(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Double.

                      +
                      + +
                      +
                      +class cassandra.datastax.graph.GraphProtocol
                      +
                      +
                      +GRAPHSON_1_0 = b'graphson-1.0'
                      +

                      GraphSON1

                      +
                      + +
                      +
                      +GRAPHSON_2_0 = b'graphson-2.0'
                      +

                      GraphSON2

                      +
                      + +
                      +
                      +GRAPHSON_3_0 = b'graphson-3.0'
                      +

                      GraphSON3

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.GraphOptions(**kwargs)
                      +

                      Options for DSE Graph Query handler.

                      +
                      +
                      +graph_name
                      +

                      name of the targeted graph.

                      +
                      + +
                      +
                      +graph_source
                      +

                      choose the graph traversal source, configured on the server side.

                      +
                      + +
                      +
                      +graph_language
                      +

                      the language used in the queries (default “gremlin-groovy”)

                      +
                      + +
                      +
                      +graph_read_consistency_level
                      +

                      read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

                      +
                      + +
                      +
                      +graph_write_consistency_level
                      +

                      write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

                      +
                      + +
                      +
                      +is_default_source
                      +
                      + +
                      +
                      +is_analytics_source
                      +

                      True if graph_source is set to the server-defined analytics traversal source (‘a’)

                      +
                      + +
                      +
                      +is_graph_source
                      +

                      True if graph_source is set to the server-defined graph traversal source (‘g’)

                      +
                      + +
                      +
                      +set_source_default()
                      +

                      Sets graph_source to the server-defined default traversal source (‘default’)

                      +
                      + +
                      +
                      +set_source_analytics()
                      +

                      Sets graph_source to the server-defined analytic traversal source (‘a’)

                      +
                      + +
                      +
                      +set_source_graph()
                      +

                      Sets graph_source to the server-defined graph traversal source (‘g’)

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                      +

                      Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

                      +

                      query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                      +

                      See Statement attributes for a description of the other parameters.

                      +
                      + +
                      +
                      +class cassandra.datastax.graph.Result(value)
                      +

                      Represents deserialized graph results. +Property and item getters are provided for convenience.

                      +
                      +
                      +value = None
                      +

                      Deserialized value from the result

                      +
                      + +
                      +
                      +as_vertex()
                      +

                      Return a Vertex parsed from this result

                      +

                      Raises TypeError if parsing fails (i.e. the result structure is not valid).

                      +
                      + +
                      +
                      +as_edge()
                      +

                      Return a Edge parsed from this result

                      +

                      Raises TypeError if parsing fails (i.e. the result structure is not valid).

                      +
                      + +
                      +
                      +as_path()
                      +

                      Return a Path parsed from this result

                      +

                      Raises TypeError if parsing fails (i.e. the result structure is not valid).

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.Vertex(id, label, type, properties)
                      +

                      Represents a Vertex element from a graph query.

                      +

                      Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

                      +
                      + +
                      +
                      +class cassandra.datastax.graph.VertexProperty(label, value, properties=None)
                      +

                      Vertex properties have a top-level value and an optional dict of properties.

                      +
                      +
                      +label = None
                      +

                      label of the property

                      +
                      + +
                      +
                      +value = None
                      +

                      Value of the property

                      +
                      + +
                      +
                      +properties = None
                      +

                      dict of properties attached to the property

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
                      +

                      Represents an Edge element from a graph query.

                      +

                      Attributes match initializer parameters.

                      +
                      + +
                      +
                      +class cassandra.datastax.graph.Path(labels, objects)
                      +

                      Represents a graph path.

                      +

                      Labels list is taken verbatim from the results.

                      +

                      Objects are either Result or Vertex/Edge for recognized types

                      +
                      +
                      +labels = None
                      +

                      List of labels in the path

                      +
                      + +
                      +
                      +objects = None
                      +

                      List of objects in the path

                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.T(name, val)
                      +

                      Represents a collection of tokens for more concise Traversal definitions.

                      +
                      +
                      +id = T.id
                      +
                      + +
                      +
                      +key = T.key
                      +
                      + +
                      +
                      +label = T.label
                      +
                      + +
                      +
                      +value = T.value
                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.GraphSON1Serializer
                      +

                      Serialize python objects to graphson types.

                      +
                      + +
                      +
                      +class cassandra.datastax.graph.GraphSON1Deserializer
                      +

                      Deserialize graphson1 types to python objects.

                      +
                      +
                      +classmethod deserialize_date(value)
                      +
                      + +
                      +
                      +classmethod deserialize_timestamp(value)
                      +
                      + +
                      +
                      +classmethod deserialize_time(value)
                      +
                      + +
                      +
                      +classmethod deserialize_duration(value)
                      +
                      + +
                      +
                      +classmethod deserialize_int(value)
                      +
                      + +
                      +
                      +classmethod deserialize_bigint(value)
                      +
                      + +
                      +
                      +classmethod deserialize_double(value)
                      +
                      + +
                      +
                      +classmethod deserialize_float(value)
                      +
                      + +
                      +
                      +classmethod deserialize_uuid(value)
                      +
                      + +
                      +
                      +classmethod deserialize_blob(value)
                      +
                      + +
                      +
                      +classmethod deserialize_decimal(value)
                      +
                      + +
                      +
                      +classmethod deserialize_point(value)
                      +
                      + +
                      +
                      +classmethod deserialize_linestring(value)
                      +
                      + +
                      +
                      +classmethod deserialize_polygon(value)
                      +
                      + +
                      + +
                      +
                      +class cassandra.datastax.graph.GraphSON2Reader(context, extra_deserializer_map=None)
                      +

                      GraphSON2 Reader that parse json and deserialize to python objects.

                      +
                      +
                      Parameters:
                      +

                      extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                      +
                      +
                      +
                      +
                      +read(json_data)
                      +

                      Read and deserialize json_data.

                      +
                      + +
                      +
                      +deserialize(obj)
                      +

                      Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/decoder.html b/stable/api/cassandra/decoder.html new file mode 100644 index 0000000000..dc95f63926 --- /dev/null +++ b/stable/api/cassandra/decoder.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + cassandra.decoder - Data Return Formats | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.decoder - Data Return Formats

                      +
                      +
                      +cassandra.decoder.tuple_factory()
                      +

                      Deprecated in 2.0.0. Use cassandra.query.tuple_factory()

                      +
                      + +
                      +
                      +cassandra.decoder.named_tuple_factory()
                      +

                      Deprecated in 2.0.0. Use cassandra.query.named_tuple_factory()

                      +
                      + +
                      +
                      +cassandra.decoder.dict_factory()
                      +

                      Deprecated in 2.0.0. Use cassandra.query.dict_factory()

                      +
                      + +
                      +
                      +cassandra.decoder.ordered_dict_factory()
                      +

                      Deprecated in 2.0.0. Use cassandra.query.ordered_dict_factory()

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/encoder.html b/stable/api/cassandra/encoder.html new file mode 100644 index 0000000000..d75690978e --- /dev/null +++ b/stable/api/cassandra/encoder.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + cassandra.encoder - Encoders for non-prepared Statements | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.encoder - Encoders for non-prepared Statements

                      +
                      +
                      +class cassandra.encoder.Encoder
                      +

                      A container for mapping python types to CQL string literals when working +with non-prepared statements. The type mapping can be +directly customized by users.

                      +
                      +
                      +mapping = None
                      +

                      A map of python types to encoder functions.

                      +
                      + +
                      +
                      +cql_encode_none()
                      +

                      Converts None to the string ‘NULL’.

                      +
                      + +
                      +
                      +cql_encode_object()
                      +

                      Default encoder for all objects that do not have a specific encoder function +registered. This function simply calls str() on the object.

                      +
                      + +
                      +
                      +cql_encode_all_types()
                      +

                      Converts any type into a CQL string, defaulting to cql_encode_object +if mapping does not contain an entry for the type.

                      +
                      + +
                      +
                      +cql_encode_sequence()
                      +

                      Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for IN value lists.

                      +
                      + +
                      +
                      +cql_encode_str()
                      +

                      Escapes quotes in str objects.

                      +
                      + +
                      +
                      +cql_encode_unicode()
                      +

                      Converts unicode objects to UTF-8 encoded strings with quote escaping.

                      +
                      + +
                      +
                      +cql_encode_bytes()
                      +

                      Converts strings, buffers, and bytearrays into CQL blob literals.

                      +
                      + +
                      +
                      +cql_encode_datetime()
                      +

                      Converts a datetime.datetime object to a (string) integer timestamp +with millisecond precision.

                      +
                      + +
                      +
                      +cql_encode_date()
                      +

                      Converts a datetime.date object to a string with format +YYYY-MM-DD.

                      +
                      + +
                      +
                      +cql_encode_map_collection()
                      +

                      Converts a dict into a string of the form {key1: val1, key2: val2, ...}. +This is suitable for map type columns.

                      +
                      + +
                      +
                      +cql_encode_list_collection()
                      +

                      Converts a sequence to a string of the form [item1, item2, ...]. This +is suitable for list type columns.

                      +
                      + +
                      +
                      +cql_encode_set_collection()
                      +

                      Converts a sequence to a string of the form {item1, item2, ...}. This +is suitable for set type columns.

                      +
                      + +
                      +
                      +cql_encode_tuple()
                      +

                      Converts a sequence to a string of the form (item1, item2, ...). This +is suitable for tuple type columns.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/graph.html b/stable/api/cassandra/graph.html new file mode 100644 index 0000000000..a345ff1933 --- /dev/null +++ b/stable/api/cassandra/graph.html @@ -0,0 +1,1089 @@ + + + + + + + + + + + + + cassandra.graph - Graph Statements, Options, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.graph - Graph Statements, Options, and Row Factories

                      +
                      +

                      Note

                      +

                      This module is only for backward compatibility for dse-driver users. Consider using cassandra.datastax.graph.

                      +
                      +
                      +
                      +cassandra.graph.single_object_row_factory(column_names, rows)
                      +

                      returns the JSON string value of graph results

                      +
                      + +
                      +
                      +cassandra.graph.graph_result_row_factory(column_names, rows)
                      +

                      Returns a Result object that can load graph results and produce specific types. +The Result JSON is deserialized and unpacked from the top-level ‘result’ dict.

                      +
                      + +
                      +
                      +cassandra.graph.graph_object_row_factory(column_names, rows)
                      +

                      Like graph_result_row_factory(), except known element types (Vertex, Edge) are +converted to their simplified objects. Some low-level metadata is shed in this conversion. Unknown result types are +still returned as Result.

                      +
                      + +
                      +
                      +cassandra.graph.graph_graphson2_row_factory(cluster)
                      +

                      Row factory to deserialize GraphSON2 results.

                      +
                      + +
                      +
                      +cassandra.graph.graph_graphson3_row_factory(cluster)
                      +

                      Row factory to deserialize GraphSON3 results.

                      +
                      + +
                      +
                      +cassandra.graph.to_int(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Int.

                      +
                      + +
                      +
                      +cassandra.graph.to_bigint(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Bigint.

                      +
                      + +
                      +
                      +cassandra.graph.to_smallint(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Smallint.

                      +
                      + +
                      +
                      +cassandra.graph.to_float(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Float.

                      +
                      + +
                      +
                      +cassandra.graph.to_double(value)
                      +

                      Wraps a value to be explicitly serialized as a graphson Double.

                      +
                      + +
                      +
                      +class cassandra.graph.GraphProtocol
                      +
                      +
                      +GRAPHSON_1_0 = b'graphson-1.0'
                      +

                      GraphSON1

                      +
                      + +
                      +
                      +GRAPHSON_2_0 = b'graphson-2.0'
                      +

                      GraphSON2

                      +
                      + +
                      +
                      +GRAPHSON_3_0 = b'graphson-3.0'
                      +

                      GraphSON3

                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.GraphOptions(**kwargs)
                      +

                      Options for DSE Graph Query handler.

                      +
                      +
                      +graph_name
                      +

                      name of the targeted graph.

                      +
                      + +
                      +
                      +graph_source
                      +

                      choose the graph traversal source, configured on the server side.

                      +
                      + +
                      +
                      +graph_language
                      +

                      the language used in the queries (default “gremlin-groovy”)

                      +
                      + +
                      +
                      +graph_read_consistency_level
                      +

                      read cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for read operations from Cassandra persistence

                      +
                      + +
                      +
                      +graph_write_consistency_level
                      +

                      write cassandra.ConsistencyLevel for graph queries (if distinct from session default). +Setting this overrides the native Statement.consistency_level for write operations to Cassandra persistence.

                      +
                      + +
                      +
                      +is_default_source
                      +
                      + +
                      +
                      +is_analytics_source
                      +

                      True if graph_source is set to the server-defined analytics traversal source (‘a’)

                      +
                      + +
                      +
                      +is_graph_source
                      +

                      True if graph_source is set to the server-defined graph traversal source (‘g’)

                      +
                      + +
                      +
                      +set_source_default()
                      +

                      Sets graph_source to the server-defined default traversal source (‘default’)

                      +
                      + +
                      +
                      +set_source_analytics()
                      +

                      Sets graph_source to the server-defined analytic traversal source (‘a’)

                      +
                      + +
                      +
                      +set_source_graph()
                      +

                      Sets graph_source to the server-defined graph traversal source (‘g’)

                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.SimpleGraphStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                      +

                      Simple graph statement for Session.execute_graph(). +Takes the same parameters as SimpleStatement.

                      +

                      query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                      +

                      See Statement attributes for a description of the other parameters.

                      +
                      + +
                      +
                      +class cassandra.graph.Result(value)
                      +

                      Represents deserialized graph results. +Property and item getters are provided for convenience.

                      +
                      +
                      +value = None
                      +

                      Deserialized value from the result

                      +
                      + +
                      +
                      +as_vertex()
                      +

                      Return a Vertex parsed from this result

                      +

                      Raises TypeError if parsing fails (i.e. the result structure is not valid).

                      +
                      + +
                      +
                      +as_edge()
                      +

                      Return a Edge parsed from this result

                      +

                      Raises TypeError if parsing fails (i.e. the result structure is not valid).

                      +
                      + +
                      +
                      +as_path()
                      +

                      Return a Path parsed from this result

                      +

                      Raises TypeError if parsing fails (i.e. the result structure is not valid).

                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.Vertex(id, label, type, properties)
                      +

                      Represents a Vertex element from a graph query.

                      +

                      Vertex properties are extracted into a dict of property names to list of VertexProperty (list +because they are always encoded that way, and sometimes have multiple cardinality; VertexProperty because sometimes +the properties themselves have property maps).

                      +
                      + +
                      +
                      +class cassandra.graph.VertexProperty(label, value, properties=None)
                      +

                      Vertex properties have a top-level value and an optional dict of properties.

                      +
                      +
                      +label = None
                      +

                      label of the property

                      +
                      + +
                      +
                      +value = None
                      +

                      Value of the property

                      +
                      + +
                      +
                      +properties = None
                      +

                      dict of properties attached to the property

                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.Edge(id, label, type, properties, inV, inVLabel, outV, outVLabel)
                      +

                      Represents an Edge element from a graph query.

                      +

                      Attributes match initializer parameters.

                      +
                      + +
                      +
                      +class cassandra.graph.Path(labels, objects)
                      +

                      Represents a graph path.

                      +

                      Labels list is taken verbatim from the results.

                      +

                      Objects are either Result or Vertex/Edge for recognized types

                      +
                      +
                      +labels = None
                      +

                      List of labels in the path

                      +
                      + +
                      +
                      +objects = None
                      +

                      List of objects in the path

                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.GraphSON1Serializer
                      +

                      Serialize python objects to graphson types.

                      +
                      + +
                      +
                      +class cassandra.graph.GraphSON1Deserializer
                      +

                      Deserialize graphson1 types to python objects.

                      +
                      +
                      +classmethod deserialize_date(value)
                      +
                      + +
                      +
                      +classmethod deserialize_timestamp(value)
                      +
                      + +
                      +
                      +classmethod deserialize_time(value)
                      +
                      + +
                      +
                      +classmethod deserialize_duration(value)
                      +
                      + +
                      +
                      +classmethod deserialize_int(value)
                      +
                      + +
                      +
                      +classmethod deserialize_bigint(value)
                      +
                      + +
                      +
                      +classmethod deserialize_double(value)
                      +
                      + +
                      +
                      +classmethod deserialize_float(value)
                      +
                      + +
                      +
                      +classmethod deserialize_uuid(value)
                      +
                      + +
                      +
                      +classmethod deserialize_blob(value)
                      +
                      + +
                      +
                      +classmethod deserialize_decimal(value)
                      +
                      + +
                      +
                      +classmethod deserialize_point(value)
                      +
                      + +
                      +
                      +classmethod deserialize_linestring(value)
                      +
                      + +
                      +
                      +classmethod deserialize_polygon(value)
                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.GraphSON2Reader(context, extra_deserializer_map=None)
                      +

                      GraphSON2 Reader that parse json and deserialize to python objects.

                      +
                      +
                      Parameters:
                      +

                      extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                      +
                      +
                      +
                      +
                      +read(json_data)
                      +

                      Read and deserialize json_data.

                      +
                      + +
                      +
                      +deserialize(obj)
                      +

                      Deserialize GraphSON type-tagged dict values into objects mapped in self.deserializers

                      +
                      + +
                      + +
                      +
                      +class cassandra.graph.GraphSON3Reader(context, extra_deserializer_map=None)
                      +

                      GraphSON3 Reader that parse json and deserialize to python objects.

                      +
                      +
                      Parameters:
                      +
                        +
                      • context – A dict of the context, mostly used as context for udt deserialization.

                      • +
                      • extra_deserializer_map – map from GraphSON type tag to deserializer instance implementing deserialize

                      • +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/io/asyncioreactor.html b/stable/api/cassandra/io/asyncioreactor.html new file mode 100644 index 0000000000..f04e4b9cf3 --- /dev/null +++ b/stable/api/cassandra/io/asyncioreactor.html @@ -0,0 +1,647 @@ + + + + + + + + + + + + + cassandra.io.asyncioreactor - asyncio Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.io.asyncioreactor - asyncio Event Loop

                      +
                      +
                      +class cassandra.io.asyncioreactor.AsyncioConnection(*args, **kwargs)
                      +

                      An experimental implementation of Connection that uses the +asyncio module in the Python standard library for its event loop.

                      +

                      Note that it requires asyncio features that were only introduced in the +3.4 line in 3.4.6, and in the 3.5 line in 3.5.1.

                      +
                      +
                      +classmethod initialize_reactor()
                      +

                      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/io/asyncorereactor.html b/stable/api/cassandra/io/asyncorereactor.html new file mode 100644 index 0000000000..ae9d2bc5de --- /dev/null +++ b/stable/api/cassandra/io/asyncorereactor.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + cassandra.io.asyncorereactor - asyncore Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.io.asyncorereactor - asyncore Event Loop

                      +
                      +
                      +class cassandra.io.asyncorereactor.AsyncoreConnection(*args, **kwargs)
                      +

                      An implementation of Connection that uses the asyncore +module in the Python standard library for its event loop.

                      +
                      +
                      +classmethod initialize_reactor()
                      +

                      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                      +
                      + +
                      +
                      +classmethod handle_fork()
                      +

                      Called after a forking. This should cleanup any remaining reactor state +from the parent process.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/io/eventletreactor.html b/stable/api/cassandra/io/eventletreactor.html new file mode 100644 index 0000000000..de33184fc6 --- /dev/null +++ b/stable/api/cassandra/io/eventletreactor.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + cassandra.io.eventletreactor - eventlet-compatible Connection | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.io.eventletreactor - eventlet-compatible Connection

                      +
                      +
                      +class cassandra.io.eventletreactor.EventletConnection(*args, **kwargs)
                      +

                      An implementation of Connection that utilizes eventlet.

                      +

                      This implementation assumes all eventlet monkey patching is active. It is not tested with partial patching.

                      +
                      +
                      +classmethod initialize_reactor()
                      +

                      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                      +
                      + +
                      +
                      +classmethod service_timeouts()
                      +

                      cls._timeout_watcher runs in this loop forever. +It is usually waiting for the next timeout on the cls._new_timer Event. +When new timers are added, that event is set so that the watcher can +wake up and possibly set an earlier timeout.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/io/geventreactor.html b/stable/api/cassandra/io/geventreactor.html new file mode 100644 index 0000000000..fef9317c9e --- /dev/null +++ b/stable/api/cassandra/io/geventreactor.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + cassandra.io.geventreactor - gevent-compatible Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.io.geventreactor - gevent-compatible Event Loop

                      +
                      +
                      +class cassandra.io.geventreactor.GeventConnection(*args, **kwargs)
                      +

                      An implementation of Connection that utilizes gevent.

                      +

                      This implementation assumes all gevent monkey patching is active. It is not tested with partial patching.

                      +
                      +
                      +classmethod initialize_reactor()
                      +

                      Called once by Cluster.connect(). This should be used by implementations +to set up any resources that will be shared across connections.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/io/libevreactor.html b/stable/api/cassandra/io/libevreactor.html new file mode 100644 index 0000000000..5d24a62ec6 --- /dev/null +++ b/stable/api/cassandra/io/libevreactor.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + cassandra.io.libevreactor - libev Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.io.libevreactor - libev Event Loop

                      +
                      +
                      +class cassandra.io.libevreactor.LibevConnection(*args, **kwargs)
                      +

                      An implementation of Connection that uses libev for its event loop.

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/io/twistedreactor.html b/stable/api/cassandra/io/twistedreactor.html new file mode 100644 index 0000000000..6741ed04cf --- /dev/null +++ b/stable/api/cassandra/io/twistedreactor.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + cassandra.io.twistedreactor - Twisted Event Loop | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.io.twistedreactor - Twisted Event Loop

                      +
                      +
                      +class cassandra.io.twistedreactor.TwistedConnection
                      +

                      An implementation of Connection that uses +Twisted’s reactor as its event loop.

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/metadata.html b/stable/api/cassandra/metadata.html new file mode 100644 index 0000000000..cbee344cc0 --- /dev/null +++ b/stable/api/cassandra/metadata.html @@ -0,0 +1,1095 @@ + + + + + + + + + + + + + cassandra.metadata - Schema and Ring Topology | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.metadata - Schema and Ring Topology

                      +
                      +
                      +cassandra.metadata.cql_keywords
                      +

                      set() -> new empty set object +set(iterable) -> new set object

                      +

                      Build an unordered collection of unique elements.

                      +
                      + +
                      +
                      +cassandra.metadata.cql_keywords_unreserved
                      +

                      set() -> new empty set object +set(iterable) -> new set object

                      +

                      Build an unordered collection of unique elements.

                      +
                      + +
                      +
                      +cassandra.metadata.cql_keywords_reserved
                      +

                      set() -> new empty set object +set(iterable) -> new set object

                      +

                      Build an unordered collection of unique elements.

                      +
                      + +
                      +
                      +class cassandra.metadata.Metadata
                      +

                      Holds a representation of the cluster schema and topology.

                      +
                      +
                      +add_or_return_host(host)
                      +

                      Returns a tuple (host, new), where host is a Host +instance, and new is a bool indicating whether +the host was newly added.

                      +
                      + +
                      +
                      +all_hosts()
                      +

                      Returns a list of all known Host instances in the cluster.

                      +
                      + +
                      +
                      +export_schema_as_string()
                      +

                      Returns a string that can be executed as a query in order to recreate +the entire schema. The string is formatted to be human readable.

                      +
                      + +
                      +
                      +get_host(endpoint_or_address, port=None)
                      +

                      Find a host in the metadata for a specific endpoint. If a string inet address and port are passed, +iterate all hosts to match the broadcast_rpc_address and +broadcast_rpc_port attributes.

                      +
                      + +
                      +
                      +get_host_by_host_id(host_id)
                      +

                      Same as get_host() but use host_id for lookup.

                      +
                      + +
                      +
                      +get_replicas(keyspace, key)
                      +

                      Returns a list of Host instances that are replicas for a given +partition key.

                      +
                      + +
                      + +
                      +

                      Schemas

                      +
                      +
                      +class cassandra.metadata.KeyspaceMetadata
                      +

                      A representation of the schema for a single keyspace.

                      +
                      +
                      +as_cql_query()
                      +

                      Returns a CQL query string that can be used to recreate just this keyspace, +not including user-defined types and tables.

                      +
                      + +
                      +
                      +export_as_string()
                      +

                      Returns a CQL query string that can be used to recreate the entire keyspace, +including user-defined types and tables.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.UserType
                      +

                      A user defined type, as created by CREATE TYPE statements.

                      +

                      User-defined types were introduced in Cassandra 2.1.

                      +
                      +

                      New in version 2.1.0.

                      +
                      +
                      +
                      +as_cql_query(formatted=False)
                      +

                      Returns a CQL query that can be used to recreate this type. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.Function
                      +

                      A user defined function, as created by CREATE FUNCTION statements.

                      +

                      User-defined functions were introduced in Cassandra 2.2

                      +
                      +

                      New in version 2.6.0.

                      +
                      +
                      +
                      +as_cql_query(formatted=False)
                      +

                      Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.Aggregate
                      +

                      A user defined aggregate function, as created by CREATE AGGREGATE statements.

                      +

                      Aggregate functions were introduced in Cassandra 2.2

                      +
                      +

                      New in version 2.6.0.

                      +
                      +
                      +
                      +as_cql_query(formatted=False)
                      +

                      Returns a CQL query that can be used to recreate this aggregate. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.TableMetadata
                      +

                      A representation of the schema for a single table.

                      +
                      +
                      +as_cql_query(formatted=False)
                      +

                      Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

                      +
                      + +
                      +
                      +export_as_string()
                      +

                      Returns a string of CQL queries that can be used to recreate this table +along with all indexes on it. The returned string is formatted to +be human readable.

                      +
                      + +
                      +
                      +property is_cql_compatible
                      +

                      A boolean indicating if this table can be represented as CQL in export

                      +
                      + +
                      +
                      +property primary_key
                      +

                      A list of ColumnMetadata representing the components of +the primary key for this table.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.TableMetadataV3
                      +

                      For C* 3.0+. option_maps take a superset of map names, so if nothing +changes structurally, new option maps can just be appended to the list.

                      +
                      +
                      +property is_cql_compatible
                      +

                      A boolean indicating if this table can be represented as CQL in export

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.TableMetadataDSE68
                      +
                      +
                      +as_cql_query(formatted=False)
                      +

                      Returns a CQL query that can be used to recreate this table (index +creations are not included). If formatted is set to True, +extra whitespace will be added to make the query human readable.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.ColumnMetadata
                      +

                      A representation of a single column in a table.

                      +
                      + +
                      +
                      +class cassandra.metadata.IndexMetadata
                      +

                      A representation of a secondary index on a column.

                      +
                      +
                      +as_cql_query()
                      +

                      Returns a CQL query that can be used to recreate this index.

                      +
                      + +
                      +
                      +export_as_string()
                      +

                      Returns a CQL query string that can be used to recreate this index.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.MaterializedViewMetadata
                      +

                      A representation of a materialized view on a table

                      +
                      +
                      +as_cql_query(formatted=False)
                      +

                      Returns a CQL query that can be used to recreate this function. +If formatted is set to True, extra whitespace will +be added to make the query more readable.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.VertexMetadata
                      +

                      A representation of a vertex on a table

                      +
                      + +
                      +
                      +class cassandra.metadata.EdgeMetadata
                      +

                      A representation of an edge on a table

                      +
                      + +
                      +
                      +

                      Tokens and Ring Topology

                      +
                      +
                      +class cassandra.metadata.TokenMap
                      +

                      Information about the layout of the ring.

                      +
                      +
                      +get_replicas(keyspace, token)
                      +

                      Get a set of Host instances representing all of the +replica nodes for a given Token.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.Token
                      +

                      Abstract class representing a token.

                      +
                      + +
                      +
                      +class cassandra.metadata.Murmur3Token(token)
                      +

                      A token for Murmur3Partitioner.

                      +

                      token is an int or string representing the token.

                      +
                      + +
                      +
                      +class cassandra.metadata.MD5Token(token)
                      +

                      A token for RandomPartitioner.

                      +
                      + +
                      +
                      +class cassandra.metadata.BytesToken(token)
                      +

                      A token for ByteOrderedPartitioner.

                      +
                      +
                      +classmethod from_string(token_string)
                      +

                      token_string should be the string representation from the server.

                      +
                      + +
                      + +
                      +
                      +cassandra.metadata.ReplicationStrategy
                      +

                      alias of _ReplicationStrategy

                      +
                      + +
                      +
                      +class cassandra.metadata.ReplicationFactor(all_replicas, transient_replicas=None)
                      +

                      Represent the replication factor of a keyspace.

                      +
                      + +
                      +
                      +class cassandra.metadata.SimpleStrategy(options_map)
                      +
                      +
                      +export_for_schema()
                      +

                      Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                      +
                      + +
                      +
                      +property replication_factor
                      +

                      The replication factor for this keyspace.

                      +

                      For backward compatibility, this returns the +cassandra.metadata.ReplicationFactor.full_replicas value of +cassandra.metadata.SimpleStrategy.replication_factor_info.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.NetworkTopologyStrategy(dc_replication_factors)
                      +
                      +
                      +export_for_schema()
                      +

                      Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                      +
                      + +
                      + +
                      +
                      +class cassandra.metadata.LocalStrategy(options_map)
                      +
                      +
                      +export_for_schema()
                      +

                      Returns a string version of these replication options which are +suitable for use in a CREATE KEYSPACE statement.

                      +
                      + +
                      + +
                      +
                      +cassandra.metadata.group_keys_by_replica(session, keyspace, table, keys)
                      +

                      Returns a dict with the keys grouped per host. This can be +used to more accurately group by IN clause or to batch the keys per host.

                      +

                      If a valid replica is not found for a particular key it will be grouped under +NO_VALID_REPLICA

                      +

                      Example usage:

                      +
                      >>> result = group_keys_by_replica(
                      +...     session, "system", "peers",
                      +...     (("127.0.0.1", ), ("127.0.0.2", )))
                      +
                      +
                      +
                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/metrics.html b/stable/api/cassandra/metrics.html new file mode 100644 index 0000000000..7521182f64 --- /dev/null +++ b/stable/api/cassandra/metrics.html @@ -0,0 +1,757 @@ + + + + + + + + + + + + + cassandra.metrics - Performance Metrics | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.metrics - Performance Metrics

                      +
                      +
                      +class cassandra.metrics.Metrics
                      +

                      A collection of timers and counters for various performance metrics.

                      +

                      Timer metrics are represented as floating point seconds.

                      +
                      +
                      +request_timer = None
                      +

                      A greplin.scales.PmfStat timer for requests. This is a dict-like +object with the following keys:

                      +
                        +
                      • count - number of requests that have been timed

                      • +
                      • min - min latency

                      • +
                      • max - max latency

                      • +
                      • mean - mean latency

                      • +
                      • stddev - standard deviation for latencies

                      • +
                      • median - median latency

                      • +
                      • 75percentile - 75th percentile latencies

                      • +
                      • 95percentile - 95th percentile latencies

                      • +
                      • 98percentile - 98th percentile latencies

                      • +
                      • 99percentile - 99th percentile latencies

                      • +
                      • 999percentile - 99.9th percentile latencies

                      • +
                      +
                      + +
                      +
                      +connection_errors = None
                      +

                      A greplin.scales.IntStat count of the number of times that a +request to a Cassandra node has failed due to a connection problem.

                      +
                      + +
                      +
                      +write_timeouts = None
                      +

                      A greplin.scales.IntStat count of write requests that resulted +in a timeout.

                      +
                      + +
                      +
                      +read_timeouts = None
                      +

                      A greplin.scales.IntStat count of read requests that resulted +in a timeout.

                      +
                      + +
                      +
                      +unavailables = None
                      +

                      A greplin.scales.IntStat count of write or read requests that +failed due to an insufficient number of replicas being alive to meet +the requested ConsistencyLevel.

                      +
                      + +
                      +
                      +other_errors = None
                      +

                      A greplin.scales.IntStat count of all other request failures, +including failures caused by invalid requests, bootstrapping nodes, +overloaded nodes, etc.

                      +
                      + +
                      +
                      +retries = None
                      +

                      A greplin.scales.IntStat count of the number of times a +request was retried based on the RetryPolicy decision.

                      +
                      + +
                      +
                      +ignores = None
                      +

                      A greplin.scales.IntStat count of the number of times a +failed request was ignored based on the RetryPolicy decision.

                      +
                      + +
                      +
                      +known_hosts = None
                      +

                      A greplin.scales.IntStat count of the number of nodes in +the cluster that the driver is aware of, regardless of whether any +connections are opened to those nodes.

                      +
                      + +
                      +
                      +connected_to = None
                      +

                      A greplin.scales.IntStat count of the number of nodes that +the driver currently has at least one connection open to.

                      +
                      + +
                      +
                      +open_connections = None
                      +

                      A greplin.scales.IntStat count of the number connections +the driver currently has open.

                      +
                      + +
                      +
                      +get_stats()
                      +

                      Returns the metrics for the registered cluster instance.

                      +
                      + +
                      +
                      +set_stats_name(stats_name)
                      +

                      Set the metrics stats name. +The stats_name is a string used to access the metris through scales: scales.getStats()[<stats_name>] +Default is ‘cassandra-<num>’.

                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/policies.html b/stable/api/cassandra/policies.html new file mode 100644 index 0000000000..5a913e2a0b --- /dev/null +++ b/stable/api/cassandra/policies.html @@ -0,0 +1,1871 @@ + + + + + + + + + + + + + cassandra.policies - Load balancing and Failure Handling Policies | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.policies - Load balancing and Failure Handling Policies

                      +
                      +

                      Load Balancing

                      +
                      +
                      +class cassandra.policies.HostDistance
                      +

                      A measure of how “distant” a node is from the client, which +may influence how the load balancer distributes requests +and how many connections are opened to the node.

                      +
                      +
                      +IGNORED = -1
                      +

                      A node with this distance should never be queried or have +connections opened to it.

                      +
                      + +
                      +
                      +LOCAL = 0
                      +

                      Nodes with LOCAL distance will be preferred for operations +under some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a greater number of connections opened against +them by default.

                      +

                      This distance is typically used for nodes within the same +datacenter as the client.

                      +
                      + +
                      +
                      +REMOTE = 1
                      +

                      Nodes with REMOTE distance will be treated as a last resort +by some load balancing policies (such as DCAwareRoundRobinPolicy) +and will have a smaller number of connections opened against +them by default.

                      +

                      This distance is typically used for nodes outside of the +datacenter that the client is running in.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.LoadBalancingPolicy
                      +

                      Load balancing policies are used to decide how to distribute +requests among all possible coordinator nodes in the cluster.

                      +

                      In particular, they may focus on querying “near” nodes (those +in a local datacenter) or on querying nodes who happen to +be replicas for the requested data.

                      +

                      You may also use subclasses of LoadBalancingPolicy for +custom behavior.

                      +
                      +
                      +distance(host)
                      +

                      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                      +
                      + +
                      +
                      +populate(cluster, hosts)
                      +

                      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                      +
                      + +
                      +
                      +make_query_plan(working_keyspace=None, query=None)
                      +

                      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                      +

                      Note that the query argument may be None when preparing +statements.

                      +

                      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                      +
                      + +
                      +
                      +check_supported()
                      +

                      This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.RoundRobinPolicy
                      +

                      A subclass of LoadBalancingPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in.

                      +
                      +
                      +populate(cluster, hosts)
                      +

                      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                      +
                      + +
                      +
                      +distance(host)
                      +

                      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                      +
                      + +
                      +
                      +make_query_plan(working_keyspace=None, query=None)
                      +

                      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                      +

                      Note that the query argument may be None when preparing +statements.

                      +

                      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                      +
                      + +
                      +
                      +on_up(host)
                      +

                      Called when a node is marked up.

                      +
                      + +
                      +
                      +on_down(host)
                      +

                      Called when a node is marked down.

                      +
                      + +
                      +
                      +on_add(host)
                      +

                      Called when a node is added to the cluster. The newly added node +should be considered up.

                      +
                      + +
                      +
                      +on_remove(host)
                      +

                      Called when a node is removed from the cluster.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.DCAwareRoundRobinPolicy(local_dc='', used_hosts_per_remote_dc=0)
                      +

                      Similar to RoundRobinPolicy, but prefers hosts +in the local datacenter and only uses nodes in remote +datacenters as a last resort.

                      +

                      The local_dc parameter should be the name of the datacenter +(such as is reported by nodetool ring) that should +be considered local. If not specified, the driver will choose +a local_dc based on the first host among Cluster.contact_points +having a valid DC. If relying on this mechanism, all specified +contact points should be nodes in a single, local DC.

                      +

                      used_hosts_per_remote_dc controls how many nodes in +each remote datacenter will have connections opened +against them. In other words, used_hosts_per_remote_dc hosts +will be considered REMOTE and the +rest will be considered IGNORED. +By default, all remote hosts are ignored.

                      +
                      +
                      +populate(cluster, hosts)
                      +

                      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                      +
                      + +
                      +
                      +distance(host)
                      +

                      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                      +
                      + +
                      +
                      +make_query_plan(working_keyspace=None, query=None)
                      +

                      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                      +

                      Note that the query argument may be None when preparing +statements.

                      +

                      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                      +
                      + +
                      +
                      +on_up(host)
                      +

                      Called when a node is marked up.

                      +
                      + +
                      +
                      +on_down(host)
                      +

                      Called when a node is marked down.

                      +
                      + +
                      +
                      +on_add(host)
                      +

                      Called when a node is added to the cluster. The newly added node +should be considered up.

                      +
                      + +
                      +
                      +on_remove(host)
                      +

                      Called when a node is removed from the cluster.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.WhiteListRoundRobinPolicy(hosts)
                      +

                      A subclass of RoundRobinPolicy which evenly +distributes queries across all nodes in the cluster, +regardless of what datacenter the nodes may be in, but +only if that node exists in the list of allowed nodes

                      +

                      This policy is addresses the issue described in +https://datastax-oss.atlassian.net/browse/JAVA-145 +Where connection errors occur when connection +attempts are made to private IP addresses remotely

                      +

                      The hosts parameter should be a sequence of hosts to permit +connections to.

                      +
                      +
                      +populate(cluster, hosts)
                      +

                      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                      +
                      + +
                      +
                      +distance(host)
                      +

                      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                      +
                      + +
                      +
                      +on_up(host)
                      +

                      Called when a node is marked up.

                      +
                      + +
                      +
                      +on_add(host)
                      +

                      Called when a node is added to the cluster. The newly added node +should be considered up.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.TokenAwarePolicy(child_policy, shuffle_replicas=False)
                      +

                      A LoadBalancingPolicy wrapper that adds token awareness to +a child policy.

                      +

                      This alters the child policy’s behavior so that it first attempts to +send queries to LOCAL replicas (as determined +by the child policy) based on the Statement’s +routing_key. If shuffle_replicas is +truthy, these replicas will be yielded in a random order. Once those +hosts are exhausted, the remaining hosts in the child policy’s query +plan will be used in the order provided by the child policy.

                      +

                      If no routing_key is set on the query, the child +policy’s query plan will be used as is.

                      +
                      +
                      +shuffle_replicas = False
                      +

                      Yield local replicas in a random order.

                      +
                      + +
                      +
                      +populate(cluster, hosts)
                      +

                      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                      +
                      + +
                      +
                      +check_supported()
                      +

                      This will be called after the cluster Metadata has been initialized. +If the load balancing policy implementation cannot be supported for +some reason (such as a missing C extension), this is the point at +which it should raise an exception.

                      +
                      + +
                      +
                      +distance(*args, **kwargs)
                      +

                      Returns a measure of how remote a Host is in +terms of the HostDistance enums.

                      +
                      + +
                      +
                      +make_query_plan(working_keyspace=None, query=None)
                      +

                      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                      +

                      Note that the query argument may be None when preparing +statements.

                      +

                      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                      +
                      + +
                      +
                      +on_up(*args, **kwargs)
                      +

                      Called when a node is marked up.

                      +
                      + +
                      +
                      +on_down(*args, **kwargs)
                      +

                      Called when a node is marked down.

                      +
                      + +
                      +
                      +on_add(*args, **kwargs)
                      +

                      Called when a node is added to the cluster. The newly added node +should be considered up.

                      +
                      + +
                      +
                      +on_remove(*args, **kwargs)
                      +

                      Called when a node is removed from the cluster.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.HostFilterPolicy(child_policy, predicate)
                      +

                      A LoadBalancingPolicy subclass configured with a child policy, +and a single-argument predicate. This policy defers to the child policy for +hosts where predicate(host) is truthy. Hosts for which +predicate(host) is falsey will be considered IGNORED, and will +not be used in a query plan.

                      +

                      This can be used in the cases where you need a whitelist or blacklist +policy, e.g. to prepare for decommissioning nodes or for testing:

                      +
                      def address_is_ignored(host):
                      +    return host.address in [ignored_address0, ignored_address1]
                      +
                      +blacklist_filter_policy = HostFilterPolicy(
                      +    child_policy=RoundRobinPolicy(),
                      +    predicate=address_is_ignored
                      +)
                      +
                      +cluster = Cluster(
                      +    primary_host,
                      +    load_balancing_policy=blacklist_filter_policy,
                      +)
                      +
                      +
                      +

                      See the note in the make_query_plan() documentation for a caveat on +how wrapping ordering polices (e.g. RoundRobinPolicy) may break +desirable properties of the wrapped policy.

                      +

                      Please note that whitelist and blacklist policies are not recommended for +general, day-to-day use. You probably want something like +DCAwareRoundRobinPolicy, which prefers a local DC but has +fallbacks, over a brute-force method like whitelisting or blacklisting.

                      +
                      +
                      Parameters:
                      +
                        +
                      • child_policy – an instantiated LoadBalancingPolicy +that this one will defer to.

                      • +
                      • predicate – a one-parameter function that takes a Host. +If it returns a falsey value, the Host will +be IGNORED and not returned in query plans.

                      • +
                      +
                      +
                      +
                      +
                      +predicate(host)
                      +

                      A predicate, set on object initialization, that takes a Host +and returns a value. If the value is falsy, the Host is +IGNORED. If the value is truthy, +HostFilterPolicy defers to the child policy to determine the +host’s distance.

                      +

                      This is a read-only value set in __init__, implemented as a +property.

                      +
                      + +
                      +
                      +distance(host)
                      +

                      Checks if predicate(host), then returns +IGNORED if falsey, and defers to the child policy +otherwise.

                      +
                      + +
                      +
                      +make_query_plan(working_keyspace=None, query=None)
                      +

                      Defers to the child policy’s +LoadBalancingPolicy.make_query_plan() and filters the results.

                      +

                      Note that this filtering may break desirable properties of the wrapped +policy in some cases. For instance, imagine if you configure this +policy to filter out host2, and to wrap a round-robin policy that +rotates through three hosts in the order host1, host2, host3, +host2, host3, host1, host3, host1, host2, repeating. This +policy will yield host1, host3, host3, host1, host3, host1, +disproportionately favoring host3.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.DefaultLoadBalancingPolicy(child_policy)
                      +

                      A LoadBalancingPolicy wrapper that adds the ability to target a specific host first.

                      +

                      If no host is set on the query, the child policy’s query plan will be used as is.

                      +
                      +
                      +populate(cluster, hosts)
                      +

                      This method is called to initialize the load balancing +policy with a set of Host instances before its +first use. The cluster parameter is an instance of +Cluster.

                      +
                      + +
                      +
                      +make_query_plan(working_keyspace=None, query=None)
                      +

                      Given a Statement instance, return a iterable +of Host instances which should be queried in that +order. A generator may work well for custom implementations +of this method.

                      +

                      Note that the query argument may be None when preparing +statements.

                      +

                      working_keyspace should be the string name of the current keyspace, +as set through Session.set_keyspace() or with a USE +statement.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.DSELoadBalancingPolicy(*args, **kwargs)
                      +

                      Deprecated: This will be removed in the next major release, +consider using DefaultLoadBalancingPolicy.

                      +
                      + +
                      +
                      +

                      Translating Server Node Addresses

                      +
                      +
                      +class cassandra.policies.AddressTranslator
                      +

                      Interface for translating cluster-defined endpoints.

                      +

                      The driver discovers nodes using server metadata and topology change events. Normally, +the endpoint defined by the server is the right way to connect to a node. In some environments, +these addresses may not be reachable, or not preferred (public vs. private IPs in cloud environments, +suboptimal routing, etc). This interface allows for translating from server defined endpoints to +preferred addresses for driver connections.

                      +

                      Note: contact_points provided while creating the Cluster instance are not +translated using this mechanism – only addresses received from Cassandra nodes are.

                      +
                      +
                      +translate(addr)
                      +

                      Accepts the node ip address, and returns a translated address to be used connecting to this node.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.IdentityTranslator
                      +

                      Returns the endpoint with no translation

                      +
                      +
                      +translate(addr)
                      +

                      Accepts the node ip address, and returns a translated address to be used connecting to this node.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.EC2MultiRegionTranslator
                      +

                      Resolves private ips of the hosts in the same datacenter as the client, and public ips of hosts in other datacenters.

                      +
                      +
                      +translate(addr)
                      +

                      Reverse DNS the public broadcast_address, then lookup that hostname to get the AWS-resolved IP, which +will point to the private IP address within the same datacenter.

                      +
                      + +
                      + +
                      +
                      +

                      Marking Hosts Up or Down

                      +
                      +
                      +class cassandra.policies.ConvictionPolicy(host)
                      +

                      A policy which decides when hosts should be considered down +based on the types of failures and the number of failures.

                      +

                      If custom behavior is needed, this class may be subclassed.

                      +

                      host is an instance of Host.

                      +
                      +
                      +add_failure(connection_exc)
                      +

                      Implementations should return True if the host should be +convicted, False otherwise.

                      +
                      + +
                      +
                      +reset()
                      +

                      Implementations should clear out any convictions or state regarding +the host.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.SimpleConvictionPolicy(host)
                      +

                      The default implementation of ConvictionPolicy, +which simply marks a host as down after the first failure +of any kind.

                      +

                      host is an instance of Host.

                      +
                      +
                      +add_failure(connection_exc)
                      +

                      Implementations should return True if the host should be +convicted, False otherwise.

                      +
                      + +
                      +
                      +reset()
                      +

                      Implementations should clear out any convictions or state regarding +the host.

                      +
                      + +
                      + +
                      +
                      +

                      Reconnecting to Dead Hosts

                      +
                      +
                      +class cassandra.policies.ReconnectionPolicy
                      +

                      This class and its subclasses govern how frequently an attempt is made +to reconnect to nodes that are marked as dead.

                      +

                      If custom behavior is needed, this class may be subclassed.

                      +
                      +
                      +new_schedule()
                      +

                      This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.ConstantReconnectionPolicy(delay, max_attempts=64)
                      +

                      A ReconnectionPolicy subclass which sleeps for a fixed delay +inbetween each reconnection attempt.

                      +

                      delay should be a floating point number of seconds to wait inbetween +each attempt.

                      +

                      max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

                      +
                      +
                      +new_schedule()
                      +

                      This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.ExponentialReconnectionPolicy(base_delay, max_delay, max_attempts=64)
                      +

                      A ReconnectionPolicy subclass which exponentially increases +the length of the delay inbetween each reconnection attempt up to +a set maximum delay.

                      +

                      A random amount of jitter (+/- 15%) will be added to the pure exponential +delay value to avoid the situations where many reconnection handlers are +trying to reconnect at exactly the same time.

                      +

                      base_delay and max_delay should be in floating point units of +seconds.

                      +

                      max_attempts should be a total number of attempts to be made before +giving up, or None to continue reconnection attempts forever. +The default is 64.

                      +
                      +
                      +new_schedule()
                      +

                      This should return a finite or infinite iterable of delays (each as a +floating point number of seconds) inbetween each failed reconnection +attempt. Note that if the iterable is finite, reconnection attempts +will cease once the iterable is exhausted.

                      +
                      + +
                      + +
                      +
                      +

                      Retrying Failed Operations

                      +
                      +
                      +class cassandra.policies.WriteType
                      +

                      For usage with RetryPolicy, this describe a type +of write operation.

                      +
                      +
                      +SIMPLE = 0
                      +

                      A write to a single partition key. Such writes are guaranteed to be atomic +and isolated.

                      +
                      + +
                      +
                      +BATCH = 1
                      +

                      A write to multiple partition keys that used the distributed batch log to +ensure atomicity.

                      +
                      + +
                      +
                      +UNLOGGED_BATCH = 2
                      +

                      A write to multiple partition keys that did not use the distributed batch +log. Atomicity for such writes is not guaranteed.

                      +
                      + +
                      +
                      +COUNTER = 3
                      +

                      A counter write (for one or multiple partition keys). Such writes should +not be replayed in order to avoid overcount.

                      +
                      + +
                      +
                      +BATCH_LOG = 4
                      +

                      The initial write to the distributed batch log that Cassandra performs +internally before a BATCH write.

                      +
                      + +
                      +
                      +CAS = 5
                      +

                      A lighweight-transaction write, such as “DELETE … IF EXISTS”.

                      +
                      + +
                      +
                      +VIEW = 6
                      +

                      This WriteType is only seen in results for requests that were unable to +complete MV operations.

                      +
                      + +
                      +
                      +CDC = 7
                      +

                      This WriteType is only seen in results for requests that were unable to +complete CDC operations.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.RetryPolicy
                      +

                      A policy that describes whether to retry, rethrow, or ignore coordinator +timeout and unavailable failures. These are failures reported from the +server side. Timeouts are configured by +settings in cassandra.yaml. +Unavailable failures occur when the coordinator cannot acheive the consistency +level for a request. For further information see the method descriptions +below.

                      +

                      To specify a default retry policy, set the +Cluster.default_retry_policy attribute to an instance of this +class or one of its subclasses.

                      +

                      To specify a retry policy per query, set the Statement.retry_policy +attribute to an instance of this class or one of its subclasses.

                      +

                      If custom behavior is needed for retrying certain operations, +this class may be subclassed.

                      +
                      +
                      +RETRY = 0
                      +

                      This should be returned from the below methods if the operation +should be retried on the same connection.

                      +
                      + +
                      +
                      +RETHROW = 1
                      +

                      This should be returned from the below methods if the failure +should be propagated and no more retries attempted.

                      +
                      + +
                      +
                      +IGNORE = 2
                      +

                      This should be returned from the below methods if the failure +should be ignored but no more retries should be attempted.

                      +
                      + +
                      +
                      +RETRY_NEXT_HOST = 3
                      +

                      This should be returned from the below methods if the operation +should be retried on another connection.

                      +
                      + +
                      +
                      +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
                      +

                      This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                      +
                      + +
                      +
                      +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
                      +

                      This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      write_type is one of the WriteType enums describing the +type of write operation.

                      +

                      The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                      +
                      + +
                      +
                      +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
                      +

                      This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                      +

                      query is the Statement that failed.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                      +
                      + +
                      +
                      +on_request_error(query, consistency, error, retry_num)
                      +

                      This is called when an unexpected error happens. This can be in the +following situations:

                      +
                        +
                      • On a connection error

                      • +
                      • On server errors: overloaded, isBootstrapping, serverError, etc.

                      • +
                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      error the instance of the exception.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      The default, it triggers a retry on the next host in the query plan +with the same consistency level.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.FallthroughRetryPolicy
                      +

                      A retry policy that never retries and always propagates failures to +the application.

                      +
                      +
                      +on_read_timeout(*args, **kwargs)
                      +

                      This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                      +
                      + +
                      +
                      +on_write_timeout(*args, **kwargs)
                      +

                      This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      write_type is one of the WriteType enums describing the +type of write operation.

                      +

                      The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                      +
                      + +
                      +
                      +on_unavailable(*args, **kwargs)
                      +

                      This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                      +

                      query is the Statement that failed.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                      +
                      + +
                      +
                      +on_request_error(*args, **kwargs)
                      +

                      This is called when an unexpected error happens. This can be in the +following situations:

                      +
                        +
                      • On a connection error

                      • +
                      • On server errors: overloaded, isBootstrapping, serverError, etc.

                      • +
                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      error the instance of the exception.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      The default, it triggers a retry on the next host in the query plan +with the same consistency level.

                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.DowngradingConsistencyRetryPolicy(*args, **kwargs)
                      +

                      Deprecated: This retry policy will be removed in the next major release.

                      +

                      A retry policy that sometimes retries with a lower consistency level than +the one initially requested.

                      +

                      BEWARE: This policy may retry queries using a lower consistency +level than the one initially requested. By doing so, it may break +consistency guarantees. In other words, if you use this retry policy, +there are cases (documented below) where a read at QUORUM +may not see a preceding write at QUORUM. Do not use this +policy unless you have understood the cases where this can happen and +are ok with that. It is also recommended to subclass this class so +that queries that required a consistency level downgrade can be +recorded (so that repairs can be made later, etc).

                      +

                      This policy implements the same retries as RetryPolicy, +but on top of that, it also retries in the following cases:

                      +
                        +
                      • On a read timeout: if the number of replicas that responded is +greater than one but lower than is required by the requested +consistency level, the operation is retried at a lower consistency +level.

                      • +
                      • On a write timeout: if the operation is an UNLOGGED_BATCH +and at least one replica acknowledged the write, the operation is +retried at a lower consistency level. Furthermore, for other +write types, if at least one replica acknowledged the write, the +timeout is ignored.

                      • +
                      • On an unavailable exception: if at least one replica is alive, the +operation is retried at a lower consistency level.

                      • +
                      +

                      The reasoning behind this retry policy is as follows: if, based +on the information the Cassandra coordinator node returns, retrying the +operation with the initially requested consistency has a chance to +succeed, do it. Otherwise, if based on that information we know the +initially requested consistency level cannot be achieved currently, then:

                      +
                        +
                      • For writes, ignore the exception (thus silently failing the +consistency requirement) if we know the write has been persisted on at +least one replica.

                      • +
                      • For reads, try reading at a lower consistency level (thus silently +failing the consistency requirement).

                      • +
                      +

                      In other words, this policy implements the idea that if the requested +consistency level cannot be achieved, the next best thing for writes is +to make sure the data is persisted, and that reading something is better +than reading nothing, even if there is a risk of reading stale data.

                      +
                      +
                      +on_read_timeout(query, consistency, required_responses, received_responses, data_retrieved, retry_num)
                      +

                      This is called when a read operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time). +It should return a tuple with two items: one of the class enums (such +as RETRY) and a ConsistencyLevel to retry the +operation at or None to keep the same consistency level.

                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      The required_responses and received_responses parameters describe +how many replicas needed to respond to meet the requested consistency +level and how many actually did respond before the coordinator timed +out the request. data_retrieved is a boolean indicating whether +any of those responses contained data (as opposed to just a digest).

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, operations will be retried at most once, and only if +a sufficient number of replicas responded (with data digests).

                      +
                      + +
                      +
                      +on_write_timeout(query, consistency, write_type, required_responses, received_responses, retry_num)
                      +

                      This is called when a write operation times out from the coordinator’s +perspective (i.e. a replica did not respond to the coordinator in time).

                      +

                      query is the Statement that timed out.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      write_type is one of the WriteType enums describing the +type of write operation.

                      +

                      The required_responses and received_responses parameters describe +how many replicas needed to acknowledge the write to meet the requested +consistency level and how many replicas actually did acknowledge the +write before the coordinator timed out the request.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, failed write operations will retried at most once, and +they will only be retried if the write_type was +BATCH_LOG.

                      +
                      + +
                      +
                      +on_unavailable(query, consistency, required_replicas, alive_replicas, retry_num)
                      +

                      This is called when the coordinator node determines that a read or +write operation cannot be successful because the number of live +replicas are too low to meet the requested ConsistencyLevel. +This means that the read or write operation was never forwarded to +any replicas.

                      +

                      query is the Statement that failed.

                      +

                      consistency is the ConsistencyLevel that the operation was +attempted at.

                      +

                      required_replicas is the number of replicas that would have needed to +acknowledge the operation to meet the requested consistency level. +alive_replicas is the number of replicas that the coordinator +considered alive at the time of the request.

                      +

                      retry_num counts how many times the operation has been retried, so +the first time this method is called, retry_num will be 0.

                      +

                      By default, if this is the first retry, it triggers a retry on the next +host in the query plan with the same consistency level. If this is not the +first retry, no retries will be attempted and the error will be re-raised.

                      +
                      + +
                      + +
                      +
                      +

                      Retrying Idempotent Operations

                      +
                      +
                      +class cassandra.policies.SpeculativeExecutionPolicy
                      +

                      Interface for specifying speculative execution plans

                      +
                      +
                      +new_plan(keyspace, statement)
                      +

                      Returns

                      +
                      +
                      Parameters:
                      +
                        +
                      • keyspace

                      • +
                      • statement

                      • +
                      +
                      +
                      Returns:
                      +

                      +
                      +
                      +
                      + +
                      + +
                      +
                      +class cassandra.policies.ConstantSpeculativeExecutionPolicy(delay, max_attempts)
                      +

                      A speculative execution policy that sends a new query every X seconds (delay) for a maximum of Y attempts (max_attempts).

                      +
                      +
                      +new_plan(keyspace, statement)
                      +

                      Returns

                      +
                      +
                      Parameters:
                      +
                        +
                      • keyspace

                      • +
                      • statement

                      • +
                      +
                      +
                      Returns:
                      +

                      +
                      +
                      +
                      + +
                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/pool.html b/stable/api/cassandra/pool.html new file mode 100644 index 0000000000..fd3b66cf67 --- /dev/null +++ b/stable/api/cassandra/pool.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + cassandra.pool - Hosts and Connection Pools | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.pool - Hosts and Connection Pools

                      +

                      Connection pooling and host management.

                      +
                      +
                      +class cassandra.pool.Host
                      +

                      Represents a single Cassandra node.

                      +
                      +
                      +property address
                      +

                      The IP address of the endpoint. This is the RPC address the driver uses when connecting to the node.

                      +
                      + +
                      +
                      +property datacenter
                      +

                      The datacenter the node is in.

                      +
                      + +
                      +
                      +property rack
                      +

                      The rack the node is in.

                      +
                      + +
                      + +
                      +
                      +exception cassandra.pool.NoConnectionsAvailable
                      +

                      All existing connections to a given host are busy, or there are +no open connections.

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/protocol.html b/stable/api/cassandra/protocol.html new file mode 100644 index 0000000000..76f0de60c1 --- /dev/null +++ b/stable/api/cassandra/protocol.html @@ -0,0 +1,723 @@ + + + + + + + + + + + + + cassandra.protocol - Protocol Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.protocol - Protocol Features

                      +
                      +

                      Custom Payloads

                      +

                      Native protocol version 4+ allows for a custom payload to be sent between clients +and custom query handlers. The payload is specified as a string:binary_type dict +holding custom key/value pairs.

                      +

                      By default these are ignored by the server. They can be useful for servers implementing +a custom QueryHandler.

                      +

                      See Session.execute(), :Session.execute_async(), ResponseFuture.custom_payload.

                      +
                      +
                      +class cassandra.protocol._ProtocolHandler
                      +

                      _ProtocolHander handles encoding and decoding messages.

                      +

                      This class can be specialized to compose Handlers which implement alternative +result decoding or type deserialization. Class definitions are passed to cassandra.cluster.Cluster +on initialization.

                      +

                      Contracted class methods are _ProtocolHandler.encode_message() and _ProtocolHandler.decode_message().

                      +
                      +
                      +message_types_by_opcode = {default mapping}
                      +
                      + +
                      +
                      +classmethod encode_message(msg, stream_id, protocol_version, compressor, allow_beta_protocol_version)
                      +

                      Encodes a message using the specified frame parameters, and compressor

                      +
                      +
                      Parameters:
                      +
                        +
                      • msg – the message, typically of cassandra.protocol._MessageType, generated by the driver

                      • +
                      • stream_id – protocol stream id for the frame header

                      • +
                      • protocol_version – version for the frame header, and used encoding contents

                      • +
                      • compressor – optional compression function to be used on the body

                      • +
                      +
                      +
                      +
                      + +
                      +
                      +classmethod decode_message(protocol_version, protocol_features, user_type_map, stream_id, flags, opcode, body, decompressor, result_metadata)
                      +

                      Decodes a native protocol message body

                      +
                      +
                      Parameters:
                      +
                        +
                      • protocol_version – version to use decoding contents

                      • +
                      • user_type_map – map[keyspace name] = map[type name] = custom type to instantiate when deserializing this type

                      • +
                      • stream_id – native protocol stream id from the frame header

                      • +
                      • flags – native protocol flags bitmap from the header

                      • +
                      • opcode – native protocol opcode from the header

                      • +
                      • body – frame body

                      • +
                      • decompressor – optional decompression function to inflate the body

                      • +
                      +
                      +
                      Returns:
                      +

                      a message decoded from the body and frame attributes

                      +
                      +
                      +
                      + +
                      + +
                      +
                      +

                      Faster Deserialization

                      +

                      When python-driver is compiled with Cython, it uses a Cython-based deserialization path +to deserialize messages. By default, the driver will use a Cython-based parser that returns +lists of rows similar to the pure-Python version. In addition, there are two additional +ProtocolHandler classes that can be used to deserialize response messages: LazyProtocolHandler +and NumpyProtocolHandler. They can be used as follows:

                      +
                      from cassandra.protocol import NumpyProtocolHandler, LazyProtocolHandler
                      +from cassandra.query import tuple_factory
                      +s.client_protocol_handler = LazyProtocolHandler   # for a result iterator
                      +s.row_factory = tuple_factory  #required for Numpy results
                      +s.client_protocol_handler = NumpyProtocolHandler  # for a dict of NumPy arrays as result
                      +
                      +
                      +

                      These protocol handlers comprise different parsers, and return results as described below:

                      +
                        +
                      • ProtocolHandler: this default implementation is a drop-in replacement for the pure-Python version. +The rows are all parsed upfront, before results are returned.

                      • +
                      • LazyProtocolHandler: near drop-in replacement for the above, except that it returns an iterator over rows, +lazily decoded into the default row format (this is more efficient since all decoded results are not materialized at once)

                      • +
                      • NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with +analysis toolkits such as Pandas.

                      • +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/query.html b/stable/api/cassandra/query.html new file mode 100644 index 0000000000..b373c849f9 --- /dev/null +++ b/stable/api/cassandra/query.html @@ -0,0 +1,1030 @@ + + + + + + + + + + + + + cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories

                      +
                      +
                      +cassandra.query.tuple_factory(colnames, rows)
                      +

                      Returns each row as a tuple

                      +

                      Example:

                      +
                      >>> from cassandra.query import tuple_factory
                      +>>> session = cluster.connect('mykeyspace')
                      +>>> session.row_factory = tuple_factory
                      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                      +>>> print rows[0]
                      +('Bob', 42)
                      +
                      +
                      +
                      +

                      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                      +
                      +
                      + +
                      +
                      +cassandra.query.named_tuple_factory(colnames, rows)
                      +

                      Returns each row as a namedtuple. +This is the default row factory.

                      +

                      Example:

                      +
                      >>> from cassandra.query import named_tuple_factory
                      +>>> session = cluster.connect('mykeyspace')
                      +>>> session.row_factory = named_tuple_factory
                      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                      +>>> user = rows[0]
                      +
                      +>>> # you can access field by their name:
                      +>>> print "name: %s, age: %d" % (user.name, user.age)
                      +name: Bob, age: 42
                      +
                      +>>> # or you can access fields by their position (like a tuple)
                      +>>> name, age = user
                      +>>> print "name: %s, age: %d" % (name, age)
                      +name: Bob, age: 42
                      +>>> name = user[0]
                      +>>> age = user[1]
                      +>>> print "name: %s, age: %d" % (name, age)
                      +name: Bob, age: 42
                      +
                      +
                      +
                      +

                      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                      +
                      +
                      + +
                      +
                      +cassandra.query.dict_factory(colnames, rows)
                      +

                      Returns each row as a dict.

                      +

                      Example:

                      +
                      >>> from cassandra.query import dict_factory
                      +>>> session = cluster.connect('mykeyspace')
                      +>>> session.row_factory = dict_factory
                      +>>> rows = session.execute("SELECT name, age FROM users LIMIT 1")
                      +>>> print rows[0]
                      +{u'age': 42, u'name': u'Bob'}
                      +
                      +
                      +
                      +

                      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                      +
                      +
                      + +
                      +
                      +cassandra.query.ordered_dict_factory(colnames, rows)
                      +

                      Like dict_factory(), but returns each row as an OrderedDict, +so the order of the columns is preserved.

                      +
                      +

                      Changed in version 2.0.0: moved from cassandra.decoder to cassandra.query

                      +
                      +
                      + +
                      +
                      +class cassandra.query.SimpleStatement(query_string, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None, is_idempotent=False)
                      +

                      A simple, un-prepared query.

                      +

                      query_string should be a literal CQL statement with the exception +of parameter placeholders that will be filled through the +parameters argument of Session.execute().

                      +

                      See Statement attributes for a description of the other parameters.

                      +
                      + +
                      +
                      +class cassandra.query.PreparedStatement
                      +

                      A statement that has been prepared against at least one Cassandra node. +Instances of this class should not be created directly, but through +Session.prepare().

                      +

                      A PreparedStatement should be prepared only once. Re-preparing a statement +may affect performance (as the operation requires a network roundtrip).

                      +

                      A note about * in prepared statements: Do not use * in prepared statements if you might +change the schema of the table being queried. The driver and server each +maintain a map between metadata for a schema and statements that were +prepared against that schema. When a user changes a schema, e.g. by adding +or removing a column, the server invalidates its mappings involving that +schema. However, there is currently no way to propagate that invalidation +to drivers. Thus, after a schema change, the driver will incorrectly +interpret the results of SELECT * queries prepared before the schema +change. This is currently being addressed in CASSANDRA-10786.

                      +
                      +
                      +bind(values)
                      +

                      Creates and returns a BoundStatement instance using values.

                      +

                      See BoundStatement.bind() for rules on input values.

                      +
                      + +
                      + +
                      +
                      +class cassandra.query.BoundStatement(prepared_statement, retry_policy=None, consistency_level=None, routing_key=None, serial_consistency_level=None, fetch_size=<object object>, keyspace=None, custom_payload=None)
                      +

                      A prepared statement that has been bound to a particular set of values. +These may be created directly or through PreparedStatement.bind().

                      +

                      prepared_statement should be an instance of PreparedStatement.

                      +

                      See Statement attributes for a description of the other parameters.

                      +
                      +
                      +bind(values)
                      +

                      Binds a sequence of values for the prepared statement parameters +and returns this instance. Note that values must be:

                      +
                        +
                      • a sequence, even if you are only binding one value, or

                      • +
                      • a dict that relates 1-to-1 between dict keys and columns

                      • +
                      +
                      +

                      Changed in version 2.6.0: UNSET_VALUE was introduced. These can be bound as positional parameters +in a sequence, or by name in a dict. Additionally, when using protocol v4+:

                      +
                        +
                      • short sequences will be extended to match bind parameters with UNSET_VALUE

                      • +
                      • names may be omitted from a dict with UNSET_VALUE implied.

                      • +
                      +
                      +
                      +

                      Changed in version 3.0.0: method will not throw if extra keys are present in bound dict (PYTHON-178)

                      +
                      +
                      + +
                      +
                      +property routing_key
                      +

                      The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

                      +

                      If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

                      +
                      + +
                      + +
                      +
                      +class cassandra.query.Statement
                      +

                      An abstract class representing a single query. There are three subclasses: +SimpleStatement, BoundStatement, and BatchStatement. +These can be passed to Session.execute().

                      +
                      +
                      +property routing_key
                      +

                      The partition_key portion of the primary key, +which can be used to determine which nodes are replicas for the query.

                      +

                      If the partition key is a composite, a list or tuple must be passed in. +Each key component should be in its packed (binary) format, so all +components should be strings.

                      +
                      + +
                      +
                      +property serial_consistency_level
                      +

                      The serial consistency level is only used by conditional updates +(INSERT, UPDATE and DELETE with an IF condition). For +those, the serial_consistency_level defines the consistency level of +the serial phase (or “paxos” phase) while the normal +consistency_level defines the consistency for the “learn” phase, +i.e. what type of reads will be guaranteed to see the update right away. +For example, if a conditional write has a consistency_level of +QUORUM (and is successful), then a +QUORUM read is guaranteed to see that write. +But if the regular consistency_level of that write is +ANY, then only a read with a +consistency_level of SERIAL is +guaranteed to see it (even a read with consistency +ALL is not guaranteed to be enough).

                      +

                      The serial consistency can only be one of SERIAL +or LOCAL_SERIAL. While SERIAL guarantees full +linearizability (with other SERIAL updates), LOCAL_SERIAL only +guarantees it in the local data center.

                      +

                      The serial consistency level is ignored for any query that is not a +conditional update. Serial reads should use the regular +consistency_level.

                      +

                      Serial consistency levels may only be used against Cassandra 2.0+ +and the protocol_version must be set to 2 or higher.

                      +

                      See Lightweight Transactions (Compare-and-set) for a discussion on how to work with results returned from +conditional statements.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      + +
                      + +
                      +
                      +cassandra.query.UNSET_VALUE
                      +

                      The base class of the class hierarchy.

                      +

                      When called, it accepts no arguments and returns a new featureless +instance that has no instance attributes and cannot be given any.

                      +
                      + +
                      +
                      +class cassandra.query.BatchStatement(batch_type=BatchType.LOGGED, retry_policy=None, consistency_level=None)
                      +

                      A protocol-level batch of operations which are applied atomically +by default.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +

                      batch_type specifies The BatchType for the batch operation. +Defaults to BatchType.LOGGED.

                      +

                      retry_policy should be a RetryPolicy instance for +controlling retries on the operation.

                      +

                      consistency_level should be a ConsistencyLevel value +to be used for all operations in the batch.

                      +

                      custom_payload is a Custom Payloads passed to the server. +Note: as Statement objects are added to the batch, this map is +updated with any values found in their custom payloads. These are +only allowed when using protocol version 4 or higher.

                      +

                      Example usage:

                      +
                      insert_user = session.prepare("INSERT INTO users (name, age) VALUES (?, ?)")
                      +batch = BatchStatement(consistency_level=ConsistencyLevel.QUORUM)
                      +
                      +for (name, age) in users_to_insert:
                      +    batch.add(insert_user, (name, age))
                      +
                      +session.execute(batch)
                      +
                      +
                      +

                      You can also mix different types of operations within a batch:

                      +
                      batch = BatchStatement()
                      +batch.add(SimpleStatement("INSERT INTO users (name, age) VALUES (%s, %s)"), (name, age))
                      +batch.add(SimpleStatement("DELETE FROM pending_users WHERE name=%s"), (name,))
                      +session.execute(batch)
                      +
                      +
                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      +

                      Changed in version 2.1.0: Added serial_consistency_level as a parameter

                      +
                      +
                      +

                      Changed in version 2.6.0: Added custom_payload as a parameter

                      +
                      +
                      +
                      +add(statement, parameters=None)
                      +

                      Adds a Statement and optional sequence of parameters +to be used with the statement to the batch.

                      +

                      Like with other statements, parameters must be a sequence, even +if there is only one item.

                      +
                      + +
                      +
                      +add_all(statements, parameters)
                      +

                      Adds a sequence of Statement objects and a matching sequence +of parameters to the batch. Statement and parameter sequences must be of equal length or +one will be truncated. None can be used in the parameters position where are needed.

                      +
                      + +
                      +
                      +clear()
                      +

                      This is a convenience method to clear a batch statement for reuse.

                      +

                      Note: it should not be used concurrently with uncompleted execution futures executing the same +BatchStatement.

                      +
                      + +
                      +
                      +serial_consistency_level = None
                      +
                      + +
                      + +
                      +
                      +class cassandra.query.BatchType
                      +

                      A BatchType is used with BatchStatement instances to control +the atomicity of the batch operation.

                      +
                      +

                      New in version 2.0.0.

                      +
                      +
                      +
                      +LOGGED = BatchType.LOGGED
                      +
                      + +
                      +
                      +UNLOGGED = BatchType.UNLOGGED
                      +
                      + +
                      +
                      +COUNTER = BatchType.COUNTER
                      +
                      + +
                      + +
                      +
                      +class cassandra.query.ValueSequence(iterable=(), /)
                      +

                      A wrapper class that is used to specify that a sequence of values should +be treated as a CQL list of values instead of a single column collection when used +as part of the parameters argument for Session.execute().

                      +

                      This is typically needed when supplying a list of keys to select. +For example:

                      +
                      >>> my_user_ids = ('alice', 'bob', 'charles')
                      +>>> query = "SELECT * FROM users WHERE user_id IN %s"
                      +>>> session.execute(query, parameters=[ValueSequence(my_user_ids)])
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.query.QueryTrace
                      +

                      A trace of the duration and events that occurred when executing +an operation.

                      +
                      +
                      +populate(max_wait=2.0, wait_for_complete=True, query_cl=None)
                      +

                      Retrieves the actual tracing details from Cassandra and populates the +attributes of this instance. Because tracing details are stored +asynchronously by Cassandra, this may need to retry the session +detail fetch. If the trace is still not available after max_wait +seconds, TraceUnavailable will be raised; if max_wait is +None, this will retry forever.

                      +

                      wait_for_complete=False bypasses the wait for duration to be populated. +This can be used to query events from partial sessions.

                      +

                      query_cl specifies a consistency level to use for polling the trace tables, +if it should be different than the session default.

                      +
                      + +
                      + +
                      +
                      +class cassandra.query.TraceEvent
                      +

                      Representation of a single event within a query trace.

                      +
                      + +
                      +
                      +exception cassandra.query.TraceUnavailable
                      +

                      Raised when complete trace details cannot be fetched from Cassandra.

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/timestamps.html b/stable/api/cassandra/timestamps.html new file mode 100644 index 0000000000..82a359c02b --- /dev/null +++ b/stable/api/cassandra/timestamps.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + cassandra.timestamps - Timestamp Generation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.timestamps - Timestamp Generation

                      +
                      +
                      +class cassandra.timestamps.MonotonicTimestampGenerator(warn_on_drift=True, warning_threshold=0, warning_interval=0)
                      +

                      An object that, when called, returns int(time.time() * 1e6) when +possible, but, if the value returned by time.time doesn’t increase, +drifts into the future and logs warnings. +Exposed configuration attributes can be configured with arguments to +__init__ or by changing attributes on an initialized object.

                      +
                      +

                      New in version 3.8.0.

                      +
                      +
                      +
                      +warn_on_drift = True
                      +

                      If true, log warnings when timestamps drift into the future as allowed by +warning_threshold and warning_interval.

                      +
                      + +
                      +
                      +warning_threshold = 1
                      +

                      This object will only issue warnings when the returned timestamp drifts +more than warning_threshold seconds into the future. +Defaults to 1 second.

                      +
                      + +
                      +
                      +warning_interval = 1
                      +

                      This object will only issue warnings every warning_interval seconds. +Defaults to 1 second.

                      +
                      + +
                      +
                      +_next_timestamp(now, last)
                      +

                      Returns the timestamp that should be used if now is the current +time and last is the last timestamp returned by this object. +Intended for internal and testing use only; to generate timestamps, +call an instantiated MonotonicTimestampGenerator object.

                      +
                      +
                      Parameters:
                      +
                        +
                      • now (int) – an integer to be used as the current time, typically +representing the current time in microseconds since the UNIX epoch

                      • +
                      • last (int) – an integer representing the last timestamp returned by +this object

                      • +
                      +
                      +
                      +
                      + +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/cassandra/util.html b/stable/api/cassandra/util.html new file mode 100644 index 0000000000..ac76c55085 --- /dev/null +++ b/stable/api/cassandra/util.html @@ -0,0 +1,1073 @@ + + + + + + + + + + + + + cassandra.util - Utilities | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      cassandra.util - Utilities

                      +
                      +
                      +class cassandra.util.Date(value)
                      +

                      Idealized date: year, month, day

                      +

                      Offers wider year range than datetime.date. For Dates that cannot be represented +as a datetime.date (because datetime.MINYEAR, datetime.MAXYEAR), this type falls back +to printing days_from_epoch offset.

                      +

                      Initializer value can be:

                      +
                        +
                      • integer_type: absolute days from epoch (1970, 1, 1). Can be negative.

                      • +
                      • datetime.date: built-in date

                      • +
                      • string_type: a string time of the form “yyyy-mm-dd”

                      • +
                      +
                      +
                      +date()
                      +

                      Return a built-in datetime.date for Dates falling in the years [datetime.MINYEAR, datetime.MAXYEAR]

                      +

                      ValueError is raised for Dates outside this range.

                      +
                      + +
                      +
                      +property seconds
                      +

                      Absolute seconds from epoch (can be negative)

                      +
                      + +
                      + +
                      +
                      +class cassandra.util.DateRange(lower_bound=None, upper_bound=None, value=None)
                      +

                      DSE DateRange Type

                      +
                      +
                      +lower_bound
                      +

                      DateRangeBound representing the lower bound of a bounded range.

                      +
                      + +
                      +
                      +upper_bound
                      +

                      DateRangeBound representing the upper bound of a bounded range.

                      +
                      + +
                      +
                      +value
                      +

                      DateRangeBound representing the value of a single-value range.

                      +
                      + +

                      As noted in its documentation, DateRangeBound uses a millisecond +offset from the UNIX epoch to allow DateRange to represent values +datetime.datetime cannot. For such values, string representions will show +this offset rather than the CQL representation.

                      +
                      +
                      Parameters:
                      +
                      +
                      +
                      +
                      + +
                      +
                      +class cassandra.util.DateRangeBound(value, precision)
                      +

                      Represents a single date value and its precision for DateRange.

                      +
                      +
                      +milliseconds
                      +

                      Integer representing milliseconds since the UNIX epoch. May be negative.

                      +
                      + +
                      +
                      +precision
                      +

                      String representing the precision of a bound. Must be a valid +DateRangePrecision member.

                      +
                      + +

                      DateRangeBound uses a millisecond offset from the UNIX epoch to +allow DateRange to represent values datetime.datetime cannot. +For such values, string representions will show this offset rather than the +CQL representation.

                      +
                      +
                      Parameters:
                      +
                        +
                      • value – a value representing ms since the epoch. Accepts an +integer or a datetime.

                      • +
                      • precision – a string representing precision

                      • +
                      +
                      +
                      +
                      +
                      +datetime()
                      +

                      Return milliseconds as a datetime.datetime if possible. +Raises an OverflowError if the value is out of range.

                      +
                      + +
                      +
                      +classmethod from_value(value)
                      +

                      Construct a new DateRangeBound from a given value. If +possible, use the value[‘milliseconds’] and value[‘precision’] keys +of the argument. Otherwise, use the argument as a (milliseconds, +precision) iterable.

                      +
                      +
                      Parameters:
                      +

                      value – a dictlike or iterable object

                      +
                      +
                      +
                      + +
                      + +
                      +
                      +class cassandra.util.DateRangePrecision
                      +

                      An “enum” representing the valid values for DateRange.precision.

                      +
                      + +
                      +
                      +class cassandra.util.Distance(x=nan, y=nan, radius=nan)
                      +

                      Represents a Distance geometry for DSE

                      +
                      +
                      +static from_wkt(s)
                      +

                      Parse a Distance geometry from a wkt string and return a new Distance object.

                      +
                      + +
                      + +
                      +
                      +class cassandra.util.Duration(months=0, days=0, nanoseconds=0)
                      +

                      Cassandra Duration Type

                      +
                      + +
                      +
                      +class cassandra.util.LineString(coords=())
                      +

                      Represents a linestring geometry for DSE

                      +

                      ‘coords`: a sequence of (x, y) coordinates of points in the linestring

                      +
                      +
                      +static from_wkt(s)
                      +

                      Parse a LineString geometry from a wkt string and return a new LineString object.

                      +
                      + +
                      + +
                      +
                      +class cassandra.util.OrderedMap(*args, **kwargs)
                      +

                      An ordered map that accepts non-hashable types for keys. It also maintains the +insertion order of items, behaving as OrderedDict in that regard. These maps +are constructed and read just as normal mapping types, except that they may +contain arbitrary collections and other non-hashable items as keys:

                      +
                      >>> od = OrderedMap([({'one': 1, 'two': 2}, 'value'),
                      +...                  ({'three': 3, 'four': 4}, 'value2')])
                      +>>> list(od.keys())
                      +[{'two': 2, 'one': 1}, {'three': 3, 'four': 4}]
                      +>>> list(od.values())
                      +['value', 'value2']
                      +
                      +
                      +

                      These constructs are needed to support nested collections in Cassandra 2.1.3+, +where frozen collections can be specified as parameters to others:

                      +
                      CREATE TABLE example (
                      +    ...
                      +    value map<frozen<map<int, int>>, double>
                      +    ...
                      +)
                      +
                      +
                      +

                      This class derives from the (immutable) Mapping API. Objects in these maps +are not intended be modified.

                      +
                      + +
                      +
                      +class cassandra.util.OrderedMapSerializedKey(cass_type, protocol_version)
                      +
                      + +
                      +
                      +class cassandra.util.Point(x=nan, y=nan)
                      +

                      Represents a point geometry for DSE

                      +
                      +
                      +static from_wkt(s)
                      +

                      Parse a Point geometry from a wkt string and return a new Point object.

                      +
                      + +
                      + +
                      +
                      +class cassandra.util.Polygon(exterior=(), interiors=None)
                      +

                      Represents a polygon geometry for DSE

                      +

                      ‘exterior`: a sequence of (x, y) coordinates of points in the linestring +interiors: None, or a sequence of sequences or (x, y) coordinates of points describing interior linear rings

                      +
                      +
                      +static from_wkt(s)
                      +

                      Parse a Polygon geometry from a wkt string and return a new Polygon object.

                      +
                      + +
                      + +
                      +
                      +class cassandra.util.SortedSet(iterable=())
                      +

                      A sorted set based on sorted list

                      +

                      A sorted set implementation is used in this case because it does not +require its elements to be immutable/hashable.

                      +

                      #Not implemented: update functions, inplace operators

                      +
                      + +
                      +
                      +class cassandra.util.Time(value)
                      +

                      Idealized time, independent of day.

                      +

                      Up to nanosecond resolution

                      +

                      Initializer value can be:

                      +
                        +
                      • integer_type: absolute nanoseconds in the day

                      • +
                      • datetime.time: built-in time

                      • +
                      • string_type: a string time of the form “HH:MM:SS[.mmmuuunnn]”

                      • +
                      +
                      +
                      +property hour
                      +

                      The hour component of this time (0-23)

                      +
                      + +
                      +
                      +property minute
                      +

                      The minute component of this time (0-59)

                      +
                      + +
                      +
                      +property nanosecond
                      +

                      The fractional seconds component of the time, in nanoseconds

                      +
                      + +
                      +
                      +property second
                      +

                      The second component of this time (0-59)

                      +
                      + +
                      +
                      +time()
                      +

                      Return a built-in datetime.time (nanosecond precision truncated to micros).

                      +
                      + +
                      + +
                      +
                      +class cassandra.util.Version(version)
                      +

                      Internal minimalist class to compare versions. +A valid version is: <int>.<int>.<int>.<int or str>.

                      +

                      TODO: when python2 support is removed, use packaging.version.

                      +
                      + +
                      +
                      +cassandra.util.datetime_from_timestamp(timestamp)
                      +

                      Creates a timezone-agnostic datetime from timestamp (in seconds) in a consistent manner. +Works around a Windows issue with large negative timestamps (PYTHON-119), +and rounding differences in Python 3.4 (PYTHON-340).

                      +
                      +
                      Parameters:
                      +

                      timestamp – a unix timestamp, in seconds

                      +
                      +
                      +
                      + +
                      +
                      +cassandra.util.datetime_from_uuid1(uuid_arg)
                      +

                      Creates a timezone-agnostic datetime from the timestamp in the +specified type-1 UUID.

                      +
                      +
                      Parameters:
                      +

                      uuid_arg – a version 1 UUID

                      +
                      +
                      +
                      + +
                      +
                      +cassandra.util.max_uuid_from_time(timestamp)
                      +

                      Generates the maximum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

                      +

                      See uuid_from_time() for argument and return types.

                      +
                      + +
                      +
                      +cassandra.util.min_uuid_from_time(timestamp)
                      +

                      Generates the minimum TimeUUID (type 1) for a given timestamp, as compared by Cassandra.

                      +

                      See uuid_from_time() for argument and return types.

                      +
                      + +
                      +
                      +cassandra.util.ms_timestamp_from_datetime(dt)
                      +

                      Converts a datetime to a timestamp expressed in milliseconds.

                      +
                      +
                      Parameters:
                      +

                      dt – a datetime.datetime

                      +
                      +
                      +
                      + +
                      +
                      +cassandra.util.sortedset
                      +

                      alias of SortedSet

                      +
                      + +
                      +
                      +cassandra.util.unix_time_from_uuid1(uuid_arg)
                      +

                      Converts a version 1 uuid.UUID to a timestamp with the same precision +as time.time() returns. This is useful for examining the +results of queries returning a v1 UUID.

                      +
                      +
                      Parameters:
                      +

                      uuid_arg – a version 1 UUID

                      +
                      +
                      +
                      + +
                      +
                      +cassandra.util.utc_datetime_from_ms_timestamp(timestamp)
                      +

                      Creates a UTC datetime from a timestamp in milliseconds. See +datetime_from_timestamp().

                      +

                      Raises an OverflowError if the timestamp is out of range for +datetime.

                      +
                      +
                      Parameters:
                      +

                      timestamp – timestamp, in milliseconds

                      +
                      +
                      +
                      + +
                      +
                      +cassandra.util.uuid_from_time(time_arg, node=None, clock_seq=None)
                      +

                      Converts a datetime or timestamp to a type 1 uuid.UUID.

                      +
                      +
                      Parameters:
                      +
                        +
                      • time_arg – The time to use for the timestamp portion of the UUID. +This can either be a datetime object or a timestamp +in seconds (as returned from time.time()).

                      • +
                      • node (long) – None integer for the UUID (up to 48 bits). If not specified, this +field is randomized.

                      • +
                      • clock_seq (int) – Clock sequence field for the UUID (up to 14 bits). If not specified, +a random sequence is generated.

                      • +
                      +
                      +
                      Return type:
                      +

                      uuid.UUID

                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/api/index.html b/stable/api/index.html new file mode 100644 index 0000000000..c121fabd4b --- /dev/null +++ b/stable/api/index.html @@ -0,0 +1,863 @@ + + + + + + + + + + + + + API Documentation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      API Documentation

                      +
                      +

                      Core Driver

                      +
                      + +
                      +
                      +
                      +

                      Object Mapper

                      + +
                      +
                      +

                      DataStax Graph

                      + +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/batches.html b/stable/cqlengine/batches.html new file mode 100644 index 0000000000..02e2b8d22b --- /dev/null +++ b/stable/cqlengine/batches.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + Batch Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + + + +
                      +

                      Batch Queries

                      +

                      cqlengine supports batch queries using the BatchQuery class. Batch queries can be started and stopped manually, or within a context manager. To add queries to the batch object, you just need to precede the create/save/delete call with a call to batch, and pass in the batch object.

                      +
                      +

                      Batch Query General Use Pattern

                      +

                      You can only create, update, and delete rows with a batch query, attempting to read rows out of the database with a batch query will fail.

                      +
                      from cassandra.cqlengine.query import BatchQuery
                      +
                      +#using a context manager
                      +with BatchQuery() as b:
                      +    now = datetime.now()
                      +    em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
                      +    em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
                      +    em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
                      +
                      +# -- or --
                      +
                      +#manually
                      +b = BatchQuery()
                      +now = datetime.now()
                      +em1 = ExampleModel.batch(b).create(example_type=0, description="1", created_at=now)
                      +em2 = ExampleModel.batch(b).create(example_type=0, description="2", created_at=now)
                      +em3 = ExampleModel.batch(b).create(example_type=0, description="3", created_at=now)
                      +b.execute()
                      +
                      +# updating in a batch
                      +
                      +b = BatchQuery()
                      +em1.description = "new description"
                      +em1.batch(b).save()
                      +em2.description = "another new description"
                      +em2.batch(b).save()
                      +b.execute()
                      +
                      +# deleting in a batch
                      +b = BatchQuery()
                      +ExampleModel.objects(id=some_id).batch(b).delete()
                      +ExampleModel.objects(id=some_id2).batch(b).delete()
                      +b.execute()
                      +
                      +
                      +

                      Typically you will not want the block to execute if an exception occurs inside the with block. However, in the case that this is desirable, it’s achievable by using the following syntax:

                      +
                      with BatchQuery(execute_on_exception=True) as b:
                      +    LogEntry.batch(b).create(k=1, v=1)
                      +    mystery_function() # exception thrown in here
                      +    LogEntry.batch(b).create(k=1, v=2) # this code is never reached due to the exception, but anything leading up to here will execute in the batch.
                      +
                      +
                      +

                      If an exception is thrown somewhere in the block, any statements that have been added to the batch will still be executed. This is useful for some logging situations.

                      +
                      +
                      +

                      Batch Query Execution Callbacks

                      +

                      In order to allow secondary tasks to be chained to the end of batch, BatchQuery instances allow callbacks to be +registered with the batch, to be executed immediately after the batch executes.

                      +

                      Multiple callbacks can be attached to same BatchQuery instance, they are executed in the same order that they +are added to the batch.

                      +

                      The callbacks attached to a given batch instance are executed only if the batch executes. If the batch is used as a +context manager and an exception is raised, the queued up callbacks will not be run.

                      +
                      def my_callback(*args, **kwargs):
                      +    pass
                      +
                      +batch = BatchQuery()
                      +
                      +batch.add_callback(my_callback)
                      +batch.add_callback(my_callback, 'positional arg', named_arg='named arg value')
                      +
                      +# if you need reference to the batch within the callback,
                      +# just trap it in the arguments to be passed to the callback:
                      +batch.add_callback(my_callback, cqlengine_batch=batch)
                      +
                      +# once the batch executes...
                      +batch.execute()
                      +
                      +# the effect of the above scheduled callbacks will be similar to
                      +my_callback()
                      +my_callback('positional arg', named_arg='named arg value')
                      +my_callback(cqlengine_batch=batch)
                      +
                      +
                      +

                      Failure in any of the callbacks does not affect the batch’s execution, as the callbacks are started after the execution +of the batch is complete.

                      +
                      +

                      Logged vs Unlogged Batches

                      +

                      By default, queries in cqlengine are LOGGED, which carries additional overhead from UNLOGGED. To explicitly state which batch type to use, simply:

                      +
                      from cassandra.cqlengine.query import BatchType
                      +with BatchQuery(batch_type=BatchType.Unlogged) as b:
                      +    LogEntry.batch(b).create(k=1, v=1)
                      +    LogEntry.batch(b).create(k=1, v=2)
                      +
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/connections.html b/stable/cqlengine/connections.html new file mode 100644 index 0000000000..213b10fe55 --- /dev/null +++ b/stable/cqlengine/connections.html @@ -0,0 +1,746 @@ + + + + + + + + + + + + + Connections | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + + + +
                      +

                      Connections

                      +

                      Connections aim to ease the use of multiple sessions with cqlengine. Connections can be set on a model class, per query or using a context manager.

                      +
                      +

                      Register a new connection

                      +

                      To use cqlengine, you need at least a default connection. If you initialize cqlengine’s connections with with connection.setup, a connection will be created automatically. If you want to use another cluster/session, you need to register a new cqlengine connection. You register a connection with register_connection():

                      +
                      from cassandra.cqlengine import connection
                      +
                      +connection.setup(['127.0.0.1')
                      +connection.register_connection('cluster2', ['127.0.0.2'])
                      +
                      +
                      +

                      register_connection() can take a list of hosts, as shown above, in which case it will create a connection with a new session. It can also take a session argument if you’ve already created a session:

                      +
                      from cassandra.cqlengine import connection
                      +from cassandra.cluster import Cluster
                      +
                      +session = Cluster(['127.0.0.1']).connect()
                      +connection.register_connection('cluster3', session=session)
                      +
                      +
                      +
                      +
                      +

                      Change the default connection

                      +

                      You can change the default cqlengine connection on registration:

                      +
                      from cassandra.cqlengine import connection
                      +
                      +connection.register_connection('cluster2', ['127.0.0.2'] default=True)
                      +
                      +
                      +

                      or on the fly using set_default_connection()

                      +
                      connection.set_default_connection('cluster2')
                      +
                      +
                      +
                      +
                      +

                      Unregister a connection

                      +

                      You can unregister a connection using unregister_connection():

                      +
                      connection.unregister_connection('cluster2')
                      +
                      +
                      +
                      +
                      +

                      Management

                      +

                      When using multiples connections, you also need to sync your models on all connections (and keyspaces) that you need operate on. Management commands have been improved to ease this part. Here is an example:

                      +
                      from cassandra.cqlengine import management
                      +
                      +keyspaces = ['ks1', 'ks2']
                      +conns = ['cluster1', 'cluster2']
                      +
                      +# registers your connections
                      +# ...
                      +
                      +# create all keyspaces on all connections
                      +for ks in keyspaces:
                      +    management.create_simple_keyspace(ks, connections=conns)
                      +
                      +# define your Automobile model
                      +# ...
                      +
                      +# sync your models
                      +management.sync_table(Automobile, keyspaces=keyspaces, connections=conns)
                      +
                      +
                      +
                      +
                      +

                      Connection Selection

                      +

                      cqlengine will select the default connection, unless your specify a connection using one of the following methods.

                      +
                      +

                      Default Model Connection

                      +

                      You can specify a default connection per model:

                      +
                      class Automobile(Model):
                      +    __keyspace__ = 'test'
                      +    __connection__ = 'cluster2'
                      +    manufacturer = columns.Text(primary_key=True)
                      +    year = columns.Integer(primary_key=True)
                      +    model = columns.Text(primary_key=True)
                      +
                      +print len(Automobile.objects.all())  # executed on the connection 'cluster2'
                      +
                      +
                      +
                      +
                      +

                      QuerySet and model instance

                      +

                      You can use the using() method to select a connection (or keyspace):

                      +
                      Automobile.objects.using(connection='cluster1').create(manufacturer='honda', year=2010, model='civic')
                      +q = Automobile.objects.filter(manufacturer='Tesla')
                      +autos = q.using(keyspace='ks2', connection='cluster2').all()
                      +
                      +for auto in autos:
                      +    auto.using(connection='cluster1').save()
                      +
                      +
                      +
                      +
                      +

                      Context Manager

                      +

                      You can use the ContextQuery as well to select a connection:

                      +
                      with ContextQuery(Automobile, connection='cluster1') as A:
                      +    A.objects.filter(manufacturer='honda').all()  # executed on 'cluster1'
                      +
                      +
                      +
                      +
                      +

                      BatchQuery

                      +

                      With a BatchQuery, you can select the connection with the context manager. Note that all operations in the batch need to use the same connection.

                      +
                      with BatchQuery(connection='cluster1') as b:
                      +    Automobile.objects.batch(b).create(manufacturer='honda', year=2010, model='civic')
                      +
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/faq.html b/stable/cqlengine/faq.html new file mode 100644 index 0000000000..8c8a322cc9 --- /dev/null +++ b/stable/cqlengine/faq.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Frequently Asked Questions

                      +
                      +

                      Why don’t updates work correctly on models instantiated as Model(field=value, field2=value2)?

                      +

                      The recommended way to create new rows is with the models .create method. The values passed into a model’s init method are interpreted by the model as the values as they were read from a row. This allows the model to “know” which rows have changed since the row was read out of cassandra, and create suitable update statements.

                      +
                      +
                      +

                      How to preserve ordering in batch query?

                      +

                      Statement Ordering is not supported by CQL3 batches. Therefore, +once cassandra needs resolving conflict(Updating the same column in one batch), +The algorithm below would be used.

                      +
                        +
                      • If timestamps are different, pick the column with the largest timestamp (the value being a regular column or a tombstone)

                      • +
                      • If timestamps are the same, and one of the columns in a tombstone (‘null’) - pick the tombstone

                      • +
                      • If timestamps are the same, and none of the columns are tombstones, pick the column with the largest value

                      • +
                      +

                      Below is an example to show this scenario.

                      +
                      class MyMode(Model):
                      +    id    = columns.Integer(primary_key=True)
                      +    count = columns.Integer()
                      +    text  = columns.Text()
                      +
                      +with BatchQuery() as b:
                      +   MyModel.batch(b).create(id=1, count=2, text='123')
                      +   MyModel.batch(b).create(id=1, count=3, text='111')
                      +
                      +assert MyModel.objects(id=1).first().count == 3
                      +assert MyModel.objects(id=1).first().text  == '123'
                      +
                      +
                      +

                      The largest value of count is 3, and the largest value of text would be ‘123’.

                      +

                      The workaround is applying timestamp to each statement, then Cassandra would +resolve to the statement with the lastest timestamp.

                      +
                      with BatchQuery() as b:
                      +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=2, text='123')
                      +    MyModel.timestamp(datetime.now()).batch(b).create(id=1, count=3, text='111')
                      +
                      +assert MyModel.objects(id=1).first().count == 3
                      +assert MyModel.objects(id=1).first().text  == '111'
                      +
                      +
                      +
                      +
                      +

                      How can I delete individual values from a row?

                      +

                      When inserting with CQLEngine, None is equivalent to CQL NULL or to +issuing a DELETE on that column. For example:

                      +
                      class MyModel(Model):
                      +    id    = columns.Integer(primary_key=True)
                      +    text  = columns.Text()
                      +
                      +m = MyModel.create(id=1, text='We can delete this with None')
                      +assert MyModel.objects(id=1).first().text is not None
                      +
                      +m.update(text=None)
                      +assert MyModel.objects(id=1).first().text is None
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/models.html b/stable/cqlengine/models.html new file mode 100644 index 0000000000..730f3c7892 --- /dev/null +++ b/stable/cqlengine/models.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Models | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + + + +
                      +

                      Models

                      +

                      A model is a python class representing a CQL table. Models derive from Model, and +define basic table properties and columns for a table.

                      +

                      Columns in your models map to columns in your CQL table. You define CQL columns by defining column attributes on your model classes. +For a model to be valid it needs at least one primary key column and one non-primary key column. Just as in CQL, the order you define +your columns in is important, and is the same order they are defined in on a model’s corresponding table.

                      +

                      Some basic examples defining models are shown below. Consult the Model API docs and Column API docs for complete details.

                      +
                      +

                      Example Definitions

                      +

                      This example defines a Person table, with the columns first_name and last_name

                      +
                      from cassandra.cqlengine import columns
                      +from cassandra.cqlengine.models import Model
                      +
                      + class Person(Model):
                      +     id = columns.UUID(primary_key=True)
                      +     first_name  = columns.Text()
                      +     last_name = columns.Text()
                      +
                      +
                      +

                      The Person model would create this CQL table:

                      +
                      CREATE TABLE cqlengine.person (
                      +    id uuid,
                      +    first_name text,
                      +    last_name text,
                      +    PRIMARY KEY (id)
                      +);
                      +
                      +
                      +

                      Here’s an example of a comment table created with clustering keys, in descending order:

                      +
                      from cassandra.cqlengine import columns
                      +from cassandra.cqlengine.models import Model
                      +
                      +class Comment(Model):
                      +    photo_id = columns.UUID(primary_key=True)
                      +    comment_id = columns.TimeUUID(primary_key=True, clustering_order="DESC")
                      +    comment = columns.Text()
                      +
                      +
                      +

                      The Comment model’s create table would look like the following:

                      +
                      CREATE TABLE comment (
                      +  photo_id uuid,
                      +  comment_id timeuuid,
                      +  comment text,
                      +  PRIMARY KEY (photo_id, comment_id)
                      +) WITH CLUSTERING ORDER BY (comment_id DESC);
                      +
                      +
                      +

                      To sync the models to the database, you may do the following*:

                      +
                      from cassandra.cqlengine.management import sync_table
                      +sync_table(Person)
                      +sync_table(Comment)
                      +
                      +
                      +

                      *Note: synchronizing models causes schema changes, and should be done with caution. +Please see the discussion in cassandra.cqlengine.management - Schema management for cqlengine for considerations.

                      +

                      For examples on manipulating data and creating queries, see Making Queries

                      +
                      +
                      +

                      Manipulating model instances as dictionaries

                      +

                      Model instances can be accessed like dictionaries.

                      +
                      class Person(Model):
                      +    first_name  = columns.Text()
                      +    last_name = columns.Text()
                      +
                      +kevin = Person.create(first_name="Kevin", last_name="Deldycke")
                      +dict(kevin)  # returns {'first_name': 'Kevin', 'last_name': 'Deldycke'}
                      +kevin['first_name']  # returns 'Kevin'
                      +kevin.keys()  # returns ['first_name', 'last_name']
                      +kevin.values()  # returns ['Kevin', 'Deldycke']
                      +kevin.items()  # returns [('first_name', 'Kevin'), ('last_name', 'Deldycke')]
                      +
                      +kevin['first_name'] = 'KEVIN5000'  # changes the models first name
                      +
                      +
                      +
                      +
                      +

                      Extending Model Validation

                      +

                      Each time you save a model instance in cqlengine, the data in the model is validated against the schema you’ve defined +for your model. Most of the validation is fairly straightforward, it basically checks that you’re not trying to do +something like save text into an integer column, and it enforces the required flag set on column definitions. +It also performs any transformations needed to save the data properly.

                      +

                      However, there are often additional constraints or transformations you want to impose on your data, beyond simply +making sure that Cassandra won’t complain when you try to insert it. To define additional validation on a model, +extend the model’s validation method:

                      +
                      class Member(Model):
                      +    person_id = UUID(primary_key=True)
                      +    name = Text(required=True)
                      +
                      +    def validate(self):
                      +        super(Member, self).validate()
                      +        if self.name == 'jon':
                      +            raise ValidationError('no jon\'s allowed')
                      +
                      +
                      +

                      Note: while not required, the convention is to raise a ValidationError (from cassandra.cqlengine import ValidationError) +if validation fails.

                      +
                      +
                      +

                      Model Inheritance

                      +

                      It is possible to save and load different model classes using a single CQL table. +This is useful in situations where you have different object types that you want to store in a single cassandra row.

                      +

                      For instance, suppose you want a table that stores rows of pets owned by an owner:

                      +
                      class Pet(Model):
                      +    __table_name__ = 'pet'
                      +    owner_id = UUID(primary_key=True)
                      +    pet_id = UUID(primary_key=True)
                      +    pet_type = Text(discriminator_column=True)
                      +    name = Text()
                      +
                      +    def eat(self, food):
                      +        pass
                      +
                      +    def sleep(self, time):
                      +        pass
                      +
                      +class Cat(Pet):
                      +    __discriminator_value__ = 'cat'
                      +    cuteness = Float()
                      +
                      +    def tear_up_couch(self):
                      +        pass
                      +
                      +class Dog(Pet):
                      +    __discriminator_value__ = 'dog'
                      +    fierceness = Float()
                      +
                      +    def bark_all_night(self):
                      +        pass
                      +
                      +
                      +

                      After calling sync_table on each of these tables, the columns defined in each model will be added to the +pet table. Additionally, saving Cat and Dog models will save the meta data needed to identify each row +as either a cat or dog.

                      +

                      To setup a model structure with inheritance, follow these steps

                      +
                        +
                      1. Create a base model with a column set as the distriminator (distriminator_column=True in the column definition)

                      2. +
                      3. Create subclass models, and define a unique __discriminator_value__ value on each

                      4. +
                      5. Run sync_table on each of the sub tables

                      6. +
                      +

                      About the discriminator value

                      +

                      The discriminator value is what cqlengine uses under the covers to map logical cql rows to the appropriate model type. The +base model maintains a map of discriminator values to subclasses. When a specialized model is saved, its discriminator value is +automatically saved into the discriminator column. The discriminator column may be any column type except counter and container types. +Additionally, if you set index=True on your discriminator column, you can execute queries against specialized subclasses, and a +WHERE clause will be automatically added to your query, returning only rows of that type. Note that you must +define a unique __discriminator_value__ to each subclass, and that you can only assign a single discriminator column per model.

                      +
                      +
                      +

                      User Defined Types

                      +

                      cqlengine models User Defined Types (UDTs) much like tables, with fields defined by column type attributes. However, UDT instances +are only created, presisted, and queried via table Models. A short example to introduce the pattern:

                      +
                      from cassandra.cqlengine.columns import *
                      +from cassandra.cqlengine.models import Model
                      +from cassandra.cqlengine.usertype import UserType
                      +
                      +class address(UserType):
                      +    street = Text()
                      +    zipcode = Integer()
                      +
                      +class users(Model):
                      +    __keyspace__ = 'account'
                      +    name = Text(primary_key=True)
                      +    addr = UserDefinedType(address)
                      +
                      +users.create(name="Joe", addr=address(street="Easy St.", zipcode=99999))
                      +user = users.objects(name="Joe")[0]
                      +print user.name, user.addr
                      +# Joe address(street=u'Easy St.', zipcode=99999)
                      +
                      +
                      +

                      UDTs are modeled by inheriting UserType, and setting column type attributes. Types are then used in defining +models by declaring a column of type UserDefinedType, with the UserType class as a parameter.

                      +

                      sync_table will implicitly +synchronize any types contained in the table. Alternatively sync_type() can be used to create/alter types +explicitly.

                      +

                      Upon declaration, types are automatically registered with the driver, so query results return instances of your UserType +class*.

                      +

                      *Note: UDTs were not added to the native protocol until v3. When setting up the cqlengine connection, be sure to specify +protocol_version=3. If using an earlier version, UDT queries will still work, but the returned type will be a namedtuple.

                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/queryset.html b/stable/cqlengine/queryset.html new file mode 100644 index 0000000000..fa7be38eef --- /dev/null +++ b/stable/cqlengine/queryset.html @@ -0,0 +1,987 @@ + + + + + + + + + + + + + Making Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Making Queries

                      +
                      +

                      Retrieving objects

                      +

                      Once you’ve populated Cassandra with data, you’ll probably want to retrieve some of it. This is accomplished with QuerySet objects. This section will describe how to use QuerySet objects to retrieve the data you’re looking for.

                      +
                      +

                      Retrieving all objects

                      +

                      The simplest query you can make is to return all objects from a table.

                      +

                      This is accomplished with the .all() method, which returns a QuerySet of all objects in a table

                      +

                      Using the Person example model, we would get all Person objects like this:

                      +
                      all_objects = Person.objects.all()
                      +
                      +
                      +
                      +
                      +

                      Retrieving objects with filters

                      +

                      Typically, you’ll want to query only a subset of the records in your database.

                      +

                      That can be accomplished with the QuerySet’s .filter(\*\*) method.

                      +

                      For example, given the model definition:

                      +
                      class Automobile(Model):
                      +    manufacturer = columns.Text(primary_key=True)
                      +    year = columns.Integer(primary_key=True)
                      +    model = columns.Text()
                      +    price = columns.Decimal()
                      +    options = columns.Set(columns.Text)
                      +
                      +
                      +

                      …and assuming the Automobile table contains a record of every car model manufactured in the last 20 years or so, we can retrieve only the cars made by a single manufacturer like this:

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +
                      +
                      +

                      You can also use the more convenient syntax:

                      +
                      q = Automobile.objects(Automobile.manufacturer == 'Tesla')
                      +
                      +
                      +

                      We can then further filter our query with another call to .filter

                      +
                      q = q.filter(year=2012)
                      +
                      +
                      +

                      Note: all queries involving any filtering MUST define either an ‘=’ or an ‘in’ relation to either a primary key column, or an indexed column.

                      +
                      +
                      +
                      +

                      Accessing objects in a QuerySet

                      +

                      There are several methods for getting objects out of a queryset

                      +
                        +
                      • +
                        iterating over the queryset
                        for car in Automobile.objects.all():
                        +    #...do something to the car instance
                        +    pass
                        +
                        +
                        +
                        +
                        +
                      • +
                      • +
                        list index
                        q = Automobile.objects.all()
                        +q[0] #returns the first result
                        +q[1] #returns the second result
                        +
                        +
                        +
                        +

                        Note

                        +
                          +
                        • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array indexing will load every result up to the index value requested

                        • +
                        • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                        • +
                        +
                        +
                        +
                        +
                      • +
                      • +
                        list slicing
                        q = Automobile.objects.all()
                        +q[1:] #returns all results except the first
                        +q[1:9] #returns a slice of the results
                        +
                        +
                        +
                        +

                        Note

                        +
                          +
                        • CQL does not support specifying a start position in it’s queries. Therefore, accessing elements using array slicing will load every result up to the index value requested

                        • +
                        • Using negative indices requires a “SELECT COUNT()” to be executed. This has a performance cost on large datasets.

                        • +
                        +
                        +
                        +
                        +
                      • +
                      • +
                        calling get() on the queryset
                        q = Automobile.objects.filter(manufacturer='Tesla')
                        +q = q.filter(year=2012)
                        +car = q.get()
                        +
                        +
                        +

                        this returns the object matching the queryset

                        +
                        +
                        +
                      • +
                      • +
                        calling first() on the queryset
                        q = Automobile.objects.filter(manufacturer='Tesla')
                        +q = q.filter(year=2012)
                        +car = q.first()
                        +
                        +
                        +

                        this returns the first value in the queryset

                        +
                        +
                        +
                      • +
                      +
                      +
                      +

                      Filtering Operators

                      +

                      Equal To

                      +

                      The default filtering operator.

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year=2012)  #year == 2012
                      +
                      +
                      +

                      In addition to simple equal to queries, cqlengine also supports querying with other operators by appending a __<op> to the field name on the filtering call

                      +

                      in (__in)

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year__in=[2011, 2012])
                      +
                      +
                      +

                      > (__gt)

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year__gt=2010)  # year > 2010
                      +
                      +# or the nicer syntax
                      +
                      +q.filter(Automobile.year > 2010)
                      +
                      +
                      +

                      >= (__gte)

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year__gte=2010)  # year >= 2010
                      +
                      +# or the nicer syntax
                      +
                      +q.filter(Automobile.year >= 2010)
                      +
                      +
                      +

                      < (__lt)

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year__lt=2012)  # year < 2012
                      +
                      +# or...
                      +
                      +q.filter(Automobile.year < 2012)
                      +
                      +
                      +

                      <= (__lte)

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q = q.filter(year__lte=2012)  # year <= 2012
                      +
                      +q.filter(Automobile.year <= 2012)
                      +
                      +
                      +

                      CONTAINS (__contains)

                      +

                      The CONTAINS operator is available for all collection types (List, Set, Map).

                      +
                      q = Automobile.objects.filter(manufacturer='Tesla')
                      +q.filter(options__contains='backup camera').allow_filtering()
                      +
                      +
                      +

                      Note that we need to use allow_filtering() since the options column has no secondary index.

                      +

                      LIKE (__like)

                      +

                      The LIKE operator is available for text columns that have a SASI secondary index.

                      +
                      q = Automobile.objects.filter(model__like='%Civic%').allow_filtering()
                      +
                      +
                      +

                      IS NOT NULL (IsNotNull(column_name))

                      +

                      The IS NOT NULL operator is not yet supported for C*.

                      +
                      q = Automobile.objects.filter(IsNotNull('model'))
                      +
                      +
                      +

                      Limitations:

                      +
                        +
                      • Currently, cqlengine does not support SASI index creation. To use this feature, you need to create the SASI index using the core driver.

                      • +
                      • Queries using LIKE must use allow_filtering() since the model column has no standard secondary index. Note that the server will use the SASI index properly when executing the query.

                      • +
                      +
                      +
                      +

                      TimeUUID Functions

                      +

                      In addition to querying using regular values, there are two functions you can pass in when querying TimeUUID columns to help make filtering by them easier. Note that these functions don’t actually return a value, but instruct the cql interpreter to use the functions in it’s query.

                      +
                      +
                      +class cqlengine.queryset.MinTimeUUID(datetime)
                      +

                      returns the minimum time uuid value possible for the given datetime

                      +
                      + +
                      +
                      +class cqlengine.queryset.MaxTimeUUID(datetime)
                      +

                      returns the maximum time uuid value possible for the given datetime

                      +
                      + +

                      Example

                      +
                      class DataStream(Model):
                      +    id      = columns.UUID(partition_key=True)
                      +    time    = columns.TimeUUID(primary_key=True)
                      +    data    = columns.Bytes()
                      +
                      +min_time = datetime(1982, 1, 1)
                      +max_time = datetime(1982, 3, 9)
                      +
                      +DataStream.filter(time__gt=functions.MinTimeUUID(min_time), time__lt=functions.MaxTimeUUID(max_time))
                      +
                      +
                      +
                      +
                      +

                      Token Function

                      +

                      Token functon may be used only on special, virtual column pk__token, representing token of partition key (it also works for composite partition keys). +Cassandra orders returned items by value of partition key token, so using cqlengine.Token we can easy paginate through all table rows.

                      +

                      See http://cassandra.apache.org/doc/cql3/CQL-3.0.html#tokenFun

                      +

                      Example

                      +
                      class Items(Model):
                      +    id      = columns.Text(primary_key=True)
                      +    data    = columns.Bytes()
                      +
                      +query = Items.objects.all().limit(10)
                      +
                      +first_page = list(query);
                      +last = first_page[-1]
                      +next_page = list(query.filter(pk__token__gt=cqlengine.Token(last.pk)))
                      +
                      +
                      +
                      +
                      +

                      QuerySets are immutable

                      +

                      When calling any method that changes a queryset, the method does not actually change the queryset object it’s called on, but returns a new queryset object with the attributes of the original queryset, plus the attributes added in the method call.

                      +

                      Example

                      +
                      #this produces 3 different querysets
                      +#q does not change after it's initial definition
                      +q = Automobiles.objects.filter(year=2012)
                      +tesla2012 = q.filter(manufacturer='Tesla')
                      +honda2012 = q.filter(manufacturer='Honda')
                      +
                      +
                      +
                      +
                      +

                      Ordering QuerySets

                      +

                      Since Cassandra is essentially a distributed hash table on steroids, the order you get records back in will not be particularly predictable.

                      +

                      However, you can set a column to order on with the .order_by(column_name) method.

                      +

                      Example

                      +
                      #sort ascending
                      +q = Automobiles.objects.all().order_by('year')
                      +#sort descending
                      +q = Automobiles.objects.all().order_by('-year')
                      +
                      +
                      +

                      Note: Cassandra only supports ordering on a clustering key. In other words, to support ordering results, your model must have more than one primary key, and you must order on a primary key, excluding the first one.

                      +

                      For instance, given our Automobile model, year is the only column we can order on.

                      +
                      +
                      +

                      Values Lists

                      +

                      There is a special QuerySet’s method .values_list() - when called, QuerySet returns lists of values instead of model instances. It may significantly speedup things with lower memory footprint for large responses. +Each tuple contains the value from the respective field passed into the values_list() call — so the first item is the first field, etc. For example:

                      +
                      items = list(range(20))
                      +random.shuffle(items)
                      +for i in items:
                      +    TestModel.create(id=1, clustering_key=i)
                      +
                      +values = list(TestModel.objects.values_list('clustering_key', flat=True))
                      +# [19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L, 0L]
                      +
                      +
                      +
                      +
                      +

                      Per Query Timeouts

                      +

                      By default all queries are executed with the timeout defined in ~cqlengine.connection.setup() +The examples below show how to specify a per-query timeout. +A timeout is specified in seconds and can be an int, float or None. +None means no timeout.

                      +
                      class Row(Model):
                      +    id = columns.Integer(primary_key=True)
                      +    name = columns.Text()
                      +
                      +
                      +

                      Fetch all objects with a timeout of 5 seconds

                      +
                      Row.objects().timeout(5).all()
                      +
                      +
                      +

                      Create a single row with a 50ms timeout

                      +
                      Row(id=1, name='Jon').timeout(0.05).create()
                      +
                      +
                      +

                      Delete a single row with no timeout

                      +
                      Row(id=1).timeout(None).delete()
                      +
                      +
                      +

                      Update a single row with no timeout

                      +
                      Row(id=1).timeout(None).update(name='Blake')
                      +
                      +
                      +

                      Batch query timeouts

                      +
                      with BatchQuery(timeout=10) as b:
                      +    Row(id=1, name='Jon').create()
                      +
                      +
                      +

                      NOTE: You cannot set both timeout and batch at the same time, batch will use the timeout defined in it’s constructor. +Setting the timeout on the model is meaningless and will raise an AssertionError.

                      +
                      +
                      +

                      Default TTL and Per Query TTL

                      +

                      Model default TTL now relies on the default_time_to_live feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (scylla-driver >=3.6). You can set the default TTL of a table like this:

                      +

                      Example:

                      +
                      class User(Model):
                      +    __options__ = {'default_time_to_live': 20}
                      +
                      +    user_id = columns.UUID(primary_key=True)
                      +    ...
                      +
                      +
                      +

                      You can set TTL per-query if needed. Here are a some examples:

                      +

                      Example:

                      +
                      class User(Model):
                      +    __options__ = {'default_time_to_live': 20}
                      +
                      +    user_id = columns.UUID(primary_key=True)
                      +    ...
                      +
                      +user = User.objects.create(user_id=1)  # Default TTL 20 will be set automatically on the server
                      +
                      +user.ttl(30).update(age=21)            # Update the TTL to 30
                      +User.objects.ttl(10).create(user_id=1)  # TTL 10
                      +User(user_id=1, age=21).ttl(10).save()  # TTL 10
                      +
                      +
                      +
                      +
                      +

                      Named Tables

                      +

                      Named tables are a way of querying a table without creating an class. They’re useful for querying system tables or exploring an unfamiliar database.

                      +
                      from cassandra.cqlengine.connection import setup
                      +setup("127.0.0.1", "cqlengine_test")
                      +
                      +from cassandra.cqlengine.named import NamedTable
                      +user = NamedTable("cqlengine_test", "user")
                      +user.objects()
                      +user.objects()[0]
                      +
                      +# {u'pk': 1, u't': datetime.datetime(2014, 6, 26, 17, 10, 31, 774000)}
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/third-party.html b/stable/cqlengine/third-party.html new file mode 100644 index 0000000000..7c5d5a6817 --- /dev/null +++ b/stable/cqlengine/third-party.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Third party integrations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Third party integrations

                      +
                      +

                      Celery

                      +

                      Here’s how, in substance, CQLengine can be plugged to Celery:

                      +
                      from celery import Celery
                      +from celery.signals import worker_process_init, beat_init
                      +from cassandra.cqlengine import connection
                      +from cassandra.cqlengine.connection import (
                      +    cluster as cql_cluster, session as cql_session)
                      +
                      +def cassandra_init(**kwargs):
                      +    """ Initialize a clean Cassandra connection. """
                      +    if cql_cluster is not None:
                      +        cql_cluster.shutdown()
                      +    if cql_session is not None:
                      +        cql_session.shutdown()
                      +    connection.setup()
                      +
                      +# Initialize worker context for both standard and periodic tasks.
                      +worker_process_init.connect(cassandra_init)
                      +beat_init.connect(cassandra_init)
                      +
                      +app = Celery()
                      +
                      +
                      +
                      +
                      +

                      uWSGI

                      +

                      This is the code required for proper connection handling of CQLengine for a +uWSGI-run application:

                      +
                      from cassandra.cqlengine import connection
                      +from cassandra.cqlengine.connection import (
                      +    cluster as cql_cluster, session as cql_session)
                      +
                      +try:
                      +    from uwsgidecorators import postfork
                      +except ImportError:
                      +    # We're not in a uWSGI context, no need to hook Cassandra session
                      +    # initialization to the postfork event.
                      +    pass
                      +else:
                      +    @postfork
                      +    def cassandra_init(**kwargs):
                      +        """ Initialize a new Cassandra session in the context.
                      +
                      +        Ensures that a new session is returned for every new request.
                      +        """
                      +        if cql_cluster is not None:
                      +            cql_cluster.shutdown()
                      +        if cql_session is not None:
                      +            cql_session.shutdown()
                      +        connection.setup()
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/cqlengine/upgrade-guide.html b/stable/cqlengine/upgrade-guide.html new file mode 100644 index 0000000000..10d5eea785 --- /dev/null +++ b/stable/cqlengine/upgrade-guide.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + + + +
                      +

                      Upgrade Guide

                      +

                      This is an overview of things that changed as the cqlengine project was merged into +scylla-driver. While efforts were taken to preserve the API and most functionality exactly, +conversion to this package will still require certain minimal updates (namely, imports).

                      +

                      THERE IS ONE FUNCTIONAL CHANGE, described in the first section below.

                      +
                      +

                      Functional Changes

                      +
                      +

                      List Prepend Reversing

                      +

                      Legacy cqlengine included a workaround for a Cassandra bug in which prepended list segments were +reversed (CASSANDRA-8733). As of +this integration, this workaround is removed. The first released integrated version emits +a warning when prepend is used. Subsequent versions will have this warning removed.

                      +
                      +
                      +

                      Date Column Type

                      +

                      The Date column type in legacy cqlengine used a timestamp CQL type and truncated the time. +Going forward, the Date type represents a date for Cassandra 2.2+ +(PYTHON-245). +Users of the legacy functionality should convert models to use DateTime (which +uses timestamp internally), and use the build-in datetime.date for input values.

                      +
                      +
                      +
                      +

                      Remove cqlengine

                      +

                      To avoid confusion or mistakes using the legacy package in your application, it +is prudent to remove the cqlengine package when upgrading to the integrated version.

                      +

                      The driver setup script will warn if the legacy package is detected during install, +but it will not prevent side-by-side installation.

                      +
                      +
                      +

                      Organization

                      +
                      +

                      Imports

                      +

                      cqlengine is now integrated as a sub-package of the driver base package ‘cassandra’. +Upgrading will require adjusting imports to cqlengine. For example:

                      +
                      from cassandra.cqlengine import columns
                      +
                      +
                      +

                      is now:

                      +
                      from cassandra.cqlengine import columns
                      +
                      +
                      +
                      +
                      +

                      Package-Level Aliases

                      +

                      Legacy cqlengine defined a number of aliases at the package level, which became redundant +when the package was integrated for a driver. These have been removed in favor of absolute +imports, and referring to cannonical definitions. For example, cqlengine.ONE was an alias +of cassandra.ConsistencyLevel.ONE. In the integrated package, only the +cassandra.ConsistencyLevel remains.

                      +

                      Additionally, submodule aliases are removed from cqlengine in favor of absolute imports.

                      +

                      These aliases are removed, and not deprecated because they should be straightforward to iron out +at module load time.

                      +
                      +
                      +

                      Exceptions

                      +

                      The legacy cqlengine.exceptions module had a number of Exception classes that were variously +common to the package, or only used in specific modules. Common exceptions were relocated to +cqlengine, and specialized exceptions were placed in the module that raises them. Below is a +listing of updated locations:

                      + + + + + + + + + + + + + + + + + + + + + + + + + + +

                      Exception class

                      New module

                      CQLEngineException

                      cassandra.cqlengine

                      ModelException

                      cassandra.cqlengine.models

                      ValidationError

                      cassandra.cqlengine

                      UndefinedKeyspaceException

                      cassandra.cqlengine.connection

                      LWTException

                      cassandra.cqlengine.query

                      IfNotExistsWithCounterColumn

                      cassandra.cqlengine.query

                      +
                      +
                      +

                      UnicodeMixin Consolidation

                      +

                      class UnicodeMixin was defined in several cqlengine modules. This has been consolidated +to a single definition in the cqlengine package init file. This is not technically part of +the API, but noted here for completeness.

                      +
                      +
                      +
                      +

                      API Deprecations

                      +

                      This upgrade served as a good juncture to deprecate certain API features and invite users to upgrade +to new ones. The first released version does not change functionality – only introduces deprecation +warnings. Future releases will remove these features in favor of the alternatives.

                      +
                      +

                      Float/Double Overload

                      +

                      Previously there was no Double column type. Doubles were modeled by specifying Float(double_precision=True). +This inititializer parameter is now deprecated. Applications should use Double for CQL double, and Float +for CQL float.

                      +
                      +
                      +

                      Schema Management

                      +

                      cassandra.cqlengine.management.create_keyspace is deprecated. Instead, use the new replication-strategy-specific +functions that accept explicit options for known strategies:

                      + +

                      cassandra.cqlengine.management.delete_keyspace is deprecated in favor of a new function, drop_keyspace(). The +intent is simply to make the function match the CQL verb it invokes.

                      +
                      +
                      +

                      Model Inheritance

                      +

                      The names for class attributes controlling model inheritance are changing. Changes are as follows:

                      + +

                      The functionality is unchanged – the intent here is to make the names and language around these attributes more precise. +For now, the old names are just deprecated, and the mapper will emit warnings if they are used. The old names +will be removed in a future version.

                      +

                      The example below shows a simple translation:

                      +

                      Before:

                      +
                      class Pet(Model):
                      +    __table_name__ = 'pet'
                      +    owner_id = UUID(primary_key=True)
                      +    pet_id = UUID(primary_key=True)
                      +    pet_type = Text(polymorphic_key=True)
                      +    name = Text()
                      +
                      +class Cat(Pet):
                      +    __polymorphic_key__ = 'cat'
                      +
                      +class Dog(Pet):
                      +    __polymorphic_key__ = 'dog'
                      +
                      +
                      +

                      After:

                      +
                      class Pet(models.Model):
                      +    __table_name__ = 'pet'
                      +    owner_id = UUID(primary_key=True)
                      +    pet_id = UUID(primary_key=True)
                      +    pet_type = Text(discriminator_column=True)
                      +    name = Text()
                      +
                      +class Cat(Pet):
                      +    __discriminator_value__ = 'cat'
                      +
                      +class Dog(Pet):
                      +    __discriminator_value__ = 'dog'
                      +
                      +
                      +
                      +
                      +

                      TimeUUID.from_datetime

                      +

                      This function is deprecated in favor of the core utility function uuid_from_time().

                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/dates-and-times.html b/stable/dates-and-times.html new file mode 100644 index 0000000000..30461651bc --- /dev/null +++ b/stable/dates-and-times.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Working with Dates and Times | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Working with Dates and Times

                      +

                      This document is meant to provide on overview of the assumptions and limitations of the driver time handling, the +reasoning behind it, and describe approaches to working with these types.

                      +
                      +

                      timestamps (Cassandra DateType)

                      +

                      Timestamps in Cassandra are timezone-naive timestamps encoded as millseconds since UNIX epoch. Clients working with +timestamps in this database usually find it easiest to reason about them if they are always assumed to be UTC. To quote the +pytz documentation, “The preferred way of dealing with times is to always work in UTC, converting to localtime only when +generating output to be read by humans.” The driver adheres to this tenant, and assumes UTC is always in the database. The +driver attempts to make this correct on the way in, and assumes no timezone on the way out.

                      +
                      +

                      Write Path

                      +

                      When inserting timestamps, the driver handles serialization for the write path as follows:

                      +

                      If the input is a datetime.datetime, the serialization is normalized by starting with the utctimetuple() of the +value.

                      +
                        +
                      • If the datetime object is timezone-aware, the timestamp is shifted, and represents the UTC timestamp equivalent.

                      • +
                      • If the datetime object is timezone-naive, this results in no shift – any datetime with no timezone information is assumed to be UTC

                      • +
                      +

                      Note the second point above applies even to “local” times created using now():

                      +
                      >>> d = datetime.now()
                      +
                      +>>> print(d.tzinfo)
                      +None
                      +
                      +
                      +

                      These do not contain timezone information intrinsically, so they will be assumed to be UTC and not shifted. When generating +timestamps in the application, it is clearer to use datetime.utcnow() to be explicit about it.

                      +

                      If the input for a timestamp is numeric, it is assumed to be a epoch-relative millisecond timestamp, as specified in the +CQL spec – no scaling or conversion is done.

                      +
                      +
                      +

                      Read Path

                      +

                      The driver always assumes persisted timestamps are UTC and makes no attempt to localize them. Returned values are +timezone-naive datetime.datetime. We follow this approach because the datetime API has deficiencies around daylight +saving time, and the defacto package for handling this is a third-party package (we try to minimize external dependencies +and not make decisions for the integrator).

                      +

                      The decision for how to handle timezones is left to the application. For the most part it is straightforward to apply +localization to the datetimes returned by queries. One prevalent method is to use pytz for localization:

                      +
                      import pytz
                      +user_tz = pytz.timezone('US/Central')
                      +timestamp_naive = row.ts
                      +timestamp_utc = pytz.utc.localize(timestamp_naive)
                      +timestamp_presented = timestamp_utc.astimezone(user_tz)
                      +
                      +
                      +

                      This is the most robust approach (likely refactored into a function). If it is deemed too cumbersome to apply for all call +sites in the application, it is possible to patch the driver with custom deserialization for this type. However, doing +this depends depends some on internal APIs and what extensions are present, so we will only mention the possibility, and +not spell it out here.

                      +
                      +
                      +
                      +

                      date, time (Cassandra DateType)

                      +

                      Date and time in Cassandra are idealized markers, much like datetime.date and datetime.time in the Python standard +library. Unlike these Python implementations, the Cassandra encoding supports much wider ranges. To accommodate these +ranges without overflow, this driver returns these data in custom types: util.Date and util.Time.

                      +
                      +

                      Write Path

                      +

                      For simple (not prepared) statements, the input values for each of these can be either a string literal or an encoded +integer. See Working with dates +or Working with time for details +on the encoding or string formats.

                      +

                      For prepared statements, the driver accepts anything that can be used to construct the util.Date or +util.Time classes. See the linked API docs for details.

                      +
                      +
                      +

                      Read Path

                      +

                      The driver always returns custom types for date and time.

                      +

                      The driver returns util.Date for date in order to accommodate the wider range of values without overflow. +For applications working within the supported range of [datetime.MINYEAR, datetime.MAXYEAR], these are easily +converted to standard datetime.date insances using Date.date().

                      +

                      The driver returns util.Time for time in order to retain nanosecond precision stored in the database. +For applications not concerned with this level of precision, these are easily converted to standard datetime.time +insances using Time.time().

                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/execution-profiles.html b/stable/execution-profiles.html new file mode 100644 index 0000000000..3025c4dc8c --- /dev/null +++ b/stable/execution-profiles.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + Execution Profiles | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Execution Profiles

                      +

                      Execution profiles aim at making it easier to execute requests in different ways within +a single connected Session. Execution profiles are being introduced to deal with the exploding number of +configuration options, especially as the database platform evolves more complex workloads.

                      +

                      The legacy configuration remains intact, but legacy and Execution Profile APIs +cannot be used simultaneously on the same client Cluster. Legacy configuration +will be removed in the next major release (4.0).

                      +

                      An execution profile and its parameters should be unique across Cluster instances. +For example, an execution profile and its LoadBalancingPolicy should +not be applied to more than one Cluster instance.

                      +

                      This document explains how Execution Profiles relate to existing settings, and shows how to use the new profiles for +request execution.

                      +
                      +

                      Mapping Legacy Parameters to Profiles

                      +

                      Execution profiles can inherit from cluster.ExecutionProfile, and currently provide the following options, +previously input from the noted attributes:

                      + +

                      When using the new API, these parameters can be defined by instances of cluster.ExecutionProfile.

                      +
                      +
                      +

                      Using Execution Profiles

                      +
                      +

                      Default

                      +
                      from cassandra.cluster import Cluster
                      +cluster = Cluster()
                      +session = cluster.connect()
                      +local_query = 'SELECT rpc_address FROM system.local'
                      +for _ in cluster.metadata.all_hosts():
                      +    print session.execute(local_query)[0]
                      +
                      +
                      +
                      Row(rpc_address='127.0.0.2')
                      +Row(rpc_address='127.0.0.1')
                      +
                      +
                      +

                      The default execution profile is built from Cluster parameters and default Session attributes. This profile matches existing default +parameters.

                      +
                      +
                      +

                      Initializing cluster with profiles

                      +
                      from cassandra.cluster import ExecutionProfile
                      +from cassandra.policies import WhiteListRoundRobinPolicy
                      +
                      +node1_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
                      +node2_profile = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.2']))
                      +
                      +profiles = {'node1': node1_profile, 'node2': node2_profile}
                      +session = Cluster(execution_profiles=profiles).connect()
                      +for _ in cluster.metadata.all_hosts():
                      +    print session.execute(local_query, execution_profile='node1')[0]
                      +
                      +
                      +
                      Row(rpc_address='127.0.0.1')
                      +Row(rpc_address='127.0.0.1')
                      +
                      +
                      +
                      for _ in cluster.metadata.all_hosts():
                      +    print session.execute(local_query, execution_profile='node2')[0]
                      +
                      +
                      +
                      Row(rpc_address='127.0.0.2')
                      +Row(rpc_address='127.0.0.2')
                      +
                      +
                      +
                      for _ in cluster.metadata.all_hosts():
                      +    print session.execute(local_query)[0]
                      +
                      +
                      +
                      Row(rpc_address='127.0.0.2')
                      +Row(rpc_address='127.0.0.1')
                      +
                      +
                      +

                      Note that, even when custom profiles are injected, the default TokenAwarePolicy(DCAwareRoundRobinPolicy()) is still +present. To override the default, specify a policy with the EXEC_PROFILE_DEFAULT key.

                      +
                      from cassandra.cluster import EXEC_PROFILE_DEFAULT
                      +profile = ExecutionProfile(request_timeout=30)
                      +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
                      +
                      +
                      +
                      +
                      +

                      Adding named profiles

                      +

                      New profiles can be added constructing from scratch, or deriving from default:

                      +
                      locked_execution = ExecutionProfile(load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']))
                      +node1_profile = 'node1_whitelist'
                      +cluster.add_execution_profile(node1_profile, locked_execution)
                      +
                      +for _ in cluster.metadata.all_hosts():
                      +    print session.execute(local_query, execution_profile=node1_profile)[0]
                      +
                      +
                      +
                      Row(rpc_address='127.0.0.1')
                      +Row(rpc_address='127.0.0.1')
                      +
                      +
                      +

                      See Cluster.add_execution_profile() for details and optional parameters.

                      +
                      +
                      +

                      Passing a profile instance without mapping

                      +

                      We also have the ability to pass profile instances to be used for execution, but not added to the mapping:

                      +
                      from cassandra.query import tuple_factory
                      +
                      +tmp = session.execution_profile_clone_update('node1', request_timeout=100, row_factory=tuple_factory)
                      +
                      +print session.execute(local_query, execution_profile=tmp)[0]
                      +print session.execute(local_query, execution_profile='node1')[0]
                      +
                      +
                      +
                      ('127.0.0.1',)
                      +Row(rpc_address='127.0.0.1')
                      +
                      +
                      +

                      The new profile is a shallow copy, so the tmp profile shares a load balancing policy with one managed by the cluster. +If reference objects are to be updated in the clone, one would typically set those attributes to a new instance.

                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/faq.html b/stable/faq.html new file mode 100644 index 0000000000..bfc182b4b9 --- /dev/null +++ b/stable/faq.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Frequently Asked Questions | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Frequently Asked Questions

                      +

                      See also cqlengine FAQ

                      +
                      +

                      Why do connections or IO operations timeout in my WSGI application?

                      +

                      Depending on your application process model, it may be forking after driver Session is created. Most IO reactors do not handle this, and problems will manifest as timeouts.

                      +

                      To avoid this, make sure to create sessions per process, after the fork. Using uWSGI and Flask for example:

                      +
                      from flask import Flask
                      +from uwsgidecorators import postfork
                      +from cassandra.cluster import Cluster
                      +
                      +session = None
                      +prepared = None
                      +
                      +@postfork
                      +def connect():
                      +    global session, prepared
                      +    session = Cluster().connect()
                      +    prepared = session.prepare("SELECT release_version FROM system.local WHERE key=?")
                      +
                      +app = Flask(__name__)
                      +
                      +@app.route('/')
                      +def server_version():
                      +    row = session.execute(prepared, ('local',))[0]
                      +    return row.release_version
                      +
                      +
                      +

                      uWSGI provides a postfork hook you can use to create sessions and prepared statements after the child process forks.

                      +
                      +
                      +

                      How do I trace a request?

                      +

                      Request tracing can be turned on for any request by setting trace=True in Session.execute_async(). View the results by waiting on the future, then ResponseFuture.get_query_trace(). +Since tracing is done asynchronously to the request, this method polls until the trace is complete before querying data.

                      +
                      >>> future = session.execute_async("SELECT * FROM system.local", trace=True)
                      +>>> result = future.result()
                      +>>> trace = future.get_query_trace()
                      +>>> for e in trace.events:
                      +>>>     print e.source_elapsed, e.description
                      +
                      +0:00:00.000077 Parsing select * from system.local
                      +0:00:00.000153 Preparing statement
                      +0:00:00.000309 Computing ranges to query
                      +0:00:00.000368 Submitting range requests on 1 ranges with a concurrency of 1 (279.77142 rows per range expected)
                      +0:00:00.000422 Submitted 1 concurrent range requests covering 1 ranges
                      +0:00:00.000480 Executing seq scan across 1 sstables for (min(-9223372036854775808), min(-9223372036854775808))
                      +0:00:00.000669 Read 1 live and 0 tombstone cells
                      +0:00:00.000755 Scanned 1 rows and matched 1
                      +
                      +
                      +

                      trace is a QueryTrace object.

                      +
                      +
                      +

                      How do I determine the replicas for a query?

                      +

                      With prepared statements, the replicas are obtained by routing_key, based on current cluster token metadata:

                      +
                      >>> prepared = session.prepare("SELECT * FROM example.t WHERE key=?")
                      +>>> bound = prepared.bind((1,))
                      +>>> replicas = cluster.metadata.get_replicas(bound.keyspace, bound.routing_key)
                      +>>> for h in replicas:
                      +>>>   print h.address
                      +127.0.0.1
                      +127.0.0.2
                      +
                      +
                      +

                      replicas is a list of Host objects.

                      +
                      +
                      +

                      How does the driver manage request retries?

                      +

                      By default, retries are managed by the Cluster.default_retry_policy set on the session Cluster. It can also +be specialized per statement by setting Statement.retry_policy.

                      +

                      Retries are presently attempted on the same coordinator, but this may change in the future.

                      +

                      Please see policies.RetryPolicy for further details.

                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/getting-started.html b/stable/getting-started.html new file mode 100644 index 0000000000..3ab8981132 --- /dev/null +++ b/stable/getting-started.html @@ -0,0 +1,1098 @@ + + + + + + + + + + + + + Getting Started | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Getting Started

                      +

                      First, make sure you have the driver properly installed.

                      +
                      +

                      Connecting to a Cluster

                      +

                      Before we can start executing any queries against a Cassandra cluster we need to setup +an instance of Cluster. As the name suggests, you will typically have one +instance of Cluster for each Cassandra cluster you want to interact +with.

                      +

                      First, make sure you have the Cassandra driver properly installed.

                      +
                      +

                      Connecting to Cassandra

                      +

                      The simplest way to create a Cluster is like this:

                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster()
                      +
                      +
                      +

                      This will attempt to connection to a Cassandra instance on your +local machine (127.0.0.1). You can also specify a list of IP +addresses for nodes in your cluster:

                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster(['192.168.0.1', '192.168.0.2'])
                      +
                      +
                      +

                      The set of IP addresses we pass to the Cluster is simply +an initial set of contact points. After the driver connects to one +of these nodes it will automatically discover the rest of the +nodes in the cluster and connect to them, so you don’t need to list +every node in your cluster.

                      +

                      If you need to use a non-standard port, use SSL, or customize the driver’s +behavior in some other way, this is the place to do it:

                      +
                      from cassandra.cluster import Cluster
                      +cluster = Cluster(['192.168.0.1', '192.168.0.2'], port=..., ssl_context=...)
                      +
                      +
                      +

                      Instantiating a Cluster does not actually connect us to any nodes. +To establish connections and begin executing queries we need a +Session, which is created by calling Cluster.connect():

                      +
                      cluster = Cluster()
                      +session = cluster.connect()
                      +
                      +
                      +
                      +
                      +
                      +

                      Session Keyspace

                      +

                      The connect() method takes an optional keyspace argument +which sets the default keyspace for all queries made through that Session:

                      +
                      cluster = Cluster()
                      +session = cluster.connect('mykeyspace')
                      +
                      +
                      +

                      You can always change a Session’s keyspace using set_keyspace() or +by executing a USE <keyspace> query:

                      +
                      session.set_keyspace('users')
                      +# or you can do this instead
                      +session.execute('USE users')
                      +
                      +
                      +
                      +
                      +

                      Execution Profiles

                      +

                      Profiles are passed in by execution_profiles dict.

                      +

                      In this case we can construct the base ExecutionProfile passing all attributes:

                      +
                      from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                      +from cassandra.policies import WhiteListRoundRobinPolicy, DowngradingConsistencyRetryPolicy
                      +from cassandra.query import tuple_factory
                      +
                      +profile = ExecutionProfile(
                      +    load_balancing_policy=WhiteListRoundRobinPolicy(['127.0.0.1']),
                      +    retry_policy=DowngradingConsistencyRetryPolicy(),
                      +    consistency_level=ConsistencyLevel.LOCAL_QUORUM,
                      +    serial_consistency_level=ConsistencyLevel.LOCAL_SERIAL,
                      +    request_timeout=15,
                      +    row_factory=tuple_factory
                      +)
                      +cluster = Cluster(execution_profiles={EXEC_PROFILE_DEFAULT: profile})
                      +session = cluster.connect()
                      +
                      +print(session.execute("SELECT release_version FROM system.local").one())
                      +
                      +
                      +

                      Users are free to setup additional profiles to be used by name:

                      +
                      profile_long = ExecutionProfile(request_timeout=30)
                      +cluster = Cluster(execution_profiles={'long': profile_long})
                      +session = cluster.connect()
                      +session.execute(statement, execution_profile='long')
                      +
                      +
                      +

                      Also, parameters passed to Session.execute or attached to Statements are still honored as before.

                      +
                      +
                      +

                      Executing Queries

                      +

                      Now that we have a Session we can begin to execute queries. The simplest +way to execute a query is to use execute():

                      +
                      rows = session.execute('SELECT name, age, email FROM users')
                      +for user_row in rows:
                      +    print user_row.name, user_row.age, user_row.email
                      +
                      +
                      +

                      This will transparently pick a Cassandra node to execute the query against +and handle any retries that are necessary if the operation fails.

                      +

                      By default, each row in the result set will be a +namedtuple. +Each row will have a matching attribute for each column defined in the schema, +such as name, age, and so on. You can also treat them as normal tuples +by unpacking them or accessing fields by position. The following three +examples are equivalent:

                      +
                      rows = session.execute('SELECT name, age, email FROM users')
                      +for row in rows:
                      +    print row.name, row.age, row.email
                      +
                      +
                      +
                      rows = session.execute('SELECT name, age, email FROM users')
                      +for (name, age, email) in rows:
                      +    print name, age, email
                      +
                      +
                      +
                      rows = session.execute('SELECT name, age, email FROM users')
                      +for row in rows:
                      +    print row[0], row[1], row[2]
                      +
                      +
                      +

                      If you prefer another result format, such as a dict per row, you +can change the row_factory attribute.

                      +

                      As mentioned in our Drivers Best Practices Guide, +it is highly recommended to use Prepared statements for your +frequently run queries.

                      +
                      +
                      +

                      Prepared Statements

                      +

                      Prepared statements are queries that are parsed by Cassandra and then saved +for later use. When the driver uses a prepared statement, it only needs to +send the values of parameters to bind. This lowers network traffic +and CPU utilization within Cassandra because Cassandra does not have to +re-parse the query each time.

                      +

                      To prepare a query, use Session.prepare():

                      +
                      user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
                      +
                      +users = []
                      +for user_id in user_ids_to_query:
                      +    user = session.execute(user_lookup_stmt, [user_id])
                      +    users.append(user)
                      +
                      +
                      +

                      prepare() returns a PreparedStatement instance +which can be used in place of SimpleStatement instances or literal +string queries. It is automatically prepared against all nodes, and the driver +handles re-preparing against new nodes and restarted nodes when necessary.

                      +

                      Note that the placeholders for prepared statements are ? characters. This +is different than for simple, non-prepared statements (although future versions +of the driver may use the same placeholders for both).

                      +
                      +
                      +

                      Passing Parameters to CQL Queries

                      +

                      Althought it is not recommended, you can also pass parameters to non-prepared +statements. The driver supports two forms of parameter place-holders: positional +and named.

                      +

                      Positional parameters are used with a %s placeholder. For example, +when you execute:

                      +
                      session.execute(
                      +    """
                      +    INSERT INTO users (name, credits, user_id)
                      +    VALUES (%s, %s, %s)
                      +    """,
                      +    ("John O'Reilly", 42, uuid.uuid1())
                      +)
                      +
                      +
                      +

                      It is translated to the following CQL query:

                      +
                      INSERT INTO users (name, credits, user_id)
                      +VALUES ('John O''Reilly', 42, 2644bada-852c-11e3-89fb-e0b9a54a6d93)
                      +
                      +
                      +

                      Note that you should use %s for all types of arguments, not just strings. +For example, this would be wrong:

                      +
                      session.execute("INSERT INTO USERS (name, age) VALUES (%s, %d)", ("bob", 42))  # wrong
                      +
                      +
                      +

                      Instead, use %s for the age placeholder.

                      +

                      If you need to use a literal % character, use %%.

                      +

                      Note: you must always use a sequence for the second argument, even if you are +only passing in a single variable:

                      +
                      session.execute("INSERT INTO foo (bar) VALUES (%s)", "blah")  # wrong
                      +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah"))  # wrong
                      +session.execute("INSERT INTO foo (bar) VALUES (%s)", ("blah", ))  # right
                      +session.execute("INSERT INTO foo (bar) VALUES (%s)", ["blah"])  # right
                      +
                      +
                      +

                      Note that the second line is incorrect because in Python, single-element tuples +require a comma.

                      +

                      Named place-holders use the %(name)s form:

                      +
                      session.execute(
                      +    """
                      +    INSERT INTO users (name, credits, user_id, username)
                      +    VALUES (%(name)s, %(credits)s, %(user_id)s, %(name)s)
                      +    """,
                      +    {'name': "John O'Reilly", 'credits': 42, 'user_id': uuid.uuid1()}
                      +)
                      +
                      +
                      +

                      Note that you can repeat placeholders with the same name, such as %(name)s +in the above example.

                      +

                      Only data values should be supplied this way. Other items, such as keyspaces, +table names, and column names should be set ahead of time (typically using +normal string formatting).

                      +
                      +
                      +

                      Type Conversions

                      +

                      For non-prepared statements, Python types are cast to CQL literals in the +following way:

                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                      Python Type

                      CQL Literal Type

                      None

                      NULL

                      bool

                      boolean

                      float

                      +
                      float
                      +
                      double
                      +
                      +
                      +
                      int
                      +
                      long
                      +
                      +
                      +
                      int
                      +
                      bigint
                      +
                      varint
                      +
                      smallint
                      +
                      tinyint
                      +
                      counter
                      +
                      +

                      decimal.Decimal

                      decimal

                      +
                      str
                      +
                      unicode
                      +
                      +
                      +
                      ascii
                      +
                      varchar
                      +
                      text
                      +
                      +
                      +
                      buffer
                      +
                      bytearray
                      +
                      +

                      blob

                      date

                      date

                      datetime

                      timestamp

                      time

                      time

                      +
                      list
                      +
                      tuple
                      +
                      generator
                      +
                      +

                      list

                      +
                      set
                      +
                      frozenset
                      +
                      +

                      set

                      +
                      dict
                      +
                      OrderedDict
                      +
                      +

                      map

                      uuid.UUID

                      +
                      timeuuid
                      +
                      uuid
                      +
                      +
                      +
                      +
                      +

                      Asynchronous Queries

                      +

                      The driver supports asynchronous query execution through +execute_async(). Instead of waiting for the query to +complete and returning rows directly, this method almost immediately +returns a ResponseFuture object. There are two ways of +getting the final result from this object.

                      +

                      The first is by calling result() on it. If +the query has not yet completed, this will block until it has and +then return the result or raise an Exception if an error occurred. +For example:

                      +
                      from cassandra import ReadTimeout
                      +
                      +query = "SELECT * FROM users WHERE user_id=%s"
                      +future = session.execute_async(query, [user_id])
                      +
                      +# ... do some other work
                      +
                      +try:
                      +    rows = future.result()
                      +    user = rows[0]
                      +    print user.name, user.age
                      +except ReadTimeout:
                      +    log.exception("Query timed out:")
                      +
                      +
                      +

                      This works well for executing many queries concurrently:

                      +
                      # build a list of futures
                      +futures = []
                      +query = "SELECT * FROM users WHERE user_id=%s"
                      +for user_id in ids_to_fetch:
                      +    futures.append(session.execute_async(query, [user_id])
                      +
                      +# wait for them to complete and use the results
                      +for future in futures:
                      +    rows = future.result()
                      +    print rows[0].name
                      +
                      +
                      +

                      Alternatively, instead of calling result(), +you can attach callback and errback functions through the +add_callback(), +add_errback(), and +add_callbacks(), methods. If you have used +Twisted Python before, this is designed to be a lightweight version of +that:

                      +
                      def handle_success(rows):
                      +    user = rows[0]
                      +    try:
                      +        process_user(user.name, user.age, user.id)
                      +    except Exception:
                      +        log.error("Failed to process user %s", user.id)
                      +        # don't re-raise errors in the callback
                      +
                      +def handle_error(exception):
                      +    log.error("Failed to fetch user info: %s", exception)
                      +
                      +
                      +future = session.execute_async(query)
                      +future.add_callbacks(handle_success, handle_error)
                      +
                      +
                      +
                      +
                      There are a few important things to remember when working with callbacks:
                        +
                      • Exceptions that are raised inside the callback functions will be logged and then ignored.

                      • +
                      • Your callback will be run on the event loop thread, so any long-running +operations will prevent other requests from being handled

                      • +
                      +
                      +
                      +
                      +
                      +

                      Setting a Consistency Level

                      +

                      The consistency level used for a query determines how many of the +replicas of the data you are interacting with need to respond for +the query to be considered a success.

                      +

                      By default, ConsistencyLevel.LOCAL_ONE will be used for all queries. +You can specify a different default by setting the ExecutionProfile.consistency_level +for the execution profile with key EXEC_PROFILE_DEFAULT. +To specify a different consistency level per request, wrap queries +in a SimpleStatement:

                      +
                      from cassandra import ConsistencyLevel
                      +from cassandra.query import SimpleStatement
                      +
                      +query = SimpleStatement(
                      +    "INSERT INTO users (name, age) VALUES (%s, %s)",
                      +    consistency_level=ConsistencyLevel.QUORUM)
                      +session.execute(query, ('John', 42))
                      +
                      +
                      +
                      +
                      +

                      Setting a Consistency Level with Prepared Statements

                      +

                      To specify a consistency level for prepared statements, you have two options.

                      +

                      The first is to set a default consistency level for every execution of the +prepared statement:

                      +
                      from cassandra import ConsistencyLevel
                      +
                      +cluster = Cluster()
                      +session = cluster.connect("mykeyspace")
                      +user_lookup_stmt = session.prepare("SELECT * FROM users WHERE user_id=?")
                      +user_lookup_stmt.consistency_level = ConsistencyLevel.QUORUM
                      +
                      +# these will both use QUORUM
                      +user1 = session.execute(user_lookup_stmt, [user_id1])[0]
                      +user2 = session.execute(user_lookup_stmt, [user_id2])[0]
                      +
                      +
                      +

                      The second option is to create a BoundStatement from the +PreparedStatement and binding parameters and set a consistency +level on that:

                      +
                      # override the QUORUM default
                      +user3_lookup = user_lookup_stmt.bind([user_id3])
                      +user3_lookup.consistency_level = ConsistencyLevel.ALL
                      +user3 = session.execute(user3_lookup)
                      +
                      +
                      +
                      +
                      +

                      Speculative Execution

                      +

                      Speculative execution is a way to minimize latency by preemptively executing several +instances of the same query against different nodes. For more details about this +technique, see Speculative Execution with DataStax Drivers.

                      +

                      To enable speculative execution:

                      +
                        +
                      • Configure a SpeculativeExecutionPolicy with the ExecutionProfile

                      • +
                      • Mark your query as idempotent, which mean it can be applied multiple +times without changing the result of the initial application. +See Query Idempotence for more details.

                      • +
                      +

                      Example:

                      +
                      from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                      +from cassandra.policies import ConstantSpeculativeExecutionPolicy
                      +from cassandra.query import SimpleStatement
                      +
                      +# Configure the speculative execution policy
                      +ep = ExecutionProfile(
                      +    speculative_execution_policy=ConstantSpeculativeExecutionPolicy(delay=.5, max_attempts=10)
                      +)
                      +cluster = Cluster(..., execution_profiles={EXEC_PROFILE_DEFAULT: ep})
                      +session = cluster.connect()
                      +
                      +# Mark the query idempotent
                      +query = SimpleStatement(
                      +    "UPDATE my_table SET list_col = [1] WHERE pk = 1",
                      +    is_idempotent=True
                      +)
                      +
                      +# Execute. A new query will be sent to the server every 0.5 second
                      +# until we receive a response, for a max number attempts of 10.
                      +session.execute(query)
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/index.html b/stable/index.html new file mode 100644 index 0000000000..13e0ba46ea --- /dev/null +++ b/stable/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Python Driver for Scylla and Apache Cassandra® | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Python Driver for Scylla and Apache Cassandra®

                      +

                      A Python client driver for Scylla. +This driver works exclusively with the Cassandra Query Language v3 (CQL3) +and Cassandra’s native protocol.

                      +

                      The driver supports Python 2.7, 3.5, 3.6, 3.7 and 3.8.

                      +

                      This driver is open source under the +Apache v2 License. +The source code for this driver can be found on GitHub.

                      +

                      Scylla Driver is a fork from DataStax Python Driver, including some non-breaking changes for Scylla optimization, with more updates planned.

                      +
                      +

                      Contents

                      +
                      +
                      Installation

                      How to install the driver.

                      +
                      +
                      Getting Started

                      A guide through the first steps of connecting to Scylla and executing queries

                      +
                      +
                      Scylla Specific Features

                      A list of feature available only on scylla-driver

                      +
                      +
                      Execution Profiles

                      An introduction to a more flexible way of configuring request execution

                      +
                      +
                      Lightweight Transactions (Compare-and-set)

                      Working with results of conditional requests

                      +
                      +
                      Object Mapper

                      Introduction to the integrated object mapper, cqlengine

                      +
                      +
                      Performance Notes

                      Tips for getting good performance.

                      +
                      +
                      Paging Large Queries

                      Notes on paging large query results

                      +
                      +
                      Security

                      An overview of the security features of the driver

                      +
                      +
                      Upgrading

                      A guide to upgrading versions of the driver

                      +
                      +
                      User Defined Types

                      Working with Scylla’s user-defined types (UDT)

                      +
                      +
                      Working with Dates and Times

                      Some discussion on the driver’s approach to working with timestamp, date, time types

                      +
                      +
                      ScyllaDB Cloud

                      Connect to ScyllaDB Cloud

                      +
                      +
                      ScyllaDB Cloud Serverless

                      Connect to ScyllaDB Cloud Serverless

                      +
                      +
                      CHANGELOG

                      Log of changes to the driver, organized by version.

                      +
                      +
                      Frequently Asked Questions

                      A collection of Frequently Asked Questions

                      +
                      +
                      API Documentation

                      The API documentation.

                      +
                      +
                      +
                      +
                      +
                      +
                      +

                      Getting Help

                      +

                      Visit the FAQ section in this documentation.

                      +

                      Please send questions to the Scylla user list.

                      +
                      +
                      +

                      Reporting Issues

                      +

                      Please report any bugs and make any feature requests on the Github project issues

                      +
                      + +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/installation.html b/stable/installation.html new file mode 100644 index 0000000000..29aa8c915f --- /dev/null +++ b/stable/installation.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + + Installation | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Installation

                      +
                      +

                      Supported Platforms

                      +

                      Python 2.7, 3.5, 3.6, 3.7 and 3.8 are supported. Both CPython (the standard Python +implementation) and PyPy are supported and tested.

                      +

                      Linux, OSX, and Windows are supported.

                      +
                      +
                      +

                      Installation through pip

                      +

                      pip is the suggested tool for installing +packages. It will handle installing all Python dependencies for the driver at +the same time as the driver itself. To install the driver*:

                      +
                      pip install scylla-driver
                      +
                      +
                      +

                      You can use pip install --pre scylla-driver if you need to install a beta version.

                      +

                      *Note: if intending to use optional extensions, install the dependencies first. The driver may need to be reinstalled if dependencies are added after the initial installation.

                      +
                      +
                      +

                      Verifying your Installation

                      +

                      To check if the installation was successful, you can run:

                      +
                      python -c 'import cassandra; print cassandra.__version__'
                      +
                      +
                      +

                      It should print something like “3.22.0”.

                      +
                      +
                      +

                      (Optional) Graph

                      +

                      The driver provides an optional fluent graph API that depends on Apache TinkerPop (gremlinpython). It is +not installed by default. To be able to build Gremlin traversals, you need to install +the graph requirements:

                      +
                      pip install scylla-driver[graph]
                      +
                      +
                      +
                      +
                      +

                      (Optional) Compression Support

                      +

                      Compression can optionally be used for communication between the driver and +Cassandra. There are currently two supported compression algorithms: +snappy (in Cassandra 1.2+) and LZ4 (only in Cassandra 2.0+). If either is +available for the driver and Cassandra also supports it, it will +be used automatically.

                      +

                      For lz4 support:

                      +
                      pip install lz4
                      +
                      +
                      +

                      For snappy support:

                      +
                      pip install python-snappy
                      +
                      +
                      +

                      (If using a Debian Linux derivative such as Ubuntu, it may be easier to +just run apt-get install python-snappy.)

                      +
                      +
                      +

                      (Optional) Metrics Support

                      +

                      The driver has built-in support for capturing Cluster.metrics about +the queries you run. However, the scales library is required to +support this:

                      +
                      pip install scales
                      +
                      +
                      +
                      +

                      Speeding Up Installation

                      +

                      By default, installing the driver through pip uses a pre-compiled, platform-specific wheel when available. +If using a source distribution rather than a wheel, Cython is used to compile certain parts of the driver. +This makes those hot paths faster at runtime, but the Cython compilation +process can take a long time – as long as 10 minutes in some environments.

                      +

                      In environments where performance is less important, it may be worth it to +disable Cython as documented below. +You can also use CASS_DRIVER_BUILD_CONCURRENCY to increase the number of +threads used to build the driver and any C extensions:

                      +
                      $ # installing from source
                      +$ CASS_DRIVER_BUILD_CONCURRENCY=8 python setup.py install
                      +$ # installing from pip
                      +$ CASS_DRIVER_BUILD_CONCURRENCY=8 pip install scylla-driver
                      +
                      +
                      +
                      +
                      +

                      OSX Installation Error

                      +

                      If you’re installing on OSX and have XCode 5.1 installed, you may see an error like this:

                      +
                      clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
                      +
                      +
                      +

                      To fix this, re-run the installation with an extra compilation flag:

                      +
                      ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install scylla-driver
                      +
                      +
                      +
                      +
                      +
                      +

                      Windows Installation Notes

                      +

                      Installing the driver with extensions in Windows sometimes presents some challenges. A few notes about common +hang-ups:

                      +

                      Setup requires a compiler. When using Python 2, this is as simple as installing this package +(this link is also emitted during install if setuptools is unable to find the resources it needs). Depending on your +system settings, this package may install as a user-specific application. Make sure to install for everyone, or at least +as the user that will be building the Python environment.

                      +

                      It is also possible to run the build with your compiler of choice. Just make sure to have your environment setup with +the proper paths. Make sure the compiler target architecture matches the bitness of your Python runtime. +Perhaps the easiest way to do this is to run the build/install from a Visual Studio Command Prompt (a +shortcut installed with Visual Studio that sources the appropriate environment and presents a shell).

                      +
                      +
                      +

                      Manual Installation

                      +

                      You can always install the driver directly from a source checkout or tarball. +When installing manually, ensure the python dependencies are already +installed. You can find the list of dependencies in +requirements.txt.

                      +

                      Once the dependencies are installed, simply run:

                      +
                      python setup.py install
                      +
                      +
                      +
                      +
                      +

                      (Optional) Non-python Dependencies

                      +

                      The driver has several optional features that have non-Python dependencies.

                      +
                      +

                      C Extensions

                      +

                      By default, a number of extensions are compiled, providing faster hashing +for token-aware routing with the Murmur3Partitioner, +libev event loop integration, +and Cython optimized extensions.

                      +

                      When installing manually through setup.py, you can disable both with +the --no-extensions option, or selectively disable them with +with --no-murmur3, --no-libev, or --no-cython.

                      +

                      To compile the extensions, ensure that GCC and the Python headers are available.

                      +

                      On Ubuntu and Debian, this can be accomplished by running:

                      +
                      $ sudo apt-get install gcc python-dev
                      +
                      +
                      +

                      On RedHat and RedHat-based systems like CentOS and Fedora:

                      +
                      $ sudo yum install gcc python-devel
                      +
                      +
                      +

                      On OS X, homebrew installations of Python should provide the necessary headers.

                      +

                      See Windows Installation Notes for notes on configuring the build environment on Windows.

                      +
                      +

                      Cython-based Extensions

                      +

                      By default, this package uses Cython to optimize core modules and build custom extensions. +This is not a hard requirement, but is engaged by default to build extensions offering better performance than the +pure Python implementation.

                      +

                      This is a costly build phase, especially in clean environments where the Cython compiler must be built +This build phase can be avoided using the build switch, or an environment variable:

                      +
                      python setup.py install --no-cython
                      +
                      +
                      +

                      Alternatively, an environment variable can be used to switch this option regardless of +context:

                      +
                      CASS_DRIVER_NO_CYTHON=1 <your script here>
                      +- or, to disable all extensions:
                      +CASS_DRIVER_NO_EXTENSIONS=1 <your script here>
                      +
                      +
                      +

                      This method is required when using pip, which provides no other way of injecting user options in a single command:

                      +
                      CASS_DRIVER_NO_CYTHON=1 pip install scylla-driver
                      +CASS_DRIVER_NO_CYTHON=1 sudo -E pip install ~/python-driver
                      +
                      +
                      +

                      The environment variable is the preferred option because it spans all invocations of setup.py, and will +prevent Cython from being materialized as a setup requirement.

                      +

                      If your sudo configuration does not allow SETENV, you must push the option flag down via pip. However, pip +applies these options to all dependencies (which break on the custom flag). Therefore, you must first install +dependencies, then use install-option:

                      +
                      sudo pip install six futures
                      +sudo pip install --install-option="--no-cython"
                      +
                      +
                      +
                      +
                      +
                      +

                      libev support

                      +

                      The driver currently uses Python’s asyncore module for its default +event loop. For better performance, libev is also supported through +a C extension.

                      +

                      If you’re on Linux, you should be able to install libev +through a package manager. For example, on Debian/Ubuntu:

                      +
                      $ sudo apt-get install libev4 libev-dev
                      +
                      +
                      +

                      On RHEL/CentOS/Fedora:

                      +
                      $ sudo yum install libev libev-devel
                      +
                      +
                      +

                      If you’re on Mac OS X, you should be able to install libev +through Homebrew. For example, on Mac OS X:

                      +
                      $ brew install libev
                      +
                      +
                      +

                      The libev extension is not built for Windows (the build process is complex, and the Windows implementation uses +select anyway).

                      +

                      If successful, you should be able to build and install the extension +(just using setup.py build or setup.py install) and then use +the libev event loop by doing the following:

                      +
                      >>> from cassandra.io.libevreactor import LibevConnection
                      +>>> from cassandra.cluster import Cluster
                      +
                      +>>> cluster = Cluster()
                      +>>> cluster.connection_class = LibevConnection
                      +>>> session = cluster.connect()
                      +
                      +
                      +
                      +
                      +
                      +

                      (Optional) Configuring SSL

                      +

                      Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/lwt.html b/stable/lwt.html new file mode 100644 index 0000000000..2f651bcbeb --- /dev/null +++ b/stable/lwt.html @@ -0,0 +1,710 @@ + + + + + + + + + + + + + Lightweight Transactions (Compare-and-set) | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Lightweight Transactions (Compare-and-set)

                      +

                      Lightweight Transactions (LWTs) are mostly pass-through CQL for the driver. However, +the server returns some specialized results indicating the outcome and optional state +preceding the transaction.

                      +

                      For pertinent execution parameters, see Statement.serial_consistency_level.

                      +

                      This section discusses working with specialized result sets returned by the server for LWTs, +and how to work with them using the driver.

                      +
                      +

                      Specialized Results

                      +

                      The result returned from a LWT request is always a single row result. It will always have +prepended a special column named [applied]. How this value appears in your results depends +on the row factory in use. See below for examples.

                      +

                      The value of this [applied] column is boolean value indicating whether or not the transaction was applied. +If True, it is the only column in the result. If False, the additional columns depend on the LWT operation being +executed:

                      +
                        +
                      • When using a UPDATE ... IF "col" = ... clause, the result will contain the [applied] column, plus the existing columns +and values for any columns in the IF clause (and thus the value that caused the transaction to fail).

                      • +
                      • When using INSERT ... IF NOT EXISTS, the result will contain the [applied] column, plus all columns and values +of the existing row that rejected the transaction.

                      • +
                      • UPDATE .. IF EXISTS never has additional columns, regardless of [applied] status.

                      • +
                      +

                      How the [applied] column manifests depends on the row factory in use. Considering the following (initially empty) table:

                      +
                      CREATE TABLE test.t (
                      +    k int PRIMARY KEY,
                      +    v int,
                      +    x int
                      +)
                      +
                      +
                      +

                      … the following sections show the expected result for a number of example statements, using the three base row factories.

                      +
                      +

                      named_tuple_factory (default)

                      +

                      The name [applied] is not a valid Python identifier, so the square brackets are actually removed +from the attribute for the resulting namedtuple. The row always has a boolean column applied in position 0:

                      +
                      >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                      +Row(applied=True)
                      +
                      +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                      +Row(applied=False, k=0, v=0, x=None)
                      +
                      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                      +Row(applied=True)
                      +
                      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                      +Row(applied=False, v=1, x=2)
                      +
                      +
                      +
                      +
                      +

                      tuple_factory

                      +

                      This return type does not refer to names, but the boolean value applied is always present in position 0:

                      +
                      >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                      +(True,)
                      +
                      +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                      +(False, 0, 0, None)
                      +
                      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                      +(True,)
                      +
                      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                      +(False, 1, 2)
                      +
                      +
                      +
                      +
                      +

                      dict_factory

                      +

                      The retuned dict contains the [applied] key:

                      +
                      >>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                      +{u'[applied]': True}
                      +
                      +>>> session.execute("INSERT INTO t (k,v) VALUES (0,0) IF NOT EXISTS")
                      +{u'x': 2, u'[applied]': False, u'v': 1}
                      +
                      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0")
                      +{u'x': None, u'[applied]': False, u'k': 0, u'v': 0}
                      +
                      +>>> session.execute("UPDATE t SET v = 1, x = 2 WHERE k = 0 IF v =0 AND x = 1")
                      +{u'[applied]': True}
                      +
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/object-mapper.html b/stable/object-mapper.html new file mode 100644 index 0000000000..f4204e06ae --- /dev/null +++ b/stable/object-mapper.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Object Mapper | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Object Mapper

                      +

                      cqlengine is the Cassandra CQL 3 Object Mapper packaged with this driver

                      +

                      Jump to Getting Started

                      +
                      +

                      Contents

                      +
                      +
                      Upgrade Guide

                      For migrating projects from legacy cqlengine, to the integrated product

                      +
                      +
                      Models

                      Examples defining models, and mapping them to tables

                      +
                      +
                      Making Queries

                      Overview of query sets and filtering

                      +
                      +
                      Batch Queries

                      Working with batch mutations

                      +
                      +
                      Connections

                      Working with multiple sessions

                      +
                      +
                      API Documentation

                      Index of API documentation

                      +
                      +
                      Third party integrations

                      High-level examples in Celery and uWSGI

                      +
                      +
                      +

                      Frequently Asked Questions

                      +
                      +
                      +
                      +
                      +

                      Getting Started

                      +
                      import uuid
                      +from cassandra.cqlengine import columns
                      +from cassandra.cqlengine import connection
                      +from datetime import datetime
                      +from cassandra.cqlengine.management import sync_table
                      +from cassandra.cqlengine.models import Model
                      +
                      +#first, define a model
                      +class ExampleModel(Model):
                      +    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
                      +    example_type    = columns.Integer(index=True)
                      +    created_at      = columns.DateTime()
                      +    description     = columns.Text(required=False)
                      +
                      +#next, setup the connection to your cassandra server(s)...
                      +# see http://datastax.github.io/python-driver/api/cassandra/cluster.html for options
                      +# the list of hosts will be passed to create a Cluster() instance
                      +connection.setup(['127.0.0.1'], "cqlengine", protocol_version=3)
                      +
                      +#...and create your CQL table
                      +>>> sync_table(ExampleModel)
                      +
                      +#now we can create some rows:
                      +>>> em1 = ExampleModel.create(example_type=0, description="example1", created_at=datetime.now())
                      +>>> em2 = ExampleModel.create(example_type=0, description="example2", created_at=datetime.now())
                      +>>> em3 = ExampleModel.create(example_type=0, description="example3", created_at=datetime.now())
                      +>>> em4 = ExampleModel.create(example_type=0, description="example4", created_at=datetime.now())
                      +>>> em5 = ExampleModel.create(example_type=1, description="example5", created_at=datetime.now())
                      +>>> em6 = ExampleModel.create(example_type=1, description="example6", created_at=datetime.now())
                      +>>> em7 = ExampleModel.create(example_type=1, description="example7", created_at=datetime.now())
                      +>>> em8 = ExampleModel.create(example_type=1, description="example8", created_at=datetime.now())
                      +
                      +#and now we can run some queries against our table
                      +>>> ExampleModel.objects.count()
                      +8
                      +>>> q = ExampleModel.objects(example_type=1)
                      +>>> q.count()
                      +4
                      +>>> for instance in q:
                      +>>>     print instance.description
                      +example5
                      +example6
                      +example7
                      +example8
                      +
                      +#here we are applying additional filtering to an existing query
                      +#query objects are immutable, so calling filter returns a new
                      +#query object
                      +>>> q2 = q.filter(example_id=em5.example_id)
                      +
                      +>>> q2.count()
                      +1
                      +>>> for instance in q2:
                      +>>>     print instance.description
                      +example5
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/objects.inv b/stable/objects.inv new file mode 100644 index 0000000000..558d032065 Binary files /dev/null and b/stable/objects.inv differ diff --git a/stable/performance.html b/stable/performance.html new file mode 100644 index 0000000000..16edd09ca5 --- /dev/null +++ b/stable/performance.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Performance Notes | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Performance Notes

                      +

                      The Python driver for Cassandra offers several methods for executing queries. +You can synchronously block for queries to complete using +Session.execute(), you can obtain asynchronous request futures through +Session.execute_async(), and you can attach a callback to the future +with ResponseFuture.add_callback().

                      +

                      Examples of multiple request patterns can be found in the benchmark scripts included in the driver project.

                      +

                      The choice of execution pattern will depend on the application context. For applications dealing with multiple +requests in a given context, the recommended pattern is to use concurrent asynchronous +requests with callbacks. For many use cases, you don’t need to implement this pattern yourself. +cassandra.concurrent.execute_concurrent() and cassandra.concurrent.execute_concurrent_with_args() +provide this pattern with a synchronous API and tunable concurrency.

                      +

                      Due to the GIL and limited concurrency, the driver can become CPU-bound pretty quickly. The sections below +discuss further runtime and design considerations for mitigating this limitation.

                      +
                      +

                      PyPy

                      +

                      PyPy is an alternative Python runtime which uses a JIT compiler to +reduce CPU consumption. This leads to a huge improvement in the driver performance, +more than doubling throughput for many workloads.

                      +
                      +
                      +

                      Cython Extensions

                      +

                      Cython is an optimizing compiler and language that can be used to compile the core files and +optional extensions for the driver. Cython is not a strict dependency, but the extensions will be built by default.

                      +

                      See Installation for details on controlling this build.

                      +
                      +
                      +

                      multiprocessing

                      +

                      All of the patterns discussed above may be used over multiple processes using the +multiprocessing +module. Multiple processes will scale better than multiple threads, so if high throughput is your goal, +consider this option.

                      +

                      Be sure to never share any Cluster, Session, +or ResponseFuture objects across multiple processes. These +objects should all be created after forking the process, not before.

                      +

                      For further discussion and simple examples using the driver with multiprocessing, +see this blog post.

                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/py-modindex.html b/stable/py-modindex.html new file mode 100644 index 0000000000..6d91edd71e --- /dev/null +++ b/stable/py-modindex.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + Python Module Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + + + +
                      + + + + + +
                      + + +
                      +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/query-paging.html b/stable/query-paging.html new file mode 100644 index 0000000000..28d6307a85 --- /dev/null +++ b/stable/query-paging.html @@ -0,0 +1,715 @@ + + + + + + + + + + + + + Paging Large Queries | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Paging Large Queries

                      +

                      Cassandra 2.0+ offers support for automatic query paging. Starting with +version 2.0 of the driver, if protocol_version is greater than +2 (it is by default), queries returning large result sets will be +automatically paged.

                      +
                      +

                      Controlling the Page Size

                      +

                      By default, Session.default_fetch_size controls how many rows will +be fetched per page. This can be overridden per-query by setting +fetch_size on a Statement. By default, each page +will contain at most 5000 rows.

                      +
                      +
                      +

                      Handling Paged Results

                      +

                      Whenever the number of result rows for are query exceed the page size, an +instance of PagedResult will be returned instead of a normal +list. This class implements the iterator interface, so you can treat +it like a normal iterator over rows:

                      +
                      from cassandra.query import SimpleStatement
                      +query = "SELECT * FROM users"  # users contains 100 rows
                      +statement = SimpleStatement(query, fetch_size=10)
                      +for user_row in session.execute(statement):
                      +    process_user(user_row)
                      +
                      +
                      +

                      Whenever there are no more rows in the current page, the next page will +be fetched transparently. However, note that it is possible for +an Exception to be raised while fetching the next page, just +like you might see on a normal call to session.execute().

                      +

                      If you use Session.execute_async() along with, +ResponseFuture.result(), the first page will be fetched before +result() returns, but latter pages will be +transparently fetched synchronously while iterating the result.

                      +
                      +
                      +

                      Handling Paged Results with Callbacks

                      +

                      If callbacks are attached to a query that returns a paged result, +the callback will be called once per page with a normal list of rows.

                      +

                      Use ResponseFuture.has_more_pages and +ResponseFuture.start_fetching_next_page() to continue fetching +pages. For example:

                      +
                      class PagedResultHandler(object):
                      +
                      +    def __init__(self, future):
                      +        self.error = None
                      +        self.finished_event = Event()
                      +        self.future = future
                      +        self.future.add_callbacks(
                      +            callback=self.handle_page,
                      +            errback=self.handle_err)
                      +
                      +    def handle_page(self, rows):
                      +        for row in rows:
                      +            process_row(row)
                      +
                      +        if self.future.has_more_pages:
                      +            self.future.start_fetching_next_page()
                      +        else:
                      +            self.finished_event.set()
                      +
                      +    def handle_error(self, exc):
                      +        self.error = exc
                      +        self.finished_event.set()
                      +
                      +future = session.execute_async("SELECT * FROM users")
                      +handler = PagedResultHandler(future)
                      +handler.finished_event.wait()
                      +if handler.error:
                      +    raise handler.error
                      +
                      +
                      +
                      +
                      +

                      Resume Paged Results

                      +

                      You can resume the pagination when executing a new query by using the ResultSet.paging_state. This can be useful if you want to provide some stateless pagination capabilities to your application (ie. via http). For example:

                      +
                      from cassandra.query import SimpleStatement
                      +query = "SELECT * FROM users"
                      +statement = SimpleStatement(query, fetch_size=10)
                      +results = session.execute(statement)
                      +
                      +# save the paging_state somewhere and return current results
                      +web_session['paging_state'] = results.paging_state
                      +
                      +
                      +# resume the pagination sometime later...
                      +statement = SimpleStatement(query, fetch_size=10)
                      +ps = web_session['paging_state']
                      +results = session.execute(statement, paging_state=ps)
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/scylla-cloud-serverless.html b/stable/scylla-cloud-serverless.html new file mode 100644 index 0000000000..5bc91db174 --- /dev/null +++ b/stable/scylla-cloud-serverless.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + ScyllaDB Cloud Serverless | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      ScyllaDB Cloud Serverless

                      +

                      With ScyllaDB Cloud, you can deploy serverless databases. +The Python driver allows you to connect to a serverless database by utilizing the connection bundle you can download via the Connect>Python tab in the Cloud application. +The connection bundle is a YAML file with connection and credential information for your cluster.

                      +

                      Connecting to a ScyllaDB Cloud serverless database is very similar to a standard connection to a ScyllaDB database.

                      +

                      Here’s a short program that connects to a ScyllaDB Cloud serverless database and prints metadata about the cluster:

                      +
                      from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
                      +from cassandra.policies import DCAwareRoundRobinPolicy, TokenAwarePolicy
                      +
                      +PATH_TO_BUNDLE_YAML = '/file/downloaded/from/cloud/connect-bundle.yaml'
                      +
                      +
                      +def get_cluster():
                      +    profile = ExecutionProfile(
                      +        load_balancing_policy=TokenAwarePolicy(
                      +            DCAwareRoundRobinPolicy(local_dc='us-east-1')
                      +        )
                      +    )
                      +
                      +    return Cluster(
                      +        execution_profiles={EXEC_PROFILE_DEFAULT: profile},
                      +        scylla_cloud=PATH_TO_BUNDLE_YAML,
                      +    )
                      +
                      +
                      +print('Connecting to cluster')
                      +cluster = get_cluster()
                      +session = cluster.connect()
                      +
                      +print('Connected to cluster', cluster.metadata.cluster_name)
                      +
                      +print('Getting metadata')
                      +for host in cluster.metadata.all_hosts():
                      +    print('Datacenter: {}; Host: {}; Rack: {}'.format(
                      +        host.datacenter, host.address, host.rack)
                      +    )
                      +
                      +cluster.shutdown()
                      +
                      +
                      +

                      By providing the scylla_cloud parameter to the Cluster constructor, +the driver can set up the connection based on the endpoint and credential information +stored in your downloaded ScyllaDB Cloud Serverless connection bundle.

                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/scylla-cloud.html b/stable/scylla-cloud.html new file mode 100644 index 0000000000..3047b0135d --- /dev/null +++ b/stable/scylla-cloud.html @@ -0,0 +1,613 @@ + + + + + + + + + + + + + ScyllaDB Cloud | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      ScyllaDB Cloud

                      +

                      To connect to a ScyllaDB Cloud cluster, go to the Cluster Connect page, Python example. +For best performance, make sure to use the Scylla Driver.

                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/scylla-specific.html b/stable/scylla-specific.html new file mode 100644 index 0000000000..e093bee407 --- /dev/null +++ b/stable/scylla-specific.html @@ -0,0 +1,725 @@ + + + + + + + + + + + + + Scylla Specific Features | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Scylla Specific Features

                      +
                      +

                      Shard Awareness

                      +

                      scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard’s token. +As a result, latency is significantly reduced because there is no need to pass data between the shards.

                      +

                      Details on the scylla cql protocol extensions +https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding

                      +

                      For using it you only need to enable TokenAwarePolicy on the Cluster

                      +

                      See the configuration of native_shard_aware_transport_port and native_shard_aware_transport_port_ssl on scylla.yaml: +https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
                      +
                      +cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))
                      +
                      +
                      +
                      +
                      +

                      New Cluster Helpers

                      +
                        +
                      • shard_aware_options

                        +

                        Setting it to dict(disable=True) would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connections

                        +

                        Other option is to configure scylla by setting enable_shard_aware_drivers: false on scylla.yaml.

                        +
                      • +
                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster(shard_aware_options=dict(disable=True))
                      +session = cluster.connect()
                      +
                      +assert not cluster.is_shard_aware(), "Shard aware should be disabled"
                      +
                      +# or just disable the shard aware port logic
                      +cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True))
                      +session = cluster.connect()
                      +
                      +
                      +
                        +
                      • cluster.is_shard_aware()

                        +

                        New method available on Cluster allowing to check whether the remote cluster supports shard awareness (bool)

                        +
                      • +
                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster()
                      +session = cluster.connect()
                      +
                      +if cluster.is_shard_aware():
                      +    print("connected to a scylla cluster")
                      +
                      +
                      +
                        +
                      • cluster.shard_aware_stats()

                        +

                        New method available on Cluster allowing to check the status of shard aware connections to all available hosts (dict)

                        +
                      • +
                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster()
                      +session = cluster.connect()
                      +
                      +stats = cluster.shard_aware_stats()
                      +if all([v["shards_count"] == v["connected"] for v in stats.values()]):
                      +    print("successfully connected to all shards of all scylla nodes")
                      +
                      +
                      +
                      +
                      +

                      New Error Types

                      +
                        +
                      • SCYLLA_RATE_LIMIT_ERROR Error

                        +

                        The ScyllaDB 5.1 introduced a feature called per-partition rate limiting. In case the (user defined) per-partition rate limit is exceeded, the database will start returning a Scylla-specific type of error: RateLimitReached.

                        +
                      • +
                      +
                      from cassandra import RateLimitReached
                      +from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster()
                      +session = cluster.connect()
                      +session.execute("""
                      +    CREATE KEYSPACE IF NOT EXISTS keyspace1
                      +    WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}
                      +""")
                      +
                      +session.execute("USE keyspace1")
                      +session.execute("""
                      +    CREATE TABLE tbl (pk int PRIMARY KEY, v int)
                      +    WITH per_partition_rate_limit = {'max_writes_per_second': 1}
                      +""")
                      +
                      +prepared = session.prepare("""
                      +    INSERT INTO tbl (pk, v) VALUES (?, ?)
                      +""")
                      +
                      +try:
                      +    for _ in range(1000):
                      +        self.session.execute(prepared.bind((123, 456)))
                      +except RateLimitReached:
                      +    raise
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/search.html b/stable/search.html new file mode 100644 index 0000000000..8b35c41f1e --- /dev/null +++ b/stable/search.html @@ -0,0 +1,595 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + + + + + +
                      + + + + + +
                      + + +
                      +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/searchindex.js b/stable/searchindex.js new file mode 100644 index 0000000000..134e312fe4 --- /dev/null +++ b/stable/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["CHANGELOG", "api/cassandra", "api/cassandra/auth", "api/cassandra/cluster", "api/cassandra/concurrent", "api/cassandra/connection", "api/cassandra/cqlengine/columns", "api/cassandra/cqlengine/connection", "api/cassandra/cqlengine/management", "api/cassandra/cqlengine/models", "api/cassandra/cqlengine/query", "api/cassandra/cqlengine/usertype", "api/cassandra/datastax/graph/fluent/index", "api/cassandra/datastax/graph/fluent/predicates", "api/cassandra/datastax/graph/fluent/query", "api/cassandra/datastax/graph/index", "api/cassandra/decoder", "api/cassandra/encoder", "api/cassandra/graph", "api/cassandra/io/asyncioreactor", "api/cassandra/io/asyncorereactor", "api/cassandra/io/eventletreactor", "api/cassandra/io/geventreactor", "api/cassandra/io/libevreactor", "api/cassandra/io/twistedreactor", "api/cassandra/metadata", "api/cassandra/metrics", "api/cassandra/policies", "api/cassandra/pool", "api/cassandra/protocol", "api/cassandra/query", "api/cassandra/timestamps", "api/cassandra/util", "api/index", "cqlengine/batches", "cqlengine/connections", "cqlengine/faq", "cqlengine/models", "cqlengine/queryset", "cqlengine/third-party", "cqlengine/upgrade-guide", "dates-and-times", "execution-profiles", "faq", "getting-started", "index", "installation", "lwt", "object-mapper", "performance", "query-paging", "scylla-cloud", "scylla-cloud-serverless", "scylla-specific", "security", "upgrading", "user-defined-types"], "filenames": ["CHANGELOG.rst", "api/cassandra.rst", "api/cassandra/auth.rst", "api/cassandra/cluster.rst", "api/cassandra/concurrent.rst", "api/cassandra/connection.rst", "api/cassandra/cqlengine/columns.rst", "api/cassandra/cqlengine/connection.rst", "api/cassandra/cqlengine/management.rst", "api/cassandra/cqlengine/models.rst", "api/cassandra/cqlengine/query.rst", "api/cassandra/cqlengine/usertype.rst", "api/cassandra/datastax/graph/fluent/index.rst", "api/cassandra/datastax/graph/fluent/predicates.rst", "api/cassandra/datastax/graph/fluent/query.rst", "api/cassandra/datastax/graph/index.rst", "api/cassandra/decoder.rst", "api/cassandra/encoder.rst", "api/cassandra/graph.rst", "api/cassandra/io/asyncioreactor.rst", "api/cassandra/io/asyncorereactor.rst", "api/cassandra/io/eventletreactor.rst", "api/cassandra/io/geventreactor.rst", "api/cassandra/io/libevreactor.rst", "api/cassandra/io/twistedreactor.rst", "api/cassandra/metadata.rst", "api/cassandra/metrics.rst", "api/cassandra/policies.rst", "api/cassandra/pool.rst", "api/cassandra/protocol.rst", "api/cassandra/query.rst", "api/cassandra/timestamps.rst", "api/cassandra/util.rst", "api/index.rst", "cqlengine/batches.rst", "cqlengine/connections.rst", "cqlengine/faq.rst", "cqlengine/models.rst", "cqlengine/queryset.rst", "cqlengine/third-party.rst", "cqlengine/upgrade-guide.rst", "dates-and-times.rst", "execution-profiles.rst", "faq.rst", "getting-started.rst", "index.rst", "installation.rst", "lwt.rst", "object-mapper.rst", "performance.rst", "query-paging.rst", "scylla-cloud.rst", "scylla-cloud-serverless.rst", "scylla-specific.rst", "security.rst", "upgrading.rst", "user-defined-types.rst"], "titles": ["CHANGELOG", "cassandra - Exceptions and Enums", "cassandra.auth - Authentication", "cassandra.cluster - Clusters and Sessions", "cassandra.concurrent - Utilities for Concurrent Statement Execution", "cassandra.connection - Low Level Connection Info", "cassandra.cqlengine.columns - Column types for object mapping models", "cassandra.cqlengine.connection - Connection management for cqlengine", "cassandra.cqlengine.management - Schema management for cqlengine", "cassandra.cqlengine.models - Table models for object mapping", "cassandra.cqlengine.query - Query and filter model objects", "cassandra.cqlengine.usertype - Model classes for User Defined Types", "cassandra.datastax.graph.fluent", "cassandra.datastax.graph.fluent.predicates", "cassandra.datastax.graph.fluent.query", "cassandra.datastax.graph - Graph Statements, Options, and Row Factories", "cassandra.decoder - Data Return Formats", "cassandra.encoder - Encoders for non-prepared Statements", "cassandra.graph - Graph Statements, Options, and Row Factories", "cassandra.io.asyncioreactor - asyncio Event Loop", "cassandra.io.asyncorereactor - asyncore Event Loop", "cassandra.io.eventletreactor - eventlet-compatible Connection", "cassandra.io.geventreactor - gevent-compatible Event Loop", "cassandra.io.libevreactor - libev Event Loop", "cassandra.io.twistedreactor - Twisted Event Loop", "cassandra.metadata - Schema and Ring Topology", "cassandra.metrics - Performance Metrics", "cassandra.policies - Load balancing and Failure Handling Policies", "cassandra.pool - Hosts and Connection Pools", "cassandra.protocol - Protocol Features", "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories", "cassandra.timestamps - Timestamp Generation", "cassandra.util - Utilities", "API Documentation", "Batch Queries", "Connections", "Frequently Asked Questions", "Models", "Making Queries", "Third party integrations", "Upgrade Guide", "Working with Dates and Times", "Execution Profiles", "Frequently Asked Questions", "Getting Started", "Python Driver for Scylla and Apache Cassandra\u00ae", "Installation", "Lightweight Transactions (Compare-and-set)", "Object Mapper", "Performance Notes", "Paging Large Queries", "ScyllaDB Cloud", "ScyllaDB Cloud Serverless", "Scylla Specific Features", "Security", "Upgrading", "User Defined Types"], "terms": {"march": 0, "2023": 0, "add": [0, 3, 7, 8, 10, 14, 27, 30, 34, 55, 56], "support": [0, 1, 2, 3, 8, 9, 10, 12, 27, 32, 34, 36, 38, 41, 44, 45, 50, 53, 54, 55, 56], "execut": [0, 1, 3, 8, 9, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 37, 38, 43, 45, 47, 49, 50, 53, 56], "profil": [0, 3, 4, 12, 14, 45, 52], "execute_concurr": [0, 4, 33, 49], "pr": 0, "1122": 0, "handl": [0, 2, 3, 9, 10, 12, 29, 33, 38, 39, 41, 43, 44, 46], "empti": [0, 2, 3, 25, 47], "non": [0, 3, 6, 10, 32, 33, 37, 44, 45], "result": [0, 3, 4, 9, 10, 12, 15, 18, 25, 26, 27, 29, 30, 32, 33, 37, 38, 41, 43, 44, 45, 53, 56], "page": [0, 1, 3, 45, 51], "1110": 0, "do": [0, 3, 4, 6, 9, 17, 27, 30, 37, 38, 41, 44, 46, 54, 55, 56], "re": [0, 27, 30, 37, 38, 39, 44, 46, 54, 56], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 53, 54], "stream": [0, 29], "id": [0, 3, 4, 6, 9, 10, 15, 18, 29, 34, 36, 37, 38, 44, 54, 56], "flight": [0, 5], "request": [0, 1, 3, 4, 26, 27, 38, 39, 42, 44, 45, 47, 49, 54, 55], "1114": 0, "asyncor": [0, 33, 46], "race": 0, "condit": [0, 1, 3, 8, 10, 30, 45], "caus": [0, 3, 10, 26, 37, 47], "log": [0, 3, 8, 27, 30, 31, 44, 45, 55], "except": [0, 3, 4, 5, 6, 7, 9, 10, 15, 18, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 44, 50, 53, 54], "shutdown": [0, 3, 39, 52], "python": [0, 15, 17, 18, 19, 20, 29, 30, 32, 37, 40, 41, 44, 47, 48, 49, 51, 52, 54, 55, 56], "1266": 0, "warn": [0, 1, 3, 31, 40, 55], "queri": [0, 1, 3, 4, 6, 9, 12, 15, 16, 18, 25, 27, 29, 32, 33, 35, 37, 40, 41, 42, 45, 46, 48, 49, 56], "trace": [0, 3, 33], "1103": 0, "remov": [0, 3, 6, 8, 10, 27, 30, 32, 42, 47], "mutabl": [0, 3], "default": [0, 1, 3, 6, 7, 9, 10, 11, 12, 14, 15, 17, 18, 26, 27, 29, 30, 31, 34, 43, 44, 46, 48, 49, 50, 54], "valu": [0, 2, 3, 4, 6, 9, 10, 11, 13, 15, 17, 18, 25, 27, 29, 30, 31, 32, 34, 37, 40, 41, 44, 47, 53, 54, 55, 56], "some": [0, 1, 9, 15, 18, 27, 34, 37, 38, 41, 44, 45, 46, 47, 48, 50, 54, 55, 56], "test": [0, 10, 21, 22, 27, 31, 35, 46, 47], "1116": 0, "depend": [0, 2, 41, 43, 47, 49], "unittest2": 0, "1289": 0, "asyncio": [0, 33], "coroutin": 0, "annot": 0, "asyncioreactor": [0, 33], "pytthon": 0, "1290": 0, "typo": 0, "sourc": [0, 3, 15, 18, 45, 46], "file": [0, 40, 49, 52, 54], "1126": 0, "hostfilterpolicyinittest": 0, "1131": 0, "dontprepareonignoredhoststest": 0, "1287": 0, "integr": [0, 29, 40, 41, 45, 46, 48, 55], "simulacron": 0, "test_connect": 0, "failur": [0, 1, 7, 9, 26, 33, 34], "1304": 0, "standard": [0, 19, 20, 26, 38, 39, 41, 44, 46, 52, 54, 55], "test_single_interfac": 0, "py": [0, 46], "appear": [0, 47], "fail": [0, 1, 3, 4, 7, 14, 15, 18, 26, 33, 34, 37, 44, 47], "c": [0, 6, 12, 25, 27, 38, 54], "1329": 0, "authent": [0, 1, 3, 33], "fraudul": 0, "1328": 0, "preparedstatementtest": 0, "test_fail_if_different_query_id_on_reprepar": 0, "unexpectedli": 0, "ptyhon": 0, "1327": 0, "refactor": [0, 41], "unittest": 0, "alias": 0, "compat": [0, 3, 18, 25, 33, 55], "1112": 0, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56], "releas": [0, 9, 27, 40, 42, 54, 55], "well": [0, 27, 35, 44, 54], "2021": 0, "ensur": [0, 3, 4, 9, 27, 39, 46, 54], "driver": [0, 1, 3, 5, 7, 10, 18, 26, 27, 28, 29, 30, 37, 38, 40, 41, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "can": [0, 1, 3, 4, 6, 8, 9, 10, 13, 14, 15, 17, 18, 21, 25, 27, 29, 30, 31, 32, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53, 54, 55, 56], "connect": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 19, 20, 22, 23, 24, 26, 27, 30, 33, 37, 38, 39, 40, 42, 45, 46, 48, 51, 52, 53, 54, 55, 56], "when": [0, 1, 2, 3, 4, 5, 7, 9, 10, 17, 21, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 40, 41, 42, 44, 46, 47, 50, 54, 55, 56], "invalid": [0, 1, 26, 30], "peer": [0, 5, 25], "host": [0, 1, 2, 3, 4, 7, 25, 33, 35, 43, 48, 52, 53, 54, 55], "ar": [0, 1, 3, 4, 6, 7, 8, 9, 10, 15, 18, 21, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 54], "system": [0, 5, 25, 38, 42, 43, 44, 46, 55], "1260": 0, "implement": [0, 2, 3, 5, 15, 18, 19, 20, 21, 22, 23, 24, 27, 29, 32, 41, 46, 49, 50, 54, 55], "protocol": [0, 1, 3, 5, 6, 12, 14, 30, 33, 37, 45, 53], "v5": [0, 1], "checksum": 0, "1258": 0, "cqlengin": [0, 33, 34, 35, 36, 37, 38, 39, 43, 45, 48, 55], "mechan": [0, 2, 3, 27, 54], "work": [0, 2, 7, 17, 27, 30, 32, 37, 38, 44, 45, 47, 48, 53, 54, 56], "astra": 0, "1265": 0, "updat": [0, 1, 3, 8, 9, 10, 30, 32, 34, 38, 40, 42, 44, 45, 47], "list": [0, 1, 3, 4, 6, 7, 8, 9, 10, 13, 15, 17, 18, 25, 27, 29, 30, 32, 35, 43, 44, 45, 46, 48, 50, 55], "reserv": 0, "keyword": [0, 3, 6, 7, 9, 10], "1269": 0, "drop": [0, 6, 8, 29], "1220": 0, "secur": [0, 45, 55], "document": [0, 6, 27, 32, 41, 42, 45, 46, 48, 54, 55], "exampl": [0, 2, 3, 4, 6, 9, 10, 11, 25, 30, 32, 35, 36, 38, 40, 42, 43, 44, 46, 47, 48, 49, 50, 51, 53, 55, 56], "protocol_tl": [0, 54], "1264": 0, "june": 0, "2020": 0, "make": [0, 1, 3, 10, 25, 27, 37, 40, 41, 42, 43, 44, 45, 46, 48, 51, 54, 55], "geomet": 0, "an": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 44, 45, 46, 48, 49, 50, 54, 55, 56], "option": [0, 1, 2, 3, 5, 7, 9, 10, 11, 12, 14, 25, 29, 30, 33, 38, 40, 42, 44, 47, 48, 49, 53, 54, 55, 56], "runtim": [0, 46, 49], "1237": 0, "use_default_tempdir": 0, "cloud": [0, 3, 27, 45], "config": [0, 54], "1245": 0, "tcp": 0, "flow": 0, "control": [0, 3, 4, 27, 30, 40, 49, 54], "libevreactor": [0, 3, 33, 46], "1248": 0, "unabl": [0, 27, 46], "cluster": [0, 2, 4, 5, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 25, 26, 27, 29, 30, 33, 35, 37, 38, 39, 43, 46, 48, 49, 51, 52, 54, 56], "ubuntu": [0, 46], "04": 0, "1238": 0, "plaintextauthprovid": [0, 2, 3, 33, 54, 55], "unicod": [0, 17, 44], "char": 0, "python3": 0, "1241": 0, "graph": [0, 3], "consist": [0, 1, 3, 7, 10, 27, 30, 32], "level": [0, 1, 3, 4, 10, 15, 18, 27, 30, 33, 41, 48, 54], "set": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 18, 19, 20, 21, 22, 25, 26, 27, 30, 32, 35, 37, 38, 42, 43, 45, 46, 48, 50, 52, 53, 54, 55], "local_quorum": [0, 1, 44], "1240": 0, "t": [0, 9, 10, 15, 31, 37, 38, 41, 43, 44, 47, 49, 54, 55, 56], "write": [0, 1, 8, 10, 15, 18, 26, 27, 30], "data": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 41, 43, 44, 53, 55, 56], "boolean": [0, 1, 6, 25, 27, 44, 47], "field": [0, 3, 6, 8, 9, 10, 11, 30, 32, 37, 38, 44, 56], "fluent": [0, 33, 46, 55], "api": [0, 32, 37, 41, 42, 45, 46, 48, 49, 54], "1239": 0, "elementmap": 0, "deseri": [0, 15, 18, 33, 41], "1233": 0, "bump": 0, "version": [0, 1, 2, 3, 6, 25, 29, 30, 31, 32, 33, 37, 40, 44, 45, 46, 50, 55, 56], "1243": 0, "gremlinpython": [0, 46], "1212": 0, "improv": [0, 1, 35, 49, 55], "core": [0, 3, 4, 38, 40, 46, 49], "1244": 0, "april": 0, "transient": 0, "replic": [0, 3, 8, 25, 40, 53], "1207": 0, "peers_v2": 0, "port": [0, 3, 5, 25, 44, 53], "discoveri": 0, "700": 0, "1228": 0, "februari": 0, "all": [0, 1, 3, 4, 6, 8, 9, 10, 17, 21, 22, 25, 26, 27, 28, 29, 30, 35, 41, 44, 46, 47, 49, 53, 54, 55], "function": [0, 1, 3, 8, 10, 12, 17, 25, 27, 29, 32, 41, 44, 53, 54, 55], "resultset": [0, 3, 33, 50, 55], "1203": 0, "pars": [0, 15, 18, 29, 32, 43, 44], "new": [0, 1, 2, 3, 4, 6, 7, 10, 21, 25, 27, 30, 31, 32, 34, 36, 38, 39, 40, 42, 44, 48, 50, 54, 55, 56], "schema": [0, 3, 9, 30, 33, 37, 44, 55], "metadata": [0, 3, 15, 18, 27, 30, 33, 42, 43, 52], "ngdg": 0, "gener": [0, 1, 2, 4, 27, 29, 32, 33, 41, 44, 53, 54, 55], "tabl": [0, 1, 3, 6, 8, 25, 30, 32, 33, 37, 44, 47, 48, 53, 55, 56], "edg": [0, 15, 18, 25, 33], "cql": [0, 1, 6, 9, 10, 11, 13, 15, 17, 18, 25, 30, 32, 36, 37, 38, 40, 41, 47, 48, 53, 55, 56], "syntax": [0, 10, 34, 38], "996": 0, "graphson3": [0, 12, 15, 18], "788": 0, "nativ": [0, 1, 15, 18, 29, 37, 45], "1004": 0, "tupl": [0, 1, 3, 4, 9, 12, 17, 25, 27, 30, 38, 44, 55, 56], "udt": [0, 3, 12, 18, 37, 45], "type": [0, 1, 3, 8, 10, 15, 17, 18, 25, 27, 29, 30, 32, 33, 34, 38, 41, 45, 47], "1005": 0, "durat": [0, 30, 32, 33], "1000": [0, 4, 53], "gx": 0, "bytebuff": 0, "graphson": [0, 12, 14, 15, 18], "blob": [0, 6, 17, 44, 53], "1027": 0, "enabl": [0, 3, 10, 44, 53, 54, 55], "through": [0, 2, 3, 5, 7, 9, 10, 15, 18, 26, 27, 30, 38, 44, 45, 47, 49, 55, 56], "dse": [0, 1, 3, 6, 12, 14, 15, 18, 32], "gremlin": [0, 3, 12, 14, 15, 18, 46], "travers": [0, 12, 14, 15, 18, 46], "1045": 0, "provid": [0, 3, 12, 13, 15, 18, 27, 41, 42, 43, 46, 49, 50, 52, 54, 55], "numer": [0, 41], "wrapper": [0, 27, 30], "proper": [0, 39, 46], "definit": [0, 3, 6, 15, 29, 38, 40], "1051": 0, "resolv": [0, 3, 5, 27, 36, 54], "row_factori": [0, 3, 7, 29, 30, 42, 44], "automat": [0, 1, 3, 35, 37, 38, 44, 46, 50], "1056": 0, "g": [0, 3, 12, 15, 18, 27, 30], "traversalmetr": 0, "metric": [0, 3, 33], "1057": 0, "bulkset": 0, "1060": 0, "engin": [0, 3], "name": [0, 1, 3, 7, 8, 9, 10, 11, 12, 13, 15, 18, 25, 26, 27, 29, 30, 34, 37, 40, 44, 47, 56], "wai": [0, 3, 6, 15, 18, 27, 30, 36, 38, 41, 42, 44, 45, 46, 54, 55], "creat": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 25, 27, 30, 32, 34, 35, 36, 37, 38, 41, 43, 44, 47, 48, 49, 53, 54, 55, 56], "classic": 0, "1090": 0, "1039": 0, "expos": [0, 31, 55], "filter": [0, 6, 9, 27, 33, 35, 48], "predic": [0, 27, 33], "collect": [0, 3, 8, 10, 15, 25, 26, 30, 32, 38, 45, 55], "1019": 0, "more": [0, 3, 4, 6, 9, 10, 15, 25, 27, 29, 31, 38, 40, 42, 44, 45, 49, 50, 54, 55], "robust": [0, 41], "1204": 0, "sure": [0, 3, 27, 37, 43, 44, 46, 49, 51, 54], "onli": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 27, 30, 31, 34, 37, 38, 40, 41, 44, 45, 46, 47, 53, 54, 55], "native_transport_address": 0, "column": [0, 8, 9, 10, 11, 13, 17, 25, 30, 33, 35, 36, 37, 38, 44, 47, 48, 55, 56], "1205": 0, "januari": 0, "unifi": 0, "singl": [0, 3, 4, 6, 8, 9, 10, 14, 25, 27, 28, 30, 32, 37, 38, 40, 42, 44, 46, 47, 55], "packag": [0, 2, 32, 41, 46, 48, 54, 55], "1130": 0, "1189": 0, "allow": [0, 3, 6, 9, 10, 12, 13, 27, 29, 30, 31, 32, 34, 36, 37, 46, 52, 53, 54, 55, 56], "pass": [0, 2, 3, 4, 6, 7, 9, 10, 25, 29, 30, 34, 36, 37, 38, 39, 47, 48, 53, 54, 55, 56], "ssl": [0, 5, 44], "context": [0, 3, 8, 9, 10, 12, 15, 18, 34, 39, 46, 49, 54], "twist": [0, 33, 44], "1161": 0, "eventlet": [0, 33], "1162": 0, "1163": 0, "additional_write_polici": 0, "read_repair": 0, "1048": 0, "flexibl": [0, 45], "1174": 0, "null": [0, 10, 17, 36, 38, 44], "1123": 0, "abil": [0, 27, 42, 55], "asynchron": [0, 3, 30, 43, 49], "1129": 0, "prepar": [0, 3, 4, 27, 33, 41, 43, 53, 54, 56], "mismatch": 0, "reprepar": 0, "fly": [0, 4, 9, 10, 35], "1124": 0, "rais": [0, 1, 2, 3, 4, 5, 6, 9, 10, 15, 18, 27, 30, 32, 34, 37, 38, 40, 44, 50, 53, 55], "cqlengineexcept": [0, 40], "1166": 0, "messag": [0, 1, 2, 3, 5, 29], "chunk": 0, "process": [0, 3, 4, 20, 43, 44, 46, 49, 53, 54, 55], "discontinu": 0, "1185": 0, "reconnect": [0, 33], "attempt": [0, 1, 3, 4, 5, 27, 34, 41, 43, 44, 55], "persist": [0, 15, 18, 27, 41], "after": [0, 3, 4, 10, 20, 27, 30, 34, 37, 38, 40, 43, 44, 46, 49], "down": [0, 3, 33, 46], "node": [0, 1, 3, 5, 25, 26, 28, 30, 32, 33, 44, 53, 54], "1181": 0, "valid": [0, 1, 3, 6, 9, 10, 15, 18, 25, 27, 32, 47, 54], "certif": [0, 54], "hostnam": [0, 27, 54], "sslcontext": [0, 54], "check_hostnam": [0, 54], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 56], "1186": 0, "responsefutur": [0, 3, 29, 33, 43, 44, 49, 50, 55], "_set_result": 0, "crash": 0, "error": [0, 1, 3, 4, 5, 6, 10, 27, 44, 50], "preparemessag": 0, "1187": 0, "insight": 0, "serial": [0, 1, 3, 12, 15, 18, 30, 41], "startup": 0, "pyopenssl": [0, 54], "1192": 0, "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 12, 13, 14, 15, 17, 18, 25, 26, 27, 28, 29, 30, 32, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 52, 53, 54, 55, 56], "ha": [0, 3, 5, 10, 26, 27, 30, 38, 40, 41, 44, 46, 47, 54, 55, 56], "It": [0, 3, 9, 21, 22, 27, 32, 35, 37, 38, 43, 44, 46, 47, 54], "come": 0, "unif": 0, "geo": [0, 13], "read_repair_ch": 0, "1140": 0, "avoid": [0, 3, 27, 40, 43, 46], "about": [0, 3, 25, 30, 37, 41, 44, 46, 52, 54, 55], "unspecifi": [0, 9], "load": [0, 3, 9, 10, 15, 18, 33, 37, 38, 40, 42, 53, 54, 55], "balanc": [0, 3, 33, 42, 55], "polici": [0, 3, 33, 42, 43, 44, 52, 53, 55], "1177": 0, "publish": [0, 46, 54], "binari": [0, 6, 30], "wheel": [0, 46], "distribut": [0, 27, 38, 46], "1013": 0, "dseloadbalancingpolici": [0, 27, 55], "next": [0, 3, 21, 27, 42, 48, 50, 54], "major": [0, 27, 42, 54], "consid": [0, 1, 3, 18, 27, 44, 47, 49, 54, 55], "defaultloadbalancingpolici": [0, 27, 55], "1047": 0, "should": [0, 2, 3, 4, 6, 7, 8, 9, 10, 15, 18, 19, 20, 21, 22, 25, 27, 30, 31, 37, 40, 42, 44, 46, 49, 53, 54, 55], "preserv": [0, 6, 9, 30, 40], "graph_sourc": [0, 3, 15, 18], "graph_opt": [0, 3], "overridden": [0, 3, 50], "1021": 0, "nodesync": 0, "799": 0, "934": 0, "determinist": 0, "monoton": 0, "claus": [0, 10, 25, 37, 47, 55], "aggreg": [0, 1, 3, 25], "955": 0, "graphopt": [0, 15, 18, 33], "show": [0, 8, 32, 36, 38, 40, 42, 47, 54], "unknown": [0, 15, 18, 46, 55], "paramet": [0, 3, 4, 6, 7, 8, 9, 10, 12, 14, 15, 18, 27, 29, 30, 31, 32, 37, 40, 47, 52, 54, 56], "819": 0, "contin": 0, "backpressur": 0, "798": 0, "graphson2": [0, 15, 18], "775": 0, "payload": [0, 1, 3, 30, 33], "format": [0, 1, 3, 17, 25, 29, 30, 33, 41, 44, 52, 54, 56], "773": 0, "authprovid": [0, 2, 3, 33, 54], "transit": 0, "mode": 0, "831": 0, "string": [0, 1, 2, 3, 6, 12, 13, 15, 17, 18, 25, 26, 27, 29, 30, 32, 41, 44, 54], "778": 0, "782": 0, "durationtyp": 0, "607": 0, "daterang": [0, 32, 33], "668": 0, "rlac": 0, "output": [0, 41], "materi": [0, 3, 4, 25, 29, 46, 55], "view": [0, 25, 27, 43], "682": 0, "geom": 0, "wkt": [0, 32], "client": [0, 1, 2, 3, 8, 27, 29, 41, 42, 45, 53], "timeout": [0, 1, 3, 9, 10, 21, 26, 27, 33, 55], "custom": [0, 1, 3, 6, 10, 17, 27, 30, 33, 41, 42, 44, 46], "589": 0, "dsegssapiauthprovid": [0, 54], "accept": [0, 3, 27, 30, 32, 40, 41], "princip": [0, 54], "574": 0, "570": 0, "check": [0, 3, 9, 10, 27, 37, 46, 53, 55], "568": 0, "distinct": [0, 10, 15, 18], "477": 0, "known": [0, 15, 18, 25, 40, 55], "479": 0, "487": 0, "read": [0, 1, 6, 15, 18, 26, 27, 30, 32, 34, 36, 43, 54], "cl": [0, 10, 21], "509": 0, "target": [0, 3, 13, 15, 18, 27, 46], "analyt": [0, 3, 15, 18], "spark": [0, 3], "master": [0, 3, 53], "avail": [0, 3, 10, 30, 38, 45, 46, 53, 55], "510": 0, "continu": [0, 2, 27, 50], "session": [0, 1, 4, 7, 10, 12, 14, 15, 18, 25, 27, 29, 30, 33, 35, 39, 42, 43, 46, 47, 48, 49, 50, 52, 53, 54, 56], "runtimeerror": 0, "entir": [0, 3, 4, 10, 14, 25], "consum": [0, 4, 55], "1054": 0, "properti": [0, 1, 3, 5, 9, 13, 15, 18, 25, 27, 28, 30, 32, 37], "return": [0, 1, 2, 3, 4, 9, 10, 12, 14, 15, 18, 25, 26, 27, 29, 30, 31, 32, 33, 37, 38, 39, 41, 43, 44, 47, 48, 50, 52, 53, 54, 56], "dict": [0, 1, 3, 6, 7, 8, 9, 12, 15, 17, 18, 25, 26, 29, 30, 37, 44, 47, 53, 54], "instead": [0, 3, 4, 30, 38, 40, 44, 50, 54, 55], "1033": 0, "has_more_pag": [0, 3, 50], "mai": [0, 2, 3, 4, 6, 7, 27, 30, 32, 37, 38, 43, 44, 46, 49, 54, 55], "hold": [0, 25, 29], "wrong": [0, 44], "946": 0, "misplac": 0, "963": 0, "modul": [0, 9, 11, 18, 19, 20, 40, 46, 49], "import": [0, 2, 3, 4, 6, 10, 11, 12, 29, 30, 34, 35, 37, 38, 39, 41, 42, 43, 44, 46, 48, 50, 52, 53, 54], "dll": 0, "issu": [0, 2, 27, 31, 32, 36, 55], "window": [0, 32], "due": [0, 1, 10, 26, 34, 49], "its": [0, 2, 3, 5, 9, 19, 20, 23, 24, 27, 30, 32, 37, 42, 46, 54, 55], "cython": [0, 29], "900": 0, "date": [0, 6, 17, 32, 33, 44, 45, 55], "isoformat": 0, "805": 0, "729": 0, "montonictimestampgener": 0, "__init__": [0, 3, 27, 31, 50, 55, 56], "ignor": [0, 3, 8, 26, 27, 29, 30, 44], "class": [0, 1, 2, 3, 5, 6, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 48, 50, 53, 54, 55], "728": 0, "get_host": [0, 25], "none": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 25, 26, 27, 30, 32, 36, 38, 39, 41, 43, 44, 47, 50], "709": 0, "socket": [0, 5, 54], "associ": [0, 3, 55], "get": [0, 3, 8, 9, 10, 25, 27, 38, 46, 52], "clean": [0, 39, 46, 55], "up": [0, 3, 8, 13, 19, 20, 21, 22, 32, 33, 34, 37, 38, 52, 54, 55], "673": 0, "fqdn": [0, 54], "ip": [0, 3, 5, 27, 28, 44, 54], "address": [0, 1, 3, 5, 11, 25, 28, 30, 33, 37, 43, 44, 52, 54, 55, 56], "saslclient": 0, "566": 0, "geospati": 0, "don": [0, 10, 38, 44, 49, 56], "481": 0, "correctli": [0, 3], "equal": [0, 3, 6, 30, 38], "508": 0, "around": [0, 9, 32, 40, 41, 55], "872": 0, "abstract": [0, 2, 6, 9, 25, 30], "graphstat": [0, 3, 14], "differ": [0, 3, 10, 29, 30, 32, 36, 37, 38, 42, 44, 54, 55], "statement": [0, 3, 25, 27, 33, 34, 36, 41, 42, 43, 47, 50, 56], "789": 0, "732": 0, "dse_v1": [0, 1], "includ": [0, 3, 9, 10, 25, 26, 40, 45, 49, 54, 55, 56], "694": 0, "novemb": 0, "2019": 0, "old": [0, 10, 40], "instal": [0, 40, 44, 45, 49, 54], "without": [0, 1, 3, 9, 10, 38, 41, 44], "1183": 0, "valueerror": [0, 32], "too": [0, 3, 27, 41], "mani": [0, 1, 3, 4, 27, 44, 49, 50, 54, 55], "unpack": [0, 15, 18, 44], "expect": [0, 5, 9, 43, 47, 54, 55, 56], "two": [0, 1, 3, 13, 27, 29, 32, 38, 44, 46, 54], "dash": 0, "server": [0, 1, 2, 3, 9, 15, 18, 25, 29, 30, 33, 38, 44, 47, 48, 55], "number": [0, 1, 3, 4, 5, 9, 10, 26, 27, 40, 42, 44, 46, 47, 50], "1172": 0, "octob": 0, "28": 0, "datastax": [0, 6, 10, 18, 27, 44, 45, 46, 48, 54, 55], "1074": 0, "parser": [0, 29], "alpha": 0, "snapshot": 0, "build": [0, 25, 40, 44, 46, 49], "1158": 0, "setup": [0, 7, 10, 35, 37, 38, 39, 40, 44, 46, 48, 54], "method": [0, 2, 3, 9, 10, 27, 29, 30, 35, 36, 37, 38, 41, 43, 44, 46, 49, 53], "prevent": [0, 10, 40, 44, 46], "executionprofil": [0, 3, 12, 33, 42, 44, 52], "1009": 0, "deadlock": [0, 4], "heartbeat": 0, "whilst": 0, "time": [0, 1, 2, 3, 4, 6, 10, 26, 27, 31, 32, 33, 37, 38, 40, 44, 45, 46, 55], "out": [0, 1, 4, 9, 27, 32, 34, 36, 38, 40, 41, 44, 54], "1044": 0, "pk__token__gt": [0, 38], "In": [0, 3, 27, 29, 34, 38, 40, 44, 46, 53, 54, 55], "1121": 0, "august": 0, "1016": 0, "futur": [0, 3, 6, 7, 30, 31, 40, 43, 44, 46, 49, 50, 55], "proof": 0, "map": [0, 1, 3, 8, 10, 13, 15, 17, 18, 25, 29, 30, 32, 33, 37, 38, 44, 48, 55], "1023": 0, "param": [0, 4, 13], "1105": 0, "nt": 0, "token": [0, 2, 3, 13, 15, 27, 33, 43, 46, 53], "replica": [0, 1, 8, 25, 26, 27, 30, 44], "slow": 0, "622": 0, "as_cql_queri": [0, 25], "udf": 0, "uda": 0, "incorrectli": [0, 30], "frozen": [0, 32, 56], "argument": [0, 1, 3, 4, 7, 9, 10, 15, 18, 27, 30, 31, 32, 34, 35, 44, 46, 54, 55], "1031": 0, "doe": [0, 3, 10, 17, 32, 34, 38, 40, 44, 46, 47, 56], "current": [0, 1, 3, 10, 12, 26, 27, 30, 31, 38, 42, 43, 46, 50, 55], "combin": [0, 3], "ttl": [0, 9, 10], "timestamp": [0, 1, 6, 9, 10, 17, 32, 33, 36, 40, 44, 45], "insert": [0, 1, 3, 4, 9, 10, 30, 32, 36, 37, 41, 44, 47, 53, 55, 56], "1093": 0, "incorrect": [0, 44], "compact": [0, 9], "counter": [0, 6, 26, 27, 30, 37, 44], "1100": 0, "call": [0, 2, 3, 5, 9, 10, 17, 19, 20, 21, 22, 27, 30, 31, 34, 37, 38, 41, 44, 48, 50, 53, 54], "connectionexcept": [0, 5, 33], "correct": [0, 9, 41], "kwarg": [0, 3, 4, 6, 7, 9, 10, 12, 15, 18, 19, 20, 21, 22, 23, 27, 32, 34, 39, 54], "1117": 0, "built": [0, 32, 42, 46, 49, 55], "becaus": [0, 3, 4, 15, 18, 27, 30, 32, 40, 41, 44, 46, 53, 55], "doesn": [0, 31, 55], "y": [0, 10, 27, 32], "1118": 0, "discov": [0, 3, 27, 44], "honor": [0, 44], "configur": [0, 1, 2, 3, 5, 7, 9, 15, 18, 27, 31, 42, 44, 45, 53], "1127": 0, "set_sess": [0, 7], "we": [0, 7, 27, 36, 38, 39, 41, 42, 44, 48, 54, 56], "initi": [0, 2, 3, 5, 6, 7, 9, 15, 18, 27, 29, 31, 32, 35, 38, 39, 44, 46, 47, 54], "1104": 0, "1119": 0, "27": 0, "inform": [0, 3, 5, 9, 25, 27, 41, 52], "1079": 0, "integ": [0, 6, 10, 11, 13, 17, 31, 32, 35, 36, 37, 38, 41, 48], "4th": 0, "compon": [0, 10, 25, 30, 32, 54], "1091": 0, "on_request_error": [0, 27], "retrypolici": [0, 3, 26, 27, 30, 43], "1064": 0, "jitter": [0, 27], "exponentialreconnectionpolici": [0, 3, 27], "1065": 0, "1081": 0, "legaci": [0, 6, 40, 48, 54, 55], "1082": 0, "let": [0, 3, 55], "util": [0, 1, 12, 21, 22, 33, 40, 41, 44, 52, 54, 55], "sortedset": [0, 32, 33, 55], "uncompar": 0, "element": [0, 3, 10, 15, 18, 25, 32, 38, 44], "1087": 0, "eagain": 0, "ewouldblock": 0, "properli": [0, 3, 37, 38, 44], "1089": 0, "send": [0, 1, 2, 3, 5, 27, 44, 45, 55], "1068": 0, "ssl_context": [0, 3, 44, 54], "995": 0, "encrypt": [0, 54], "privat": [0, 1, 27], "kei": [0, 1, 3, 6, 8, 9, 10, 13, 15, 25, 26, 27, 29, 30, 32, 37, 38, 42, 43, 44, 47, 53, 54, 56], "introduc": [0, 19, 25, 30, 37, 38, 40, 42, 53, 55, 56], "consistencylevel": [0, 1, 3, 7, 10, 15, 18, 26, 27, 30, 33, 40, 44], "is_seri": 0, "1067": 0, "get_execution_profil": [0, 3], "932": 0, "execute_async": [0, 3, 4, 29, 43, 44, 49, 50], "specif": [0, 2, 5, 13, 15, 17, 18, 25, 27, 40, 45, 46, 55, 56], "993": 0, "nohostavail": [0, 3, 33], "891": 0, "1007": 0, "faster": [0, 33, 46], "lz4": [0, 46], "1042": 0, "29": 0, "1036": 0, "expand": 0, "740": 0, "ssl_option": [0, 3, 5, 54], "downgradingconsistencyretrypolici": [0, 27, 44], "937": 0, "2018": 0, "catch": 0, "code": [0, 1, 34, 39, 45, 54, 55, 56], "nonblock": 0, "reactor": [0, 20, 24, 43], "1024": 0, "ascii": [0, 6, 44], "charact": [0, 6, 44], "break": [0, 27, 45, 46, 55], "1008": 0, "oss": [0, 27], "": [0, 1, 2, 3, 6, 7, 9, 10, 11, 24, 27, 29, 30, 32, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48, 52, 53, 54, 55, 56], "virtual": [0, 38], "against": [0, 1, 3, 9, 27, 30, 37, 44, 48, 54], "1020": 0, "one": [0, 1, 2, 3, 6, 10, 13, 26, 27, 30, 32, 35, 36, 37, 38, 42, 44, 53, 54, 55], "1026": 0, "exist": [0, 1, 3, 8, 9, 10, 27, 28, 42, 47, 48, 53, 55], "944": 0, "instanti": [0, 27, 29, 31, 44], "ani": [0, 1, 3, 8, 9, 10, 13, 14, 17, 19, 20, 21, 22, 26, 27, 30, 34, 37, 38, 41, 43, 44, 45, 46, 47, 49, 54, 56], "contact": [0, 3, 27, 44], "point": [0, 3, 6, 26, 27, 32, 33, 41, 44, 54, 55], "resolut": [0, 32], "895": 0, "rf": [0, 1], "maintain": [0, 3, 30, 32, 37, 55], "decomiss": 0, "1017": 0, "index": [0, 3, 6, 25, 37, 38, 48, 55], "1015": 0, "septemb": 0, "logic": [0, 37, 53], "run": [0, 9, 10, 21, 27, 34, 37, 39, 44, 46, 48], "1018": 0, "30": [0, 3, 38, 42, 44], "keyspac": [0, 1, 3, 7, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 35, 43, 53, 55], "992": 0, "tokenmap": [0, 25], "get_replica": [0, 25, 43], "coincid": 0, "end": [0, 10, 34], "rang": [0, 4, 10, 32, 38, 41, 43, 53], "978": 0, "than": [0, 1, 3, 6, 10, 27, 30, 31, 32, 38, 42, 44, 46, 49, 50, 54], "255": 0, "specifi": [0, 1, 3, 6, 8, 9, 10, 11, 12, 27, 29, 30, 32, 35, 37, 38, 40, 41, 42, 44, 54, 55], "respons": [0, 1, 2, 3, 27, 29, 38, 44], "893": 0, "hang": [0, 46], "test_clust": 0, "clustertest": 0, "test_set_keyspace_twic": 0, "998": 0, "global": [0, 7, 43], "variabl": [0, 6, 9, 44, 46, 54], "event": [0, 3, 4, 21, 27, 30, 33, 39, 43, 44, 46, 50, 54], "loop": [0, 3, 4, 21, 33, 44, 46, 54], "697": 0, "libev": [0, 33], "so": [0, 1, 3, 10, 21, 25, 27, 30, 37, 38, 41, 42, 44, 47, 48, 49, 50, 54, 55], "subclass": [0, 1, 2, 3, 27, 30, 37, 54], "973": 0, "schemapars": 0, "v4": [0, 1, 6, 30], "1006": 0, "1012": 0, "947": 0, "fetch": [0, 3, 10, 30, 38, 44, 50, 55], "concurr": [0, 3, 8, 30, 33, 43, 44, 49], "same": [0, 3, 4, 6, 7, 12, 15, 18, 25, 27, 30, 32, 34, 35, 36, 37, 38, 42, 43, 44, 46, 54, 55], "647": 0, "have": [0, 2, 3, 4, 6, 9, 10, 15, 17, 18, 26, 27, 34, 35, 36, 37, 38, 40, 42, 44, 46, 47, 54, 55, 56], "manag": [0, 3, 6, 9, 10, 11, 28, 33, 34, 37, 42, 46, 48, 55], "outsid": [0, 6, 27, 32], "966": 0, "343": 0, "NOT": [0, 38, 47, 53], "oper": [0, 1, 3, 5, 8, 9, 10, 15, 18, 30, 32, 33, 35, 44, 47, 55], "968": 0, "broken": 0, "link": [0, 41, 46], "doc": [0, 1, 6, 10, 37, 38, 41, 53, 54], "916": 0, "reevalu": 0, "monkey_patch_loop": 0, "codebas": 0, "903": 0, "cass_server_vers": 0, "replac": [0, 3, 6, 29, 40, 54, 55], "cassandra_vers": 0, "910": 0, "kind": [0, 27, 55], "object": [0, 3, 4, 12, 15, 17, 18, 25, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 43, 44, 45, 49, 50, 55, 56], "915": 0, "940": 0, "user": [0, 1, 3, 4, 6, 8, 9, 10, 17, 18, 25, 30, 33, 38, 40, 44, 45, 46, 50, 53, 54], "default_consistency_level": [0, 3, 7, 42], "953": 0, "smoke": 0, "894": 0, "long": [0, 32, 44, 46, 56], "compil": [0, 29, 46, 49], "workaround": [0, 36, 40], "868": 0, "batch": [0, 1, 3, 9, 10, 12, 14, 25, 27, 33, 35, 38, 48], "writetimeout": [0, 1, 33], "941": 0, "945": 0, "like": [0, 1, 3, 4, 9, 10, 15, 18, 26, 27, 30, 37, 38, 41, 44, 46, 50, 54, 56], "512": 0, "cassandra": [0, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 46, 48, 49, 50, 52, 53, 54, 56], "batchtyp": [0, 10, 30, 33, 34], "batchqueri": [0, 10, 34, 36, 38], "888": 0, "attributeerror": 0, "nonetyp": 0, "attribut": [0, 3, 6, 8, 9, 10, 11, 15, 18, 25, 27, 29, 30, 31, 37, 38, 40, 42, 44, 47, 55, 56], "add_tim": 0, "862": 0, "retry_polici": [0, 3, 15, 18, 27, 30, 42, 43, 44], "preparedstat": [0, 3, 30, 33, 44], "861": 0, "__del__": 0, "throw": [0, 3, 30], "813": 0, "recent": 0, "897": 0, "_connect": 0, "request_id": 0, "853": 0, "was_appli": [0, 3], "lwt": [0, 3, 9, 47], "848": 0, "unregist": [0, 56], "865": 0, "deprecationwarn": [0, 55], "846": 0, "example_mapp": 0, "860": 0, "possibl": [0, 3, 9, 27, 31, 32, 37, 38, 41, 46, 50, 54, 55], "768": 0, "877": 0, "copyright": 0, "notic": 0, "863": 0, "experiment": [0, 19], "tag": [0, 15, 18], "840": 0, "request_tim": [0, 26], "descript": [0, 3, 15, 18, 27, 30, 34, 43, 48, 54], "slightli": 0, "885": 0, "892": 0, "local_on": [0, 1, 3, 44], "901": 0, "2017": [0, 45], "678": 0, "ipv4address": 0, "ipv6address": 0, "inet": [0, 1, 25], "751": 0, "writetyp": [0, 1, 27], "cdc": [0, 27], "miss": [0, 27], "794": 0, "init": [0, 3, 36, 40], "lbp": 0, "isn": [0, 9, 10], "812": 0, "exect": 0, "838": 0, "hash": [0, 38, 46], "stmt": 0, "808": 0, "no_compact": 0, "839": 0, "837": 0, "0m": 0, "constantspeculativeexecutionpolici": [0, 27, 44], "836": 0, "507": 0, "both": [0, 3, 38, 39, 44, 46, 54], "_set_final_except": 0, "630": 0, "dcawareroundrobinpolici": [0, 3, 27, 42, 52], "781": 0, "Not": [0, 32], "814": 0, "ayncoreconnect": 0, "827": 0, "cleanup": [0, 20], "close": [0, 3, 5], "829": 0, "site": [0, 41], "where": [0, 3, 4, 10, 25, 27, 30, 32, 37, 43, 44, 46, 47, 55], "chang": [0, 3, 6, 9, 10, 25, 27, 30, 31, 36, 37, 38, 43, 44, 45], "dure": [0, 1, 2, 3, 5, 9, 40, 46], "iter": [0, 3, 25, 27, 29, 30, 32, 38, 50, 55], "793": 0, "min_length": [0, 6], "text": [0, 3, 6, 9, 10, 11, 13, 35, 36, 37, 38, 40, 44, 48, 55, 56], "735": 0, "rare": 0, "sy": 0, "exit": 0, "752": 0, "dont": 0, "843": 0, "whitelistroundrobinpolici": [0, 27, 42, 44, 55], "810": 0, "833": 0, "juli": 0, "idle_heartbeat_timeout": [0, 3], "tune": 0, "how": [0, 1, 4, 6, 9, 27, 30, 38, 39, 41, 42, 44, 45, 47, 50, 54, 55], "wait": [0, 1, 3, 21, 27, 30, 43, 44, 50], "762": 0, "hostfilterpolici": [0, 27], "761": 0, "is_idempot": [0, 15, 18, 30, 44], "flag": [0, 3, 6, 9, 29, 37, 46], "propag": [0, 27, 30], "boundstat": [0, 30, 33, 44, 55], "736": 0, "767": 0, "take": [0, 3, 4, 8, 9, 15, 18, 25, 27, 35, 44, 46, 54], "sever": [0, 38, 40, 44, 46, 49], "minut": [0, 32, 46], "bad": 0, "alwai": [0, 3, 15, 18, 27, 41, 44, 46, 47], "fall": [0, 32], "back": [0, 6, 9, 32, 38], "763": 0, "suppos": [0, 37, 54], "772": 0, "pool": [0, 1, 3, 33, 55], "739": 0, "murmur3": [0, 3, 46], "big": [0, 53], "endian": 0, "653": 0, "unus": [0, 46], "delet": [0, 8, 9, 10, 27, 30, 34, 38], "gc": 0, "774": 0, "values_list": [0, 38], "db": 0, "intern": [0, 3, 10, 27, 31, 32, 40, 41, 55], "785": 0, "754": 0, "769": 0, "759": 0, "guid": [0, 44, 45, 46, 48, 54], "464": 0, "inupt": 0, "microsecond": [0, 31, 55], "717": 0, "dsa": 0, "slack": 0, "irc": 0, "750": 0, "commun": [0, 5, 46], "review": 0, "primari": [0, 3, 6, 8, 9, 10, 25, 30, 37, 38, 47, 53, 56], "705": 0, "get_query_trac": [0, 3, 43, 55], "contract": [0, 29], "ambigu": 0, "196": 0, "specul": [0, 27], "prematur": 0, "755": 0, "749": 0, "encod": [0, 3, 6, 15, 18, 29, 33, 41], "larg": [0, 3, 4, 10, 32, 38, 45, 55], "747": 0, "743": 0, "742": 0, "to_python": 0, "741": 0, "spin": 0, "infinit": [0, 27], "try": [0, 1, 3, 8, 9, 27, 37, 39, 41, 44, 53], "drain": 0, "734": 0, "resulset": 0, "sometim": [0, 10, 15, 18, 27, 46, 50], "730": 0, "memori": [0, 4, 38, 55], "grow": 0, "720": 0, "size": [0, 3, 10, 55], "708": 0, "overflowerror": [0, 32], "problem": [0, 3, 26, 43], "707": 0, "nonexist": [0, 1], "706": 0, "readm": 0, "746": 0, "737": 0, "select": [0, 3, 4, 9, 10, 30, 38, 42, 43, 44, 46, 50, 53, 54, 55, 56], "626": 0, "increas": [0, 27, 31, 46], "coverag": 0, "suit": [0, 54], "505": 0, "verifi": 0, "469": 0, "688": 0, "665": 0, "flake": 0, "test_clone_shared_lbp": 0, "727": 0, "callback": [0, 3, 10, 44, 49, 54], "errback": [0, 3, 44, 50], "733": 0, "model": [0, 3, 8, 33, 38, 43, 48, 55], "hasn": 0, "657": 0, "explicit": [0, 40, 41], "true": [0, 3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 31, 34, 35, 36, 37, 38, 40, 43, 44, 47, 48, 53, 54], "719": 0, "723": 0, "mention": [0, 41, 44], "pre": [0, 46], "710": 0, "__le__": 0, "__ge__": 0, "__ne__": 0, "714": 0, "gevent": [0, 33], "could": [0, 10, 55], "721": 0, "decimaltyp": 0, "regress": 0, "724": 0, "quot": [0, 17, 41], "616": 0, "On": [0, 27, 46], "keep": [0, 27], "between": [0, 2, 6, 29, 30, 46, 53], "631": 0, "tokenawarepolici": [0, 3, 27, 42, 52, 53], "given": [0, 3, 10, 25, 27, 28, 30, 32, 34, 38, 49], "643": 0, "ad": [0, 1, 3, 10, 21, 25, 27, 30, 34, 37, 38, 46, 55], "648": 0, "__len__": 0, "batchstat": [0, 1, 3, 30, 33, 55], "650": 0, "655": 0, "684": 0, "potenti": 0, "applic": [0, 3, 6, 27, 39, 40, 41, 44, 46, 49, 50, 52, 55], "prior": 0, "636": 0, "been": [0, 3, 5, 9, 26, 27, 30, 34, 35, 40, 55], "mark": [0, 3, 5, 33, 44, 45], "640": 0, "operationtimedout": [0, 1, 3, 33], "642": 0, "timer": [0, 21, 26], "cancel": 0, "them": [0, 3, 27, 38, 40, 41, 44, 46, 47, 48, 55], "even": [0, 3, 7, 27, 30, 41, 42, 44], "receiv": [0, 1, 3, 27, 44], "which": [0, 1, 3, 9, 10, 25, 27, 29, 30, 34, 35, 36, 38, 40, 44, 46, 49, 54, 55, 56], "lead": [0, 34, 49, 55], "leak": 0, "644": 0, "cannot": [0, 3, 27, 30, 32, 38, 42], "646": 0, "usertyp": [0, 6, 25, 33, 37], "sinc": [0, 9, 29, 31, 32, 36, 38, 41, 43, 56], "649": 0, "on_up": [0, 27], "669": 0, "strictli": 0, "676": 0, "register_connect": [0, 7, 35], "692": 0, "section": [0, 38, 40, 45, 47, 49, 54, 55], "explain": [0, 42], "semant": [0, 3], "623": 0, "645": 0, "686": 0, "690": 0, "2016": [0, 45], "stabl": 0, "656": 0, "619": 0, "first": [0, 3, 4, 6, 7, 9, 27, 36, 37, 38, 40, 44, 45, 46, 48, 50, 54, 55], "617": 0, "indic": [0, 1, 2, 3, 6, 8, 9, 10, 25, 27, 38, 47], "361": 0, "refresh_nod": [0, 3], "forc": [0, 27, 54], "rebuild": [0, 3], "349": 0, "refresh": [0, 3], "v1": [0, 1, 32], "v2": [0, 1, 45], "106": 0, "ec2": 0, "198": 0, "retri": [0, 7, 26, 30, 33, 44], "218": 0, "state": [0, 3, 10, 20, 27, 34, 45, 47], "200": 0, "while": [0, 3, 27, 30, 37, 40, 50, 55], "activ": [0, 3, 21, 22], "498": 0, "284": 0, "quadrat": 0, "ring": [0, 3, 27, 32, 33], "factor": [0, 8, 25], "379": 0, "creation": [0, 3, 4, 25, 38], "82": 0, "614": 0, "multipl": [0, 3, 10, 12, 14, 15, 18, 27, 34, 35, 44, 48, 49, 55], "613": 0, "628": 0, "results_metadata": 0, "621": 0, "export": [0, 25], "thrift": 0, "213": 0, "appli": [0, 3, 9, 10, 14, 30, 36, 41, 42, 44, 46, 47, 48, 56], "userdefinedtyp": [0, 6, 37], "606": 0, "longer": [0, 1, 55], "hashabl": [0, 32], "618": 0, "static": [0, 3, 6, 10, 12, 13, 32], "608": 0, "numpyprotocolhandl": [0, 29], "553": 0, "greplin": [0, 26], "scale": [0, 26, 41, 46, 49, 55], "stat": [0, 26, 53], "per": [0, 3, 4, 6, 9, 10, 25, 27, 35, 37, 43, 44, 50, 53, 55], "561": 0, "mock": 0, "unit": [0, 13, 27, 45], "requir": [0, 1, 2, 3, 6, 7, 19, 27, 29, 30, 32, 37, 38, 39, 40, 44, 46, 48, 54, 55], "591": 0, "compositetyp": 0, "follow": [0, 3, 26, 27, 29, 34, 35, 37, 40, 41, 42, 44, 46, 47, 54, 55], "562": 0, "is_up": 0, "hostdist": [0, 3, 27], "551": 0, "skip": [0, 9], "71": 0, "open": [0, 2, 3, 26, 27, 28, 32, 45], "105": 0, "contextqueri": [0, 10, 35], "switch": [0, 10, 46], "easili": [0, 10, 41], "598": 0, "609": 0, "geventreactor": [0, 33], "600": 0, "downgrad": [0, 27], "explicitli": [0, 1, 3, 10, 15, 18, 34, 37, 55], "537": 0, "tri": 0, "indefinit": 0, "549": 0, "exce": [0, 50], "max": [0, 3, 5, 26, 44], "recurs": 0, "depth": 0, "585": 0, "578": 0, "dct": 0, "579": 0, "comparison": [0, 6], "595": 0, "disentangl": 0, "default_time_to_l": [0, 38], "538": 0, "pk__token": [0, 38], "584": 0, "__in": [0, 38], "convert": [0, 13, 15, 17, 18, 32, 40, 41, 55], "596": 0, "lwtexcept": [0, 9, 10, 40], "part": [0, 8, 10, 30, 35, 40, 41, 46], "580": 0, "contain": [0, 3, 6, 9, 10, 13, 17, 27, 32, 37, 38, 41, 47, 50, 53], "599": 0, "rout": [0, 3, 9, 27, 43, 46], "comput": [0, 3, 9, 43], "overriden": 0, "inherit": [0, 6, 9, 11, 42], "576": 0, "569": 0, "583": 0, "593": 0, "fork": [0, 20, 43, 45, 49], "detect": [0, 40], "577": 0, "queryset": [0, 9], "respect": [0, 3, 38], "defer": [0, 10, 27], "560": 0, "io": [0, 3, 4, 10, 33, 46, 48, 54], "573": 0, "dictionari": [0, 6], "572": 0, "workload": [0, 42, 49], "555": 0, "521": 0, "better": [0, 27, 46, 49], "unsupport": 0, "157": 0, "412": 0, "short": [0, 30, 37, 52], "circuit": 0, "meta": [0, 3, 37], "topo": 0, "new_nod": 0, "alreadi": [0, 1, 3, 5, 8, 35, 46], "557": 0, "simplestat": [0, 3, 15, 18, 30, 33, 44, 50], "219": 0, "namedtupl": [0, 3, 4, 30, 37, 44, 47, 55, 56], "pair": [0, 29], "362": 0, "enforc": [0, 37], "limit": [0, 3, 10, 30, 38, 41, 49, 53], "151": 0, "min": [0, 26, 43], "threshold": [0, 3], "220": 0, "rpc_address": [0, 42], "365": 0, "datetim": [0, 6, 10, 17, 32, 34, 36, 38, 40, 41, 44, 48], "timezon": [0, 6, 32, 41], "394": 0, "high": [0, 48, 49], "cpu": [0, 4, 44, 49], "239": 0, "identifi": [0, 1, 37, 47], "447": 0, "stress": 0, "script": [0, 40, 46, 49], "434": 0, "unicodedecodeerror": 0, "bop": 0, "559": 0, "565": 0, "leav": [0, 3], "scope": [0, 3, 10], "135": 0, "agreement": [0, 3], "531": 0, "overload": [0, 1, 6, 26, 27], "556": 0, "decommiss": [0, 27], "548": 0, "weakref": 0, "ref": 0, "github": [0, 45, 48, 53], "addresstransl": [0, 27], "interfac": [0, 2, 27, 50], "69": 0, "decis": [0, 26, 41], "285": 0, "286": 0, "verif": 0, "296": 0, "301": 0, "disabl": [0, 3, 9, 10, 46, 53], "327": 0, "listen_address": 0, "332": 0, "A": [0, 1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 17, 18, 25, 26, 27, 30, 32, 35, 37, 38, 44, 45, 46], "record": [0, 6, 10, 27, 38], "415": 0, "popul": [0, 3, 27, 30, 38], "435": 0, "normal": [0, 3, 9, 10, 12, 27, 30, 32, 41, 44, 50], "443": 0, "ddl": 0, "444": 0, "special": [0, 6, 29, 37, 38, 40, 43], "527": 0, "duplic": 0, "103": 0, "geventconnect": [0, 22, 33], "stall": 0, "input": [0, 30, 40, 41, 42], "buffer": [0, 17, 44], "429": 0, "named_tuple_factori": [0, 3, 16, 30, 33, 55], "col": [0, 47], "467": 0, "happen": [0, 3, 27], "482": 0, "hostconnect": 0, "borrow_connect": 0, "block": [0, 3, 4, 34, 44, 49], "514": 0, "being": [0, 3, 6, 26, 30, 36, 42, 44, 46, 47], "550": 0, "save": [0, 9, 10, 34, 35, 37, 38, 41, 44, 50], "547": 0, "542": 0, "sync_schema": 0, "260": 0, "immut": [0, 32, 48], "520": 0, "528": 0, "sync_tabl": [0, 8, 10, 35, 37, 48], "composit": [0, 30, 38], "532": 0, "awar": [0, 3, 26, 27, 41, 46, 54, 55], "mapper": [0, 7, 40, 45], "535": 0, "lightweight": [0, 1, 10, 30, 44, 45], "transact": [0, 1, 3, 12, 14, 27, 30, 45], "syntaxexcept": 0, "325": 0, "249": 0, "86": 0, "272": 0, "compar": [0, 30, 32, 45], "79": 0, "273": 0, "math": 0, "align": 0, "cpython": [0, 3, 46], "480": 0, "db_field": [0, 6], "updatestat": 0, "530": 0, "secondari": [0, 25, 34, 38], "533": 0, "perform": [0, 1, 3, 9, 10, 27, 30, 33, 37, 38, 45, 46, 51], "relat": [0, 30, 38, 42], "addit": [0, 3, 10, 12, 29, 34, 37, 38, 44, 47, 48, 54, 55], "count": [0, 9, 10, 26, 27, 36, 38, 48], "522": 0, "auth": [0, 33, 54, 55], "454": 0, "surfac": 0, "agre": 0, "458": 0, "float": [0, 3, 6, 10, 15, 18, 26, 27, 37, 38, 44, 55], "int": [0, 3, 6, 7, 8, 15, 18, 25, 31, 32, 38, 44, 47, 53, 55, 56], "decim": [0, 6, 10, 38, 44], "468": 0, "495": 0, "pure": [0, 2, 27, 29, 46, 54], "protocolhandl": [0, 29], "present": [0, 7, 10, 30, 41, 42, 43, 46, 47, 55], "501": 0, "byte": [0, 6, 38], "bytearrai": [0, 17, 44], "503": 0, "default_serial_consistency_level": [0, 3, 42], "via": [0, 3, 37, 46, 50, 52, 54], "336": 0, "datatyp": 0, "278": 0, "258": 0, "266": 0, "306": 0, "IF": [0, 10, 27, 30, 47, 53, 55], "432": 0, "nest": [0, 32], "478": 0, "fetch_siz": [0, 3, 10, 15, 18, 30, 50, 55], "323": 0, "success": [0, 1, 2, 3, 4, 10, 27, 30, 44, 46], "486": 0, "333": 0, "bu": 0, "arm": 0, "platform": [0, 42], "450": 0, "overflow": [0, 41], "decod": [0, 3, 29, 30, 33, 55], "459": 0, "heap": 0, "466": 0, "31": [0, 38], "452": 0, "encount": [0, 3, 10], "header": [0, 29, 46], "471": 0, "unorder": 0, "task": [0, 3, 34, 39], "schedul": [0, 34], "h": [0, 43], "473": 0, "lazy_connect": [0, 7], "310": 0, "case": [0, 3, 4, 8, 9, 27, 32, 34, 35, 44, 49, 53, 54], "sensit": [0, 9], "famili": [0, 5, 9], "337": 0, "mandatori": [0, 3], "344": 0, "346": 0, "badli": 0, "347": 0, "351": 0, "datetyp": 0, "v": [0, 10, 12, 27, 47, 53], "354": 0, "now": [0, 31, 34, 36, 38, 40, 41, 44, 48], "395": 0, "445": 0, "451": 0, "470": 0, "475": 0, "eq": 0, "queryoper": 0, "476": 0, "multipleobjectsreturn": [0, 10], "doesnotexist": [0, 10], "base": [0, 1, 3, 9, 12, 26, 27, 29, 30, 32, 37, 40, 43, 44, 47, 52, 53, 54], "489": 0, "assign": [0, 6, 11, 37], "502": 0, "lot": [0, 53], "effici": [0, 29], "dataset": [0, 10, 38], "row": [0, 3, 4, 5, 10, 12, 29, 33, 34, 37, 38, 41, 42, 43, 44, 47, 48, 50, 55, 56], "demand": 0, "pagin": [0, 38, 50], "len": [0, 9, 10, 35], "behavior": [0, 3, 6, 27, 44, 55], "rather": [0, 32, 46], "result_cach": 0, "you": [0, 3, 4, 6, 9, 12, 27, 30, 34, 35, 37, 38, 43, 44, 46, 49, 50, 52, 53, 54, 55, 56], "might": [0, 3, 30, 50, 54], "want": [0, 3, 6, 9, 27, 34, 35, 37, 38, 44, 50, 54, 56], "cost": [0, 9, 10, 38], "note": [0, 3, 4, 7, 8, 9, 10, 19, 27, 30, 32, 35, 37, 38, 40, 41, 42, 44, 45, 50, 54, 55], "access": [0, 3, 9, 26, 30, 37, 44, 55], "slice": [0, 3, 38], "neg": [0, 32, 38], "also": [0, 3, 4, 9, 10, 13, 27, 30, 32, 35, 37, 38, 42, 43, 44, 46, 54, 55], "2015": 0, "212": 0, "update_view_metadata": 0, "407": 0, "querytrac": [0, 30, 33, 43], "partial": [0, 21, 22, 30], "438": 0, "attach": [0, 3, 15, 18, 34, 44, 49, 50], "439": 0, "serd": 0, "protocol_vers": [0, 1, 3, 4, 29, 30, 32, 37, 48, 50, 54, 55, 56], "215": 0, "evict": 0, "cach": 0, "226": 0, "utf": [0, 6, 17], "334": 0, "track": 0, "previou": [0, 3, 54, 55], "348": 0, "353": 0, "networktopologystrategi": [0, 8, 25], "make_token_replica_map": 0, "account": [0, 37], "rack": [0, 28, 52], "dc": [0, 3, 27, 55], "378": 0, "433": 0, "442": 0, "modern": 0, "276": [0, 55], "408": [0, 55], "400": [0, 55], "422": [0, 55], "292": [0, 55], "318": [0, 55], "368": [0, 55], "371": 0, "blist": 0, "soft": 0, "385": [0, 55], "416": 0, "405": 0, "bind": [0, 3, 12, 30, 43, 44, 53], "178": [0, 30, 55], "nan": [0, 32], "infin": 0, "282": 0, "409": 0, "alphanumer": 0, "413": 0, "plai": 0, "pagedresult": [0, 50, 55], "430": 0, "zero": 0, "392": 0, "dep": 0, "393": 0, "closur": 0, "cdef": 0, "earlier": [0, 21, 37], "396": 0, "397": 0, "398": 0, "extens": [0, 3, 27, 41, 53], "manifest": [0, 43, 47], "optim": [0, 45, 46, 49], "throughput": [0, 4, 49], "283": 0, "synchron": [0, 3, 4, 8, 37, 49, 50], "108": 0, "pypi": [0, 46], "357": 0, "pluggabl": 0, "313": 0, "377": 0, "123": [0, 3, 36, 53, 56], "342": 0, "363": 0, "toler": 0, "inconsist": 0, "370": 0, "order": [0, 1, 4, 6, 10, 25, 27, 30, 32, 34, 37, 41, 55], "keyerror": 0, "358": 0, "338": 0, "connect_timeout": [0, 3], "381": 0, "protect": 0, "partit": [0, 6, 10, 25, 27, 30, 38, 53], "375": 0, "trigger": [0, 3, 27], "294": 0, "360": 0, "240": 0, "288": 0, "doubl": [0, 6, 15, 18, 32, 44, 49, 55], "dollar": 0, "bodi": [0, 29], "345": 0, "default_keyspac": [0, 7], "352": 0, "mix": [0, 30], "303": 0, "asyncoreconnect": [0, 20, 33], "322": 0, "murmur3token": [0, 25], "from_kei": 0, "331": 0, "timeuuid": [0, 6, 10, 32, 37, 44, 55], "round": [0, 27, 32], "341": 0, "sizeti": 0, "tokenawar": 0, "dcawar": 0, "160": 0, "206": 0, "defin": [0, 1, 2, 3, 6, 8, 9, 10, 15, 18, 25, 27, 30, 33, 35, 38, 40, 42, 44, 45, 48, 53], "211": 0, "235": 0, "238": 0, "241": 0, "smallint": [0, 6, 15, 18, 44], "tinyint": [0, 6, 44], "245": [0, 40], "295": 0, "cqle": 0, "246": 0, "277": 0, "280": 0, "329": 0, "refresh_schema": [0, 55], "entiti": 0, "291": 0, "complet": [0, 1, 2, 3, 4, 11, 27, 30, 34, 37, 40, 43, 44, 49, 54], "302": 0, "regist": [0, 3, 7, 12, 17, 26, 34, 37, 45, 55], "v3": [0, 1, 37, 45], "305": 0, "315": 0, "distinguish": 0, "unset": 0, "317": 0, "324": 0, "ipv6": 0, "nice": 0, "207": 0, "244": 0, "monkei": [0, 21, 22, 54], "patch": [0, 21, 22, 41, 54], "289": 0, "dynam": [0, 3], "saslauthprovid": [0, 2, 33, 54], "saslauthent": [0, 2, 33], "300": 0, "read_inet": 0, "309": 0, "311": 0, "319": 0, "constantreconnectionpolici": [0, 27], "uuid": [0, 6, 9, 10, 32, 37, 38, 40, 44, 48], "uppercas": 0, "hex": 0, "335": 0, "thread": [0, 3, 4, 44, 46, 49], "safeti": 0, "297": 0, "298": 0, "299": 0, "99": [0, 26], "random": [0, 27, 32, 38], "202": 0, "190": 0, "full": [0, 30, 55], "222": 0, "gil": [0, 49], "229": 0, "anomali": 0, "utcfromtim": 0, "230": 0, "lookup": [0, 25, 27], "orderedmap": [0, 32, 33], "231": 0, "234": 0, "precis": [0, 6, 17, 32, 40, 41, 55], "243": 0, "kerbero": [0, 54], "109": 0, "network": [0, 30, 44], "devic": 0, "keepal": 0, "idl": 0, "197": 0, "186": 0, "bypass": [0, 3, 8, 30], "205": 0, "194": 0, "complex": [0, 42, 46], "191": 0, "placement": [0, 8], "strategi": [0, 40, 55], "192": [0, 3, 44], "set_keyspac": [0, 3, 27, 44, 56], "195": 0, "implicit": [0, 10, 55], "204": 0, "collis": 0, "sasl": [0, 2, 54], "210": 0, "unhexlifi": 0, "usag": [0, 2, 3, 4, 9, 25, 27, 30, 55], "208": 0, "decemb": 0, "2014": [0, 38], "info": [0, 3, 33, 44], "confirm": 0, "wa": [0, 1, 2, 3, 4, 5, 7, 25, 26, 27, 30, 36, 40, 46, 47, 55], "116": 0, "incomplet": 0, "163": 0, "174": 0, "175": 0, "represent": [0, 25, 30, 32, 55], "unavail": [0, 1, 26, 27, 33], "180": 0, "accommod": [0, 41], "185": 0, "119": [0, 32], "rpc_addr": 0, "166": 0, "retain": [0, 41], "173": 0, "179": 0, "181": 0, "add_collback": 0, "store": [0, 1, 6, 9, 30, 37, 41, 52], "invok": [0, 3, 40], "182": 0, "184": 0, "compress": [0, 3, 29], "187": 0, "construct": [0, 9, 12, 32, 41, 42, 44], "local_dc": [0, 27, 52], "contact_point": [0, 3, 7, 27, 54], "126": 0, "148": 0, "feedback": 0, "122": 0, "159": 0, "unauthor": [0, 1, 33], "schema_trigg": 0, "155": 0, "sort": [0, 4, 6, 32, 38], "pyton": 0, "167": 0, "165": 0, "recreat": [0, 25], "189": 0, "144": 0, "basic": [0, 3, 12, 37], "export_for_schema": [0, 25], "120": 0, "150": 0, "modifi": [0, 1, 8, 9, 10, 32], "7857": 0, "110": 0, "lib": 0, "dir": 0, "libevwrapp": 0, "homebrew": [0, 46], "mac": [0, 46], "112": 0, "804dea3": 0, "move": [0, 3, 30, 55], "88": 0, "constructor": [0, 3, 6, 38, 52], "basi": [0, 55], "93": 0, "extra": [0, 25, 30, 46], "item": [0, 4, 9, 10, 15, 18, 27, 30, 32, 37, 38, 44], "98": 0, "100": [0, 4, 10, 42, 50], "typeerror": [0, 15, 18], "164": 0, "keyspacemetadata": [0, 25], "export_as_str": [0, 25], "96": 0, "reduc": [0, 3, 49, 53], "overhead": [0, 4, 34], "lock": 0, "content": [0, 10, 29], "side": [0, 1, 2, 3, 15, 18, 27, 40], "see": [0, 1, 3, 4, 6, 9, 10, 11, 13, 15, 18, 27, 29, 30, 32, 37, 38, 41, 42, 43, 44, 46, 47, 48, 49, 50, 53, 54, 55], "use_client_timestamp": [0, 1, 3, 55], "overrid": [0, 3, 9, 15, 18, 42, 44, 55], "bytesio": 0, "consumpt": [0, 49], "143": 0, "just": [0, 3, 6, 25, 27, 32, 34, 37, 40, 44, 46, 50, 53, 56], "refer": [0, 10, 34, 40, 42, 47, 55], "xrang": 0, "go": [0, 40, 51], "six": [0, 46, 55], "138": 0, "parent": [0, 20], "80": 0, "clear": [0, 14, 27, 30], "child": [0, 27, 43], "multiprocess": 0, "befor": [0, 1, 3, 9, 10, 27, 29, 30, 40, 43, 44, 49, 50, 55], "141": 0, "share": [0, 3, 19, 20, 21, 22, 42, 49], "across": [0, 19, 20, 21, 22, 27, 42, 43, 49], "instanc": [0, 2, 3, 6, 9, 10, 13, 15, 18, 25, 26, 27, 30, 34, 38, 44, 48, 50, 54, 55, 56], "dynamiccompositetyp": 0, "deal": [0, 41, 42, 49, 55], "81": 0, "defunct": [0, 3, 5], "76": 0, "captur": [0, 46], "dclocal_read_repair_ch": 0, "84": 0, "written": 0, "until": [0, 2, 3, 4, 7, 37, 43, 44], "push": [0, 46], "partition": 0, "token_map": 0, "90": 0, "match": [0, 3, 5, 9, 10, 15, 18, 25, 30, 38, 40, 42, 43, 44, 46, 54, 55, 56], "89": 0, "147": 0, "accord": [0, 3], "notif": 0, "ca": [0, 27, 54], "91": 0, "txt": [0, 46], "atexit": 0, "restart": [0, 44], "delai": [0, 27, 44], "60": 0, "debian": [0, 46], "recommend": [0, 3, 4, 27, 36, 44, 49, 54, 55, 56], "destroi": 0, "rebuilt": 0, "is_shutdown": 0, "run_in_executor": 0, "decor": 0, "70": 0, "73": 0, "125": 0, "under": [0, 25, 27, 37, 45], "124": 0, "strip": 0, "trail": 0, "underscor": 0, "56": 0, "on_write_timeout": [0, 27], "rethrown": 0, "submit": [0, 43], "threadpoolexecutor": 0, "With": [0, 35, 43, 52, 54, 55], "circumst": 0, "unintend": 0, "topologi": [0, 3, 27, 33], "actual": [0, 1, 27, 30, 38, 44, 47], "remot": [0, 3, 27, 53], "75": 0, "second": [0, 3, 10, 26, 27, 30, 31, 32, 38, 41, 44], "join": 0, "interpret": [0, 30, 36, 38, 55], "help": [0, 38, 55], "done": [0, 3, 37, 41, 43, 54, 55], "If": [0, 2, 3, 4, 7, 8, 9, 10, 11, 14, 25, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 44, 46, 47, 50, 54, 55], "guarante": [0, 27, 30, 55], "howev": [0, 3, 10, 30, 34, 37, 38, 41, 46, 47, 50, 55, 56], "reproduc": 0, "pleas": [0, 3, 6, 9, 11, 27, 37, 43, 45, 54], "report": [0, 27], "need": [0, 1, 3, 6, 12, 27, 30, 32, 34, 35, 36, 37, 38, 39, 44, 46, 49, 53, 54, 55, 56], "your": [0, 3, 6, 9, 35, 37, 38, 40, 43, 44, 47, 48, 49, 50, 52, 54, 55, 56], "For": [0, 1, 3, 6, 7, 9, 10, 25, 27, 30, 32, 36, 37, 38, 40, 41, 42, 44, 46, 47, 48, 49, 50, 51, 53, 54, 55], "daemon": 0, "worker": [0, 39], "origin": [0, 3, 38, 55], "left": [0, 3, 4, 9, 41, 55], "place": [0, 40, 44, 55], "tuple_factori": [0, 3, 16, 29, 30, 33, 42, 44, 55], "dict_factori": [0, 3, 7, 16, 30, 33, 55], "ordered_dict_factori": [0, 3, 16, 30, 33, 55], "were": [0, 1, 3, 4, 19, 25, 27, 30, 36, 37, 40], "must": [0, 1, 3, 4, 10, 30, 32, 37, 38, 44, 46, 54, 55, 56], "adjust": [0, 40], "accordingli": 0, "prefer": [0, 27, 41, 44, 46, 55], "calcul": 0, "greenlet": 0, "kill": 0, "excess": 0, "succeed": 0, "reconnector": 0, "start": [0, 3, 34, 38, 41, 45, 50, 53, 55], "executor": 0, "becom": [0, 3, 8, 49, 55], "exhaust": [0, 27], "reconnectionpolici": [0, 27], "mke": 0, "uncondit": 0, "nose": 0, "111": [0, 36], "stdlib": 0, "46": 0, "101": 0, "easi": [0, 37, 38], "suppli": [0, 3, 30, 44, 54, 55], "lowercas": 0, "liter": [0, 15, 17, 18, 30, 41, 44, 55, 56], "ssl_error_want_read": 0, "ssl_error_want_writ": 0, "previous": [0, 40, 42, 55], "thei": [0, 1, 3, 4, 6, 8, 9, 10, 15, 18, 27, 29, 32, 34, 36, 37, 38, 40, 41, 55, 56], "safe": [0, 4], "everi": [0, 27, 31, 38, 39, 44], "uncal": 0, "95": 0, "escap": [0, 17], "datacent": [0, 1, 27, 28, 52], "drope": 0, "97": 0, "dcawareloadbalancingpolici": 0, "typestr": 0, "found": [0, 10, 25, 30, 45, 49, 54, 55], "92": 0, "cut": 0, "104": 0, "59": [0, 32], "asyncorereactor": [0, 33], "becam": [0, 40], "would": [0, 9, 27, 36, 37, 38, 42, 44, 53, 54, 55], "never": [0, 27, 34, 47, 49, 55], "those": [0, 3, 26, 27, 30, 42, 46], "tablemetadata": [0, 25, 55], "timestamptyp": 0, "unix": [0, 5, 31, 32, 41], "epoch": [0, 31, 32, 41], "5723": 0, "latest": 0, "plan": [0, 8, 27, 45], "tracing_en": 0, "invalidparametertypeerror": 0, "feb": 0, "byteorderedpartition": [0, 25], "ed": 0, "descriptor": 0, "namedtuple_factori": 0, "utf8": 0, "utf8typ": 0, "exactli": [0, 27, 40], "source_elaps": [0, 43], "These": [0, 3, 6, 9, 27, 29, 30, 32, 40, 41, 49, 54, 55], "main": [0, 3, 54, 56], "detail": [0, 1, 3, 9, 10, 30, 37, 41, 42, 43, 44, 49, 53, 54, 55], "last": [0, 1, 3, 27, 31, 38], "jan": 0, "common": [0, 40, 46, 54, 55], "strong": 0, "garbag": [0, 55], "nullhandl": 0, "handler": [0, 2, 10, 15, 18, 27, 29, 50], "logger": 0, "within": [0, 1, 3, 10, 13, 27, 30, 34, 41, 42, 44, 55], "twice": 0, "had": [0, 40, 55], "seen": [0, 3, 27], "millisecond": [0, 17, 32, 41], "simpl": [0, 6, 15, 18, 27, 30, 38, 40, 41, 44, 46, 49], "errno": 0, "simpli": [0, 9, 17, 27, 34, 37, 40, 44, 46, 56], "endless": 0, "newli": [0, 25, 27], "bootstrap": [0, 26], "sequenc": [0, 3, 4, 14, 17, 27, 30, 32, 44], "handle_writ": 0, "noth": [0, 25, 27], "sent": [0, 1, 2, 3, 29, 44], "backoff": 0, "exponenti": [0, 27], "murmur3partition": [0, 25, 46], "ordereddict": [0, 3, 30, 32, 44], "benchmark": [0, 49], "command": [0, 35, 46], "line": [0, 19, 44, 46], "eai": 0, "multithread": 0, "travisci": 0, "nov": 0, "2013": [0, 45], "stabil": 0, "especi": [0, 8, 42, 46], "particular": [0, 3, 25, 27, 30, 53], "parallel": 0, "sesssion": 0, "effort": [0, 40, 54], "opertaion": 0, "formerli": 0, "sequenti": 0, "loadbalancingpolici": [0, 3, 27, 42], "effect": [0, 3, 8, 34, 54], "unrecogn": 0, "throttl": 0, "trash": 0, "underutil": 0, "traffic": [0, 44], "later": [0, 1, 9, 27, 44, 50], "less": [0, 46], "contend": 0, "manipul": [0, 3], "pend": 0, "dequ": 0, "quickli": [0, 49], "debug": [0, 3], "unreferenc": 0, "local": [0, 1, 3, 27, 30, 41, 42, 43, 44, 55], "greatli": 0, "amount": [0, 4, 27], "begin": [0, 10, 13, 44], "oct": 0, "lazi": 0, "scenario": [0, 36], "insuffici": [0, 26], "gracefulli": 0, "un": [0, 30], "listen": [0, 3], "goe": 0, "register_listen": [0, 3], "healthmonitor": 0, "librari": [0, 19, 20, 41, 46, 54], "setuptool": [0, 46], "pep": 0, "386": 0, "compliant": 0, "post": [0, 49], "sep": 0, "cql_version": [0, 3], "successfulli": [0, 53], "lose": 0, "consit": 0, "path": [0, 15, 18, 29, 33, 46, 54], "cento": [0, 46], "varint": [0, 6, 44], "pack": [0, 30], "credenti": [0, 3, 52, 54], "orderedset": 0, "inet_pton": 0, "inet_ntop": 0, "inet_address": 0, "still": [0, 15, 18, 30, 34, 37, 40, 42, 44, 55, 56], "constant": [0, 54], "shouldn": 0, "surround": 0, "loss": 0, "cstringio": 0, "__repr__": 0, "invalidtypeparametererror": 0, "aug": 0, "pip": [0, 55], "__version_info__": [1, 33], "__version__": [1, 33, 46], "spcifi": 1, "respond": [1, 2, 27, 44], "By": [1, 3, 9, 10, 27, 29, 34, 38, 43, 44, 46, 50, 52, 54, 55], "ONE": [1, 3, 10, 40, 55], "0": [1, 2, 3, 4, 6, 9, 10, 12, 14, 15, 16, 18, 25, 27, 30, 31, 32, 34, 35, 37, 38, 42, 43, 44, 46, 47, 48, 50, 56], "coordin": [1, 3, 4, 27, 32, 43], "hint": 1, "replai": [1, 27], "1": [1, 2, 3, 4, 6, 10, 13, 15, 18, 19, 25, 27, 30, 31, 32, 34, 35, 36, 38, 42, 43, 44, 46, 47, 48, 52, 53, 54, 56], "2": [1, 2, 3, 4, 6, 9, 10, 12, 13, 14, 15, 16, 18, 25, 27, 30, 32, 34, 35, 36, 38, 40, 42, 43, 44, 45, 46, 47, 50, 53, 54, 56], "three": [1, 27, 30, 32, 44, 47], "3": [1, 2, 3, 4, 6, 9, 10, 15, 18, 19, 25, 27, 30, 31, 32, 34, 36, 37, 38, 45, 46, 48, 53, 56], "quorum": [1, 10, 27, 30, 44], "4": [1, 2, 3, 6, 9, 10, 19, 27, 29, 30, 32, 42, 48], "ceil": 1, "5": [1, 3, 9, 10, 19, 27, 38, 44, 45, 46, 53, 54], "6": [1, 3, 6, 10, 19, 25, 27, 30, 38, 45, 46], "each_quorum": 1, "7": [1, 3, 6, 10, 27, 45, 46], "each": [1, 2, 3, 4, 6, 9, 27, 30, 36, 37, 38, 41, 44, 50, 55, 56], "8": [1, 3, 6, 17, 31, 45, 46, 48], "consensu": 1, "among": [1, 27], "local_seri": [1, 30, 44], "9": [1, 9, 38], "10": [1, 3, 10, 38, 44, 46, 50], "protocolvers": [1, 33], "x": [1, 4, 10, 27, 32, 46, 47], "project": [1, 40, 45, 48, 49], "beta": [1, 46], "from": [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 18, 20, 25, 27, 29, 30, 32, 34, 35, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 54, 56], "finalis": 1, "beta5": 1, "v6": 1, "65": 1, "dse_v2": 1, "66": [1, 3], "supported_vers": 1, "beta_vers": 1, "min_support": 1, "minimum": [1, 3, 6, 32, 38], "max_support": 1, "maximum": [1, 3, 6, 27, 32, 38], "classmethod": [1, 9, 15, 18, 19, 20, 21, 22, 25, 29, 32], "get_lower_support": 1, "previous_vers": 1, "lower": [1, 4, 27, 32, 38, 44], "omit": [1, 30], "userfunctiondescriptor": [1, 3, 33], "argument_typ": 1, "describ": [1, 27, 29, 32, 38, 40, 41, 54], "signatur": [1, 3], "compris": [1, 29], "form": [1, 17, 32, 44], "type0": 1, "type1": 1, "uniqu": [1, 6, 25, 37, 42], "useraggregatedescriptor": [1, 3, 33], "driverexcept": [1, 33], "requestexecutionexcept": [1, 33], "There": [1, 3, 6, 8, 30, 38, 44, 46, 55], "enough": [1, 30], "live": [1, 27, 43], "satisfi": 1, "immedi": [1, 3, 34, 44], "forward": [1, 27, 40], "required_replica": [1, 27], "alive_replica": [1, 27], "aliv": [1, 26, 27], "required_respons": [1, 27], "received_respons": [1, 27], "readtimeout": [1, 33, 44], "yaml": [1, 27, 52, 53], "read_request_timeout_in_m": 1, "range_request_timeout_in_m": 1, "data_retriev": [1, 27], "whether": [1, 3, 6, 25, 26, 27, 47, 53], "retriev": [1, 3, 10, 30], "write_request_timeout_in_m": 1, "write_typ": [1, 27], "coordinationfailur": [1, 33], "error_code_map": 1, "repres": [1, 3, 5, 6, 9, 15, 18, 25, 26, 28, 30, 31, 32, 37, 38, 40, 41, 55], "higher": [1, 3, 4, 30, 54, 55], "readfailur": [1, 33], "writefailur": [1, 33], "functionfailur": [1, 33], "arg_typ": 1, "requestvalidationexcept": [1, 33], "configurationexcept": [1, 33], "errro": 1, "alreadyexist": [1, 33], "made": [1, 3, 5, 27, 38, 44, 55], "invalidrequest": [1, 33], "reason": [1, 3, 27, 41, 54], "author": [1, 54], "authenticationfail": [1, 2, 33], "took": 1, "occur": [1, 27, 30, 34, 44, 55], "last_host": 1, "new_authent": 2, "correspond": [2, 4, 6, 8, 37], "lifecycl": 2, "initial_respons": 2, "handshak": 2, "either": [2, 3, 15, 18, 32, 37, 38, 41, 45, 46], "challeng": [2, 46], "evaluate_challeng": 2, "produc": [2, 4, 15, 18, 38], "negoti": 2, "on_authentication_success": 2, "exact": 2, "natur": 2, "server_authenticator_class": 2, "phase": [2, 3, 30, 46], "perspect": [2, 27], "otherwis": [2, 3, 6, 9, 27, 32, 54], "usernam": [2, 44, 54], "password": [2, 54], "passwordauthent": [2, 54], "auth_provid": [2, 3, 54], "plaintextauthent": [2, 33], "sasl_kwarg": [2, 54], "suitabl": [2, 17, 25, 36], "gssapi": 2, "other": [2, 3, 6, 8, 9, 15, 18, 26, 27, 30, 32, 38, 44, 45, 46, 53, 54, 55, 56], "servic": [2, 54], "someth": [2, 27, 37, 38, 46, 54], "qop": [2, 54], "split": 2, "third": [2, 41, 48], "parti": [2, 3, 41, 48], "127": [3, 25, 35, 38, 42, 43, 44, 48, 54], "9042": [3, 5], "executor_thread": 3, "attr_kwarg": 3, "interact": [3, 44], "typic": [3, 10, 27, 29, 30, 31, 34, 38, 42, 44], "separ": [3, 54], "168": [3, 44], "implicitli": [3, 8, 37], "extablish": 3, "load_balancing_polici": [3, 27, 42, 44, 52, 53], "chosen": 3, "discuss": [3, 6, 11, 30, 37, 45, 47, 49], "reconnection_polici": 3, "default_retry_polici": [3, 27, 42, 43], "conviction_policy_factori": 3, "simpleconvictionpolici": [3, 27], "address_transl": 3, "identitytransl": [3, 27], "metrics_en": 3, "fals": [3, 4, 6, 7, 8, 9, 10, 15, 18, 25, 27, 30, 47, 48, 53, 54, 55], "sockopt": 3, "max_schema_agreement_wait": 3, "connection_class": [3, 46, 54], "libevconnect": [3, 23, 33, 46], "control_connection_timeout": 3, "idle_heartbeat_interv": 3, "schema_event_refresh_window": 3, "topology_event_refresh_window": 3, "status_event_refresh_window": 3, "prepare_on_all_host": 3, "reprepare_on_up": 3, "schema_metadata_en": 3, "speed": 3, "turn": [3, 43], "off": 3, "give": [3, 27, 54, 56], "awai": [3, 30], "programmat": 3, "inspect": [3, 8], "token_metadata_en": 3, "most": [3, 27, 37, 40, 41, 43, 50], "vnode": 3, "expens": 3, "timestamp_gener": 3, "endpoint_factori": 3, "wait_for_all_pool": 3, "establish": [3, 44], "mean": [3, 9, 26, 27, 38, 44], "remain": [3, 20, 27, 40, 42], "To": [3, 9, 11, 27, 34, 35, 37, 38, 40, 41, 42, 43, 44, 46, 51, 54, 55], "onc": [3, 4, 19, 20, 21, 22, 27, 29, 30, 34, 36, 38, 46, 50, 53], "purpos": [3, 6], "register_user_typ": [3, 55, 56], "user_typ": [3, 6], "klass": 3, "assum": [3, 21, 22, 38, 41, 54, 55], "whose": 3, "mykeyspac": [3, 30, 44, 55, 56], "street": [3, 11, 37, 55, 56], "zipcod": [3, 11, 37, 55, 56], "locat": [3, 40, 54, 56], "def": [3, 27, 34, 37, 39, 43, 44, 50, 52, 54, 55, 56], "self": [3, 15, 18, 37, 50, 53, 55, 56], "INTO": [3, 4, 30, 44, 47, 53, 56], "st": [3, 37, 56], "78723": [3, 56], "print": [3, 9, 10, 12, 30, 32, 35, 37, 41, 42, 43, 44, 46, 48, 52, 53, 56], "hoststatelisten": 3, "notifi": 3, "unregister_listen": 3, "add_execution_profil": [3, 12, 42], "pool_wait_timeout": 3, "inject": [3, 42, 46], "execution_profil": [3, 4, 12, 14, 42, 44, 52], "five": 3, "upon": [3, 37], "set_max_requests_per_connect": 3, "host_dist": 3, "max_request": 3, "abov": [3, 29, 34, 35, 41, 44, 49], "set_max_connections_per_host": 3, "pertain": 3, "get_max_requests_per_connect": 3, "set_min_requests_per_connect": 3, "min_request": 3, "below": [3, 4, 10, 27, 29, 36, 37, 38, 40, 46, 47, 49, 55], "dispos": 3, "set_core_connections_per_host": [3, 4], "get_min_requests_per_connect": 3, "get_core_connections_per_host": 3, "core_connect": 3, "unless": [3, 6, 27, 35, 55], "connect_to_remote_host": 3, "unsupportedoper": 3, "get_max_connections_per_host": 3, "max_connect": 3, "get_control_connection_host": 3, "refresh_schema_metadata": 3, "govern": [3, 27], "here": [3, 9, 10, 34, 35, 37, 38, 39, 40, 41, 46, 48, 52, 54], "refresh_keyspace_metadata": 3, "durabl": 3, "etc": [3, 10, 26, 27, 38], "refresh_table_metadata": 3, "refresh_user_type_metadata": 3, "refresh_user_function_metadata": 3, "refresh_user_aggregate_metadata": 3, "force_token_rebuild": 3, "set_meta_refresh_en": 3, "deprec": [3, 9, 16, 27, 54], "minim": [3, 40, 41, 44], "consistency_level": [3, 15, 18, 30, 42, 44], "serial_consistency_level": [3, 15, 18, 30, 42, 44, 47, 55], "request_timeout": [3, 42, 44], "speculative_execution_polici": [3, 44], "colnam": [3, 10, 30], "factori": [3, 12, 33, 47], "ag": [3, 30, 38, 44], "d": [3, 6, 10, 30, 41, 44], "bob": [3, 30, 44], "42": [3, 30, 44], "posit": [3, 10, 30, 34, 38, 44, 47, 55], "graphexecutionprofil": [3, 33], "_not_set": 3, "continuous_paging_opt": 3, "graph_protocol": [3, 12, 14], "graph_graphson3_row_factori": [3, 15, 18, 33], "graphprotocol": [3, 14, 15, 18, 33], "graphson_3_0": [3, 15, 18], "graph_object_row_factori": [3, 15, 18, 33], "graphson_1_0": [3, 15, 18], "shown": [3, 35, 37, 56], "neverretrypolici": 3, "graphanalyticsexecutionprofil": [3, 33], "3600": 3, "24": 3, "appropri": [3, 37, 46, 54], "graphexecutionpolici": 3, "b": [3, 4, 12, 14, 15, 18, 34, 35, 36, 38], "exec_profile_default": [3, 33, 42, 44, 52], "hierarchi": [3, 30], "featureless": [3, 30], "exec_profile_graph_default": [3, 12, 33, 55], "exec_profile_graph_system_default": [3, 33], "exec_profile_graph_analytics_default": [3, 33], "directli": [3, 4, 17, 29, 30, 44, 46, 54], "mycf": 3, "default_timeout": [3, 42], "measur": [3, 27], "individu": 3, "altern": [3, 29, 37, 40, 44, 46, 49, 54], "default_fetch_s": [3, 50], "5000": [3, 10, 50], "client_protocol_handl": [3, 29], "cython_protocol_handl": 3, "cythonprotocolhandl": 3, "custom_payload": [3, 15, 18, 29, 30], "paging_st": [3, 50], "execute_a": [3, 54, 55], "placehold": [3, 15, 18, 30, 44, 56], "style": 3, "obtain": [3, 10, 43, 49], "own": [3, 9, 37, 54], "union": 3, "preced": [3, 27, 34, 47], "execution_profile_clone_upd": [3, 42], "reus": [3, 14, 30], "yet": [3, 38, 44, 55], "discourag": 3, "few": [3, 44, 46], "e": [3, 8, 9, 10, 12, 15, 18, 27, 30, 43, 46], "deliveri": 3, "log_result": 3, "log_error": 3, "exc": [3, 50], "add_callback": [3, 10, 34, 44, 49, 50], "async": 3, "stuff": [3, 56], "execute_graph": [3, 15, 18], "json": [3, 12, 15, 18], "serializ": 3, "execute_graph_async": 3, "Or": 3, "ahead": [3, 44], "bound_stmt": 3, "Of": 3, "cours": 3, "bound": [3, 14, 30, 32, 43, 49], "analyticskeyspace_prepar": 3, "user_act": 3, "last_act": 3, "analyticskeyspac": 3, "affect": [3, 30, 34], "along": [3, 25, 50], "ep": [3, 44], "clone": [3, 42], "shallow": [3, 42], "referenc": 3, "inclus": 3, "rich": 3, "desir": [3, 10, 27, 34], "add_request_init_listen": 3, "fn": [3, 10], "arg": [3, 4, 6, 9, 10, 19, 20, 21, 22, 23, 27, 32, 34], "response_futur": 3, "advic": 3, "cycl": 3, "tree": 3, "remove_request_init_listen": 3, "deliv": 3, "add_errback": [3, 44], "final": [3, 44, 54], "expir": 3, "exceed": [3, 4, 53], "max_wait": [3, 30], "traceunavail": [3, 30, 33], "query_cl": [3, 30], "poll": [3, 30, 43], "get_all_query_trac": [3, 55], "regard": [3, 27, 32], "queryhandl": [3, 29], "is_schema_agre": 3, "thing": [3, 27, 38, 40, 44], "overs": 3, "tombston": [3, 36, 43], "start_fetching_next_pag": [3, 50], "queryexhaust": [3, 33], "arriv": 3, "hit": [3, 5], "wish": 3, "further": [3, 4, 27, 38, 43, 49, 54], "care": [3, 8], "handle_result": 3, "start_tim": 3, "should_log": 3, "total": [3, 27], "f": 3, "callback_arg": 3, "callback_kwarg": 3, "errback_arg": 3, "errback_kwarg": 3, "conveni": [3, 15, 18, 30, 38], "over": [3, 27, 29, 38, 49, 50, 54, 55], "backward": [3, 18, 25, 55], "understood": [3, 27], "emit": [3, 40, 46], "fashion": 3, "treat": [3, 27, 30, 44, 50], "user_row": [3, 44, 50], "process_us": [3, 4, 44, 50], "whenev": [3, 50], "transpar": [3, 44, 50], "shortcut": [3, 46], "result_set": 3, "current_row": 3, "fetch_next_pag": 3, "manual": [3, 9, 34], "current_pag": 3, "necessari": [3, 44, 46, 54], "max_wait_sec_p": 3, "max_wait_sec": 3, "know": [3, 27, 36, 55, 56], "opaqu": 3, "untrust": 3, "indetermin": 3, "latter": [3, 50], "succe": [3, 27], "busi": [3, 28], "usertypedoesnotexist": [3, 33], "statements_and_paramet": 4, "raise_on_first_error": 4, "results_gener": 4, "kept": 4, "substanti": [4, 55], "impact": 4, "experi": 4, "stop": [4, 34], "express": [4, 13, 32], "constrain": [4, 10], "footprint": [4, 38], "yield": [4, 27], "trade": 4, "margin": 4, "executionresult": 4, "result_or_exc": 4, "select_stat": 4, "statements_and_param": 4, "user_id": [4, 9, 30, 38, 44], "append": [4, 10, 25, 38, 44], "handle_error": [4, 44, 50], "els": [4, 39, 50], "execute_concurrent_with_arg": [4, 33, 49], "mytabl": 4, "50": 4, "unrecover": 5, "connectionshutdown": [5, 33], "connectionbusi": [5, 33], "protocolerror": [5, 33], "did": [5, 10, 27], "endpoint": [5, 25, 27, 28, 33, 52, 54], "rpc": [5, 28], "socket_famili": 5, "endpointfactori": [5, 33, 54], "sniendpoint": [5, 33], "proxy_address": 5, "server_nam": 5, "sni": 5, "proxi": 5, "sniendpointfactori": [5, 33], "node_domain": 5, "unixsocketendpoint": [5, 33], "unix_socket_path": 5, "least": [6, 26, 27, 30, 35, 37, 46], "primary_kei": [6, 9, 10, 25, 35, 36, 37, 38, 40, 48], "bool": [6, 7, 8, 10, 25, 44, 53], "partition_kei": [6, 10, 30, 38], "compound": 6, "custom_index": 6, "fieldnam": 6, "databas": [6, 8, 9, 34, 37, 38, 41, 42, 52, 53], "callabl": [6, 10, 12], "clustering_ord": [6, 37], "determin": [6, 9, 27, 30, 44], "disk": 6, "discriminator_column": [6, 37, 40], "discrimin": [6, 9, 37], "__discriminator_value__": [6, 9, 37, 40], "u": [6, 10, 30, 37, 38, 41, 44, 47, 52], "length": [6, 27, 30], "max_length": 6, "bigint": [6, 15, 18, 44], "64": [6, 9, 27], "bit": [6, 32, 46], "sign": [6, 54], "raw": 6, "alia": [6, 12, 25, 32, 40], "increment": 6, "decrement": 6, "dai": [6, 27, 32, 54], "truncate_microsecond": 6, "truncat": [6, 30, 32, 40], "quantiz": 6, "assert": [6, 36, 53], "utcnow": [6, 41], "32": 6, "value_typ": 6, "http": [6, 10, 27, 38, 48, 50, 53], "www": 6, "com": [6, 10, 53, 54], "cql_use": 6, "use_list_t": 6, "html": [6, 10, 38, 48], "key_typ": 6, "en": [6, 10], "usemap": 6, "strict": [6, 49], "unord": [6, 25], "use_set_t": 6, "coerc": 6, "16": 6, "naiv": [6, 41], "nanosecond": [6, 32, 41], "cqluseudt": 6, "arbitrari": [6, 32], "localhost": [7, 10], "preexist": 7, "relax": 7, "retry_connect": 7, "str": [7, 8, 10, 17, 32, 44], "cluster_opt": 7, "registri": 7, "mutual": [7, 32], "exclus": [7, 32, 45], "unregister_connect": [7, 35], "set_default_connect": [7, 35], "create_keyspace_simpl": [8, 40], "replication_factor": [8, 25, 53], "durable_writ": 8, "simplestrategi": [8, 25, 53], "caution": [8, 37], "product": [8, 48, 54], "environ": [8, 27, 46], "modif": 8, "guard": 8, "driven": 8, "create_keyspace_network_topologi": [8, 40], "dc_replication_map": 8, "dc_name": 8, "drop_keyspac": [8, 40], "synch": 8, "__keyspace__": [8, 9, 35, 37], "__connection__": [8, 9, 35], "sync_typ": [8, 11, 37], "ks_name": 8, "type_model": 8, "drop_tabl": 8, "ve": [9, 35, 37, 38], "person": [9, 37, 38], "first_nam": [9, 37], "last_nam": [9, 37], "blake": [9, 38], "eggleston": 9, "derivi": 9, "__abstract__": 9, "intend": [9, 31, 32, 46], "__table_name__": [9, 37, 40], "blank": 9, "prefix": [9, 11, 13], "__table_name_case_sensitive__": 9, "insensit": 9, "__default_ttl__": 9, "Will": 9, "__options__": [9, 38], "sensibl": 9, "sync": [9, 35, 37], "alter": [9, 27, 37], "resync": 9, "leveledcompactionstrategi": 9, "sstable_size_in_mb": 9, "tombstone_threshold": 9, "comment": [9, 10, 37], "timedata": 9, "sizetieredcompactionstrategi": 9, "bucket_low": 9, "bucket_high": 9, "min_threshold": 9, "max_threshold": 9, "tombstone_compaction_interv": 9, "86400": 9, "gc_grace_second": 9, "__compute_routing_key__": 9, "tokenawarerout": 9, "equival": [9, 36, 41, 44], "if_not_exist": [9, 10], "And": [9, 54, 55], "incur": 9, "testifnotexistsmodel": 9, "111111111111": 9, "if_exist": [9, 10], "testifexistsmodel": 9, "kimberli": 9, "blind": [9, 10], "iff": 9, "As": [9, 32, 40, 44, 53, 56], "testtransactionmodel": 9, "constraint": [9, 37], "batch_object": 9, "timedelta_or_datetim": 9, "ttl_in_sec": 9, "column_family_nam": 9, "include_keyspac": 9, "m": [9, 32, 36], "col_nam": 9, "modelqueryset": 10, "batch_obj": 10, "distinct_field": 10, "automobil": [10, 35, 38], "manufactur": [10, 35, 38], "year": [10, 32, 35, 38], "price": [10, 38], "000": 10, "500": 10, "order_bi": [10, 38], "ascend": [10, 38], "prepend": [10, 47, 55], "descend": [10, 37, 38], "uuid1": [10, 44], "uuid4": [10, 48], "photo_id": [10, 37], "comment_id": [10, 37], "revers": [10, 27], "allow_filt": [10, 38], "usual": [10, 21, 41, 54], "unwis": 10, "practiv": 10, "n": 10, "validationerror": [10, 37, 40], "jon": [10, 37, 38], "steve": 10, "blindli": 10, "column_nam": [10, 15, 18, 38], "z": 10, "overwrit": 10, "__": [10, 38, 55], "row_id": 10, "set_column": 10, "list_column": 10, "map_column": 10, "set_column__add": 10, "set_column__remov": 10, "list_column__append": 10, "list_column__prepend": 10, "entri": [10, 13, 17, 55], "didn": 10, "ones": [10, 40], "map_column__upd": 10, "map_column__remov": 10, "batch_typ": [10, 30, 34], "execute_on_except": [10, 34], "cql_refer": 10, "batch_r": 10, "One": [10, 41], "enum": [10, 13, 27, 32, 33], "timedelta": 10, "accumul": 10, "despit": 10, "fallback": [10, 27, 55], "add_queri": 10, "thu": [10, 27, 30, 47], "test2": 10, "honda": [10, 35, 38], "2008": 10, "civic": [10, 35, 38], "test4": 10, "automobile2": 10, "cluster2": [10, 35], "a2": 10, "violat": 10, "declar": [11, 37], "__type_name__": 11, "dsegraph": 12, "graphtravers": [12, 14], "dse_graph_query_languag": 12, "bytecod": 12, "languag": [12, 15, 18, 40, 45, 49], "create_execution_profil": 12, "graph_nam": [12, 15, 18], "dse_graph_query_protocol": 12, "query_from_travers": 12, "traversal_sourc": 12, "traversal_class": 12, "tinkerpop": [12, 46], "graphtraversalsourc": 12, "dsl": 12, "my_graph": 12, "valuemap": 12, "tolist": 12, "traversalbatch": [12, 14], "dsesessionremotegraphconnect": 12, "remoteconnect": 12, "basegraphrowfactori": 12, "wrap": [12, 15, 18, 27, 44], "reader": [12, 15, 18], "featur": [12, 19, 33, 38, 40, 45, 46, 54], "bulk": 12, "graph_traversal_row_factori": 12, "_gremlingraphson2rowfactori": 12, "graph_traversal_dse_object_row_factori": 12, "_dsegraphson2rowfactori": 12, "search": 13, "certain": [13, 27, 40, 46], "look": [13, 37, 38, 54], "token_prefix": 13, "withing": 13, "token_regex": 13, "regular": [13, 30, 36, 38], "regex": 13, "insid": [13, 34, 44], "fuzzi": 13, "distanc": [13, 27, 32, 33], "ie": [13, 50, 54], "letter": 13, "misspel": 13, "token_fuzzi": 13, "phrase": 13, "proxim": 13, "david": 13, "felcei": 13, "find": [13, 25, 41, 46], "middl": 13, "cqlcollect": 13, "contains_valu": 13, "contains_kei": 13, "entry_eq": 13, "geometri": [13, 32], "geounit": 13, "multipli": 13, "degre": 13, "traversal_batch": 14, "add_al": [14, 30], "as_graph_stat": 14, "graphsonwrit": 14, "graphson_2_0": [14, 15, 18], "single_object_row_factori": [15, 18, 33], "graph_result_row_factori": [15, 18, 33], "top": [15, 18, 27], "vertex": [15, 18, 25, 33], "simplifi": [15, 18], "low": [15, 18, 27, 33], "shed": [15, 18], "convers": [15, 18, 40, 41, 55], "graph_graphson2_row_factori": [15, 18, 33], "to_int": [15, 18, 33], "to_bigint": [15, 18, 33], "to_smallint": [15, 18, 33], "to_float": [15, 18, 33], "to_doubl": [15, 18, 33], "graphson1": [15, 18], "choos": [15, 18, 27, 55], "graph_languag": [15, 18], "groovi": [15, 18], "graph_read_consistency_level": [15, 18], "graph_write_consistency_level": [15, 18], "is_default_sourc": [15, 18], "is_analytics_sourc": [15, 18], "is_graph_sourc": [15, 18], "set_source_default": [15, 18], "set_source_analyt": [15, 18], "set_source_graph": [15, 18], "simplegraphstat": [15, 18, 33], "query_str": [15, 18, 30], "routing_kei": [15, 18, 27, 30, 43], "fill": [15, 18, 30], "getter": [15, 18], "as_vertex": [15, 18], "structur": [15, 18, 25, 37], "as_edg": [15, 18], "as_path": [15, 18], "label": [15, 18], "extract": [15, 18], "vertexproperti": [15, 18, 33], "cardin": [15, 18], "themselv": [15, 18], "inv": [15, 18], "invlabel": [15, 18], "outv": [15, 18], "outvlabel": [15, 18], "taken": [15, 18, 40], "verbatim": [15, 18], "recogn": [15, 18], "val": 15, "concis": 15, "graphson1seri": [15, 18, 33], "graphson1deseri": [15, 18, 33], "deserialize_d": [15, 18], "deserialize_timestamp": [15, 18], "deserialize_tim": [15, 18], "deserialize_dur": [15, 18], "deserialize_int": [15, 18], "deserialize_bigint": [15, 18], "deserialize_doubl": [15, 18], "deserialize_float": [15, 18], "deserialize_uuid": [15, 18], "deserialize_blob": [15, 18], "deserialize_decim": [15, 18], "deserialize_point": [15, 18], "deserialize_linestr": [15, 18], "deserialize_polygon": [15, 18], "graphson2read": [15, 18, 33], "extra_deserializer_map": [15, 18], "json_data": [15, 18], "obj": [15, 18], "cql_encode_non": 17, "cql_encode_object": 17, "cql_encode_all_typ": 17, "cql_encode_sequ": 17, "item1": 17, "item2": 17, "IN": [17, 25, 30], "cql_encode_str": 17, "cql_encode_unicod": 17, "cql_encode_byt": 17, "cql_encode_datetim": 17, "cql_encode_d": 17, "yyyi": [17, 32], "mm": [17, 32], "dd": [17, 32], "cql_encode_map_collect": 17, "key1": 17, "val1": 17, "key2": 17, "val2": 17, "cql_encode_list_collect": 17, "cql_encode_set_collect": 17, "cql_encode_tupl": [17, 55], "graphson3read": [18, 33], "mostli": [18, 47], "asyncioconnect": [19, 33], "initialize_reactor": [19, 20, 21, 22], "resourc": [19, 20, 21, 22, 46, 54], "handle_fork": 20, "eventletconnect": [21, 33, 54], "service_timeout": 21, "_timeout_watch": 21, "forev": [21, 27, 30], "_new_tim": 21, "watcher": 21, "wake": 21, "possibli": [21, 55], "twistedconnect": [24, 33, 54], "cql_keyword": [25, 33], "cql_keywords_unreserv": [25, 33], "cql_keywords_reserv": [25, 33], "add_or_return_host": 25, "all_host": [25, 42, 52], "export_schema_as_str": 25, "human": [25, 41], "readabl": 25, "endpoint_or_address": 25, "broadcast_rpc_address": 25, "broadcast_rpc_port": 25, "get_host_by_host_id": 25, "host_id": 25, "whitespac": 25, "is_cql_compat": 25, "columnmetadata": [25, 55], "tablemetadatav3": 25, "option_map": 25, "superset": 25, "tablemetadatadse68": 25, "indexmetadata": 25, "materializedviewmetadata": 25, "vertexmetadata": 25, "edgemetadata": 25, "layout": 25, "md5token": 25, "randompartition": 25, "bytestoken": 25, "from_str": 25, "token_str": 25, "replicationstrategi": 25, "_replicationstrategi": 25, "replicationfactor": 25, "all_replica": 25, "transient_replica": 25, "options_map": 25, "full_replica": 25, "replication_factor_info": 25, "dc_replication_factor": 25, "localstrategi": 25, "group_keys_by_replica": 25, "group": 25, "accur": 25, "no_valid_replica": 25, "variou": [26, 54], "pmfstat": 26, "latenc": [26, 44, 53], "stddev": 26, "deviat": 26, "median": 26, "75percentil": 26, "75th": 26, "percentil": 26, "95percentil": 26, "95th": 26, "98percentil": 26, "98th": 26, "99percentil": 26, "99th": 26, "999percentil": 26, "9th": 26, "connection_error": 26, "intstat": 26, "write_timeout": 26, "read_timeout": 26, "meet": [26, 27, 54], "other_error": 26, "known_host": 26, "regardless": [26, 27, 46, 47], "connected_to": 26, "open_connect": 26, "get_stat": 26, "set_stats_nam": 26, "stats_nam": 26, "metri": 26, "getstat": 26, "num": 26, "distant": 27, "influenc": 27, "greater": [27, 50], "resort": 27, "smaller": 27, "decid": 27, "focu": 27, "who": 27, "term": 27, "make_query_plan": 27, "working_keyspac": 27, "check_support": 27, "roundrobinpolici": [27, 53], "evenli": 27, "what": [27, 30, 37, 41, 54, 55, 56], "on_down": 27, "on_add": 27, "on_remov": 27, "used_hosts_per_remote_dc": 27, "similar": [27, 29, 34, 52, 54], "nodetool": 27, "reli": [27, 38], "word": [27, 38], "rest": [27, 44], "atlassian": 27, "net": 27, "brows": 27, "java": 27, "145": 27, "permit": 27, "child_polici": 27, "shuffle_replica": 27, "truthi": 27, "falsei": 27, "whitelist": 27, "blacklist": 27, "address_is_ignor": 27, "ignored_address0": 27, "ignored_address1": 27, "blacklist_filter_polici": 27, "primary_host": 27, "caveat": 27, "polic": 27, "probabl": [27, 38, 54], "brute": 27, "falsi": 27, "imagin": 27, "host2": 27, "robin": 27, "rotat": 27, "host1": 27, "host3": 27, "repeat": [27, 44], "disproportion": 27, "favor": [27, 40, 53, 55], "right": [27, 30, 44], "reachabl": 27, "public": 27, "suboptim": 27, "addr": [27, 37], "ec2multiregiontransl": 27, "dn": 27, "broadcast_address": 27, "aw": 27, "convictionpolici": 27, "add_failur": 27, "connection_exc": 27, "convict": 27, "reset": 27, "frequent": [27, 44, 45, 48], "new_schedul": 27, "finit": 27, "inbetween": 27, "ceas": 27, "max_attempt": [27, 44], "sleep": [27, 37], "fix": [27, 46, 54, 55], "base_delai": 27, "max_delai": 27, "15": [27, 44], "situat": [27, 34, 37], "Such": 27, "atom": [27, 30], "isol": 27, "unlogged_batch": 27, "overcount": 27, "batch_log": 27, "lighweight": 27, "mv": 27, "rethrow": 27, "acheiv": 27, "retry_next_host": 27, "anoth": [27, 34, 35, 38, 44, 54, 55], "on_read_timeout": 27, "retry_num": 27, "oppos": 27, "digest": 27, "suffici": 27, "acknowledg": 27, "on_unavail": 27, "unexpect": 27, "isbootstrap": 27, "servererror": 27, "fallthroughretrypolici": 27, "bewar": 27, "ok": [27, 54], "repair": 27, "furthermor": 27, "behind": [27, 41], "chanc": 27, "achiev": [27, 34, 54], "silent": 27, "idea": 27, "best": [27, 44, 51, 54], "risk": 27, "stale": 27, "speculativeexecutionpolici": [27, 44], "new_plan": 27, "noconnectionsavail": [28, 33], "binary_typ": 29, "_protocolhandl": 29, "_protocolhand": 29, "compos": 29, "encode_messag": 29, "decode_messag": 29, "message_types_by_opcod": 29, "msg": 29, "stream_id": 29, "compressor": 29, "allow_beta_protocol_vers": 29, "frame": 29, "_messagetyp": 29, "protocol_featur": 29, "user_type_map": 29, "opcod": 29, "decompressor": 29, "result_metadata": 29, "bitmap": 29, "decompress": 29, "inflat": 29, "lazyprotocolhandl": 29, "numpi": 29, "arrai": [29, 38], "upfront": 29, "lazili": 29, "numpyprotocolhand": 29, "facilit": 29, "analysi": 29, "toolkit": 29, "panda": 29, "roundtrip": 30, "involv": [30, 38], "10786": 30, "rule": 30, "prepared_stat": 30, "unset_valu": [30, 33], "addition": [30, 37, 40, 54], "extend": 30, "impli": [30, 45], "portion": [30, 32], "paxo": 30, "learn": [30, 54], "But": 30, "lineariz": 30, "center": 30, "insert_us": 30, "users_to_insert": 30, "pending_us": 30, "uncomplet": 30, "unlog": 30, "valuesequ": [30, 33], "my_user_id": 30, "alic": 30, "charl": 30, "wait_for_complet": 30, "traceev": [30, 33], "monotonictimestampgener": [31, 33], "warn_on_drift": 31, "warning_threshold": 31, "warning_interv": 31, "1e6": 31, "drift": 31, "_next_timestamp": 31, "ideal": [32, 41], "month": 32, "offer": [32, 46, 49, 50], "wider": [32, 41], "minyear": [32, 41], "maxyear": [32, 41], "days_from_epoch": 32, "offset": 32, "integer_typ": 32, "absolut": [32, 40], "1970": 32, "string_typ": 32, "lower_bound": 32, "upper_bound": 32, "daterangebound": [32, 33], "upper": 32, "from_valu": 32, "daterangeprecis": [32, 33], "member": [32, 37], "dictlik": 32, "radiu": 32, "from_wkt": 32, "linestr": [32, 33], "coord": 32, "behav": 32, "od": 32, "four": 32, "value2": 32, "deriv": [32, 37, 40, 42, 46, 55], "orderedmapserializedkei": [32, 33], "cass_typ": 32, "polygon": [32, 33], "exterior": 32, "interior": 32, "linear": 32, "inplac": 32, "independ": [32, 54], "hh": 32, "ss": 32, "mmmuuunnn": 32, "hour": 32, "23": 32, "fraction": 32, "micro": 32, "minimalist": 32, "todo": 32, "python2": 32, "datetime_from_timestamp": [32, 33], "agnost": 32, "manner": 32, "340": 32, "datetime_from_uuid1": [32, 33], "uuid_arg": 32, "max_uuid_from_tim": [32, 33], "uuid_from_tim": [32, 33, 40], "min_uuid_from_tim": [32, 33], "ms_timestamp_from_datetim": [32, 33], "dt": 32, "unix_time_from_uuid1": [32, 33], "examin": 32, "utc_datetime_from_ms_timestamp": [32, 33], "utc": [32, 41], "time_arg": 32, "clock_seq": 32, "48": 32, "clock": 32, "14": 32, "translat": [33, 40, 44], "dead": 33, "idempot": [33, 44], "eventletreactor": 33, "twistedreactor": [33, 54], "em1": [34, 48], "examplemodel": [34, 48], "example_typ": [34, 48], "created_at": [34, 48], "em2": [34, 48], "em3": [34, 48], "some_id": 34, "some_id2": 34, "logentri": 34, "k": [34, 35, 47, 54], "mystery_funct": 34, "thrown": 34, "reach": 34, "anyth": [34, 41], "somewher": [34, 50], "chain": 34, "queu": 34, "my_callback": 34, "named_arg": 34, "trap": 34, "cqlengine_batch": 34, "carri": 34, "aim": [35, 42], "eas": 35, "cluster3": 35, "registr": 35, "ks1": 35, "ks2": 35, "conn": 35, "cluster1": 35, "create_simple_keyspac": 35, "2010": [35, 38], "q": [35, 38, 48], "tesla": [35, 38], "auto": 35, "cql3": [36, 38, 45], "therefor": [36, 38, 46], "conflict": 36, "algorithm": [36, 46], "pick": [36, 44], "largest": 36, "mymod": 36, "mymodel": 36, "lastest": 36, "consult": 37, "desc": 37, "WITH": [37, 53], "BY": 37, "consider": [37, 49], "kevin": 37, "deldyck": 37, "kevin5000": 37, "fairli": 37, "straightforward": [37, 40, 41], "transform": 37, "often": 37, "impos": 37, "beyond": 37, "won": 37, "complain": 37, "person_id": 37, "super": 37, "convent": 37, "pet": [37, 40], "owner": 37, "owner_id": [37, 40], "pet_id": [37, 40], "pet_typ": [37, 40], "eat": 37, "food": 37, "cat": [37, 40, 54], "cute": 37, "tear_up_couch": 37, "dog": [37, 40], "fierc": 37, "bark_all_night": 37, "step": [37, 45], "distrimin": 37, "distriminator_column": 37, "sub": [37, 40], "cover": [37, 43], "much": [37, 41, 54, 55], "presist": 37, "pattern": [37, 49], "joe": [37, 54], "99999": 37, "ll": [38, 54], "accomplish": [38, 46], "simplest": [38, 44], "all_object": 38, "subset": 38, "That": 38, "car": 38, "20": 38, "our": [38, 44, 48, 54], "2012": 38, "op": 38, "year__in": 38, "2011": 38, "__gt": 38, "year__gt": 38, "nicer": 38, "__gte": 38, "__lt": 38, "year__lt": 38, "__lte": 38, "__contain": 38, "options__contain": 38, "backup": 38, "camera": 38, "__like": 38, "sasi": 38, "model__lik": 38, "isnotnul": 38, "easier": [38, 42, 46], "instruct": 38, "mintimeuuid": 38, "maxtimeuuid": 38, "datastream": 38, "min_tim": 38, "1982": 38, "max_tim": 38, "time__gt": 38, "time__lt": 38, "functon": 38, "apach": [38, 46, 55], "org": 38, "tokenfun": 38, "first_pag": 38, "next_pag": 38, "pk": [38, 44, 53], "plu": [38, 47], "tesla2012": 38, "honda2012": 38, "essenti": 38, "steroid": 38, "particularli": 38, "predict": 38, "exclud": 38, "significantli": [38, 53], "speedup": 38, "shuffl": 38, "testmodel": 38, "clustering_kei": 38, "flat": 38, "19l": 38, "18l": 38, "17l": 38, "16l": 38, "15l": 38, "14l": 38, "13l": 38, "12l": 38, "11l": 38, "10l": 38, "9l": 38, "8l": 38, "7l": 38, "6l": 38, "5l": 38, "4l": 38, "3l": 38, "2l": 38, "1l": 38, "0l": 38, "50m": 38, "05": 38, "meaningless": 38, "assertionerror": 38, "anymor": [38, 55], "scylla": [38, 40, 46, 51, 55], "21": 38, "explor": 38, "unfamiliar": 38, "cqlengine_test": 38, "namedt": 38, "26": 38, "17": [38, 54], "774000": 38, "substanc": 39, "plug": 39, "signal": 39, "worker_process_init": 39, "beat_init": 39, "cql_cluster": 39, "cql_session": 39, "cassandra_init": 39, "period": 39, "app": [39, 43], "uwsgidecor": [39, 43], "postfork": [39, 43], "importerror": 39, "hook": [39, 43], "overview": [40, 41, 45, 48], "merg": 40, "THERE": 40, "bug": [40, 45], "segment": 40, "8733": 40, "subsequ": 40, "confus": [40, 55], "mistak": 40, "prudent": 40, "redund": 40, "cannon": 40, "submodul": [40, 55], "iron": 40, "various": 40, "reloc": 40, "modelexcept": 40, "undefinedkeyspaceexcept": 40, "ifnotexistswithcountercolumn": 40, "technic": 40, "serv": 40, "good": [40, 45], "junctur": 40, "invit": 40, "double_precis": [40, 55], "inititi": 40, "create_keyspac": 40, "delete_keyspac": 40, "intent": 40, "verb": 40, "polymorphic_kei": 40, "__polymorphic_key__": 40, "unchang": 40, "meant": 41, "assumpt": 41, "approach": [41, 45], "millsecond": 41, "easiest": [41, 46], "pytz": 41, "localtim": 41, "adher": 41, "tenant": 41, "utctimetupl": 41, "shift": 41, "tzinfo": 41, "intrins": 41, "clearer": 41, "rel": 41, "spec": 41, "defici": 41, "daylight": 41, "defacto": 41, "extern": 41, "preval": 41, "user_tz": 41, "central": 41, "timestamp_na": 41, "timestamp_utc": 41, "timestamp_pres": 41, "astimezon": 41, "deem": 41, "cumbersom": 41, "spell": 41, "marker": 41, "unlik": 41, "insanc": 41, "concern": 41, "explod": 42, "evolv": 42, "intact": 42, "simultan": 42, "local_queri": 42, "_": [42, 53], "node1_profil": 42, "node2_profil": 42, "node1": 42, "node2": 42, "scratch": 42, "locked_execut": 42, "node1_whitelist": 42, "tmp": 42, "copi": 42, "faq": [43, 45], "uwsgi": [43, 48], "flask": 43, "release_vers": [43, 44], "__name__": 43, "server_vers": 43, "00": 43, "000077": 43, "000153": 43, "000309": 43, "000368": 43, "279": 43, "77142": 43, "000422": 43, "000480": 43, "seq": 43, "scan": 43, "sstabl": 43, "9223372036854775808": 43, "000669": 43, "cell": 43, "000755": 43, "suggest": [44, 46], "machin": 44, "free": 44, "profile_long": 44, "email": 44, "practic": 44, "highli": 44, "user_lookup_stmt": 44, "user_ids_to_queri": 44, "although": [44, 55, 56], "althought": 44, "holder": 44, "credit": 44, "john": 44, "o": [44, 46, 54], "reilli": 44, "2644bada": 44, "852c": 44, "11e3": 44, "89fb": 44, "e0b9a54a6d93": 44, "foo": [44, 56], "bar": 44, "blah": 44, "comma": 44, "cast": 44, "varchar": 44, "frozenset": 44, "almost": 44, "ids_to_fetch": 44, "design": [44, 49], "handle_success": 44, "rememb": 44, "user1": [44, 54], "user_id1": 44, "user2": 44, "user_id2": 44, "user3_lookup": 44, "user_id3": 44, "user3": 44, "preemptiv": 44, "techniqu": 44, "my_tabl": 44, "list_col": 44, "licens": 45, "introduct": 45, "tip": 45, "upgrad": [45, 48, 54], "scylladb": [45, 53], "serverless": 45, "changelog": 45, "organ": 45, "ask": [45, 48], "question": [45, 48], "visit": 45, "softwar": 45, "foundat": 45, "feather": 45, "logo": 45, "ey": 45, "trademark": 45, "countri": 45, "No": 45, "endors": 45, "linux": 46, "tool": 46, "itself": [46, 55], "reinstal": 46, "22": 46, "abl": 46, "snappi": 46, "apt": 46, "hot": 46, "worth": 46, "cass_driver_build_concurr": 46, "xcode": 46, "clang": 46, "mno": 46, "fuse": 46, "madd": 46, "wunus": 46, "hard": 46, "archflag": 46, "wno": 46, "everyon": 46, "choic": [46, 49], "architectur": 46, "perhap": 46, "visual": 46, "studio": 46, "prompt": [46, 54], "shell": 46, "checkout": 46, "tarbal": 46, "gcc": 46, "sudo": 46, "dev": [46, 53], "redhat": 46, "fedora": 46, "yum": 46, "devel": 46, "engag": 46, "costli": 46, "cass_driver_no_cython": 46, "cass_driver_no_extens": 46, "span": 46, "invoc": 46, "setenv": 46, "libev4": 46, "rhel": 46, "brew": 46, "anywai": 46, "andrew": [46, 54], "mussei": [46, 54], "thorough": [46, 54], "outcom": 47, "pertin": 47, "reject": 47, "statu": [47, 53], "squar": 47, "bracket": 47, "AND": 47, "retun": 47, "jump": 48, "migrat": 48, "mutat": 48, "celeri": 48, "example_id": 48, "example1": 48, "example2": 48, "example3": 48, "em4": 48, "example4": 48, "em5": 48, "example5": 48, "em6": 48, "example6": 48, "em7": 48, "example7": 48, "em8": 48, "example8": 48, "q2": 48, "yourself": 49, "tunabl": 49, "pretti": 49, "mitig": 49, "jit": 49, "huge": 49, "goal": [49, 54], "Be": 49, "blog": 49, "pagedresulthandl": 50, "finished_ev": 50, "handle_pag": 50, "handle_err": 50, "process_row": 50, "stateless": 50, "capabl": 50, "web_sess": 50, "p": 50, "deploi": 52, "bundl": 52, "download": 52, "tab": 52, "veri": [52, 54], "program": 52, "path_to_bundle_yaml": 52, "get_clust": 52, "east": 52, "scylla_cloud": 52, "cluster_nam": 52, "onward": 53, "md": 53, "intranod": 53, "native_shard_aware_transport_port": 53, "native_shard_aware_transport_port_ssl": 53, "shard_aware_opt": 53, "enable_shard_aware_driv": 53, "is_shard_awar": 53, "disable_shardaware_port": 53, "shard_aware_stat": 53, "shards_count": 53, "scylla_rate_limit_error": 53, "rate": 53, "ratelimitreach": 53, "keyspace1": 53, "tbl": 53, "per_partition_rate_limit": 53, "max_writes_per_second": 53, "456": 53, "get_credenti": 54, "host_address": 54, "1234": 54, "wrap_socket": 54, "create_default_context": 54, "server_hostnam": 54, "keystor": 54, "intruct": 54, "cert": 54, "understand": 54, "demonstr": 54, "deploy": 54, "client_encryption_opt": 54, "keystore_password": 54, "mystorepass": 54, "require_client_auth": 54, "verify_mod": 54, "cert_requir": 54, "load_verify_loc": 54, "rootca": 54, "crt": 54, "truststor": 54, "jk": 54, "truststore_password": 54, "pem": 54, "conf": 54, "gen_client_cert": 54, "eof": 54, "req": 54, "distinguished_nam": 54, "req_distinguished_nam": 54, "output_password": 54, "root_cert_pass": 54, "default_bit": 54, "2048": 54, "cert_countri": 54, "cert_org_nam": 54, "ou": 54, "cert_ou": 54, "cn": 54, "root": 54, "Then": 54, "openssl": 54, "newkei": 54, "rsa": 54, "keyout": 54, "csr": 54, "x509": 54, "root_ca_base_nam": 54, "cakei": 54, "passin": 54, "crt_sign": 54, "cert_valid": 54, "cacreateseri": 54, "load_cert_chain": 54, "certfil": 54, "keyfil": 54, "crypto": 54, "tlsv1_2_method": 54, "set_verifi": 54, "verify_p": 54, "lambda": 54, "_1": 54, "_2": 54, "_3": 54, "_4": 54, "use_certificate_fil": 54, "use_privatekey_fil": 54, "ca_cert": 54, "ssl_version": 54, "ssl_opt": 54, "my": 54, "cert_req": 54, "risen": 54, "advanc": 54, "dseplaintextauthprovid": 54, "act": 54, "permiss": 54, "grant": 54, "role": 54, "plain": 54, "authorization_id": 54, "ticket": 54, "kinit": 54, "offici": [54, 55], "dse_graph": 55, "swap": 55, "rework": 55, "mesh": 55, "afterward": 55, "got": 55, "row_list": 55, "first_result": 55, "variant": 55, "brought": 55, "overhaul": 55, "highlight": 55, "nomenclatur": 55, "keyspace_nam": 55, "031ebb0": 55, "refresh_": 55, "_metadata": 55, "419fcdf": 55, "submit_schema_refresh": 55, "574266d": 55, "cqltype": 55, "bb984ee": 55, "e16a073": 55, "cc94073": 55, "from_datetim": 55, "96489cc": 55, "a2d3a98": 55, "4bd5909": 55, "__polymorphic_": 55, "__discrimin": 55, "9d98c8e": 55, "79efe97": 55, "citi": 55, "zip": [55, 56], "though": 55, "notabl": 55, "simpler": 55, "unclean": 55, "tell": 56, "insert_stat": 56, "otherstuff": 56, "first_row": 56, "fine": 56, "unprepar": 56, "parameter": 56, "interpol": 56}, "objects": {"": [[1, 0, 0, "-", "cassandra"]], "cassandra": [[1, 1, 1, "", "AlreadyExists"], [1, 1, 1, "", "AuthenticationFailed"], [1, 1, 1, "", "ConfigurationException"], [1, 3, 1, "", "ConsistencyLevel"], [1, 1, 1, "", "CoordinationFailure"], [1, 1, 1, "", "DriverException"], [1, 1, 1, "", "FunctionFailure"], [1, 1, 1, "", "InvalidRequest"], [1, 1, 1, "", "OperationTimedOut"], [1, 3, 1, "", "ProtocolVersion"], [1, 1, 1, "", "ReadFailure"], [1, 1, 1, "", "ReadTimeout"], [1, 1, 1, "", "RequestExecutionException"], [1, 1, 1, "", "RequestValidationException"], [1, 1, 1, "", "Timeout"], [1, 1, 1, "", "Unauthorized"], [1, 1, 1, "", "Unavailable"], [1, 3, 1, "", "UserAggregateDescriptor"], [1, 3, 1, "", "UserFunctionDescriptor"], [1, 1, 1, "", "WriteFailure"], [1, 1, 1, "", "WriteTimeout"], [1, 6, 1, "", "__version__"], [1, 6, 1, "", "__version_info__"], [2, 0, 0, "-", "auth"], [3, 0, 0, "-", "cluster"], [4, 0, 0, "-", "concurrent"], [5, 0, 0, "-", "connection"], [16, 0, 0, "-", "decoder"], [17, 0, 0, "-", "encoder"], [18, 0, 0, "-", "graph"], [25, 0, 0, "-", "metadata"], [26, 0, 0, "-", "metrics"], [27, 0, 0, "-", "policies"], [28, 0, 0, "-", "pool"], [29, 0, 0, "-", "protocol"], [30, 0, 0, "-", "query"], [31, 0, 0, "-", "timestamps"], [32, 0, 0, "-", "util"]], "cassandra.AlreadyExists": [[1, 2, 1, "", "keyspace"], [1, 2, 1, "", "table"]], "cassandra.ConsistencyLevel": [[1, 2, 1, "", "ALL"], [1, 2, 1, "", "ANY"], [1, 2, 1, "", "EACH_QUORUM"], [1, 2, 1, "", "LOCAL_ONE"], [1, 2, 1, "", "LOCAL_QUORUM"], [1, 2, 1, "", "LOCAL_SERIAL"], [1, 2, 1, "", "ONE"], [1, 2, 1, "", "QUORUM"], [1, 2, 1, "", "SERIAL"], [1, 2, 1, "", "THREE"], [1, 2, 1, "", "TWO"]], "cassandra.CoordinationFailure": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "error_code_map"], [1, 2, 1, "", "failures"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.FunctionFailure": [[1, 2, 1, "", "arg_types"], [1, 2, 1, "", "function"], [1, 2, 1, "", "keyspace"]], "cassandra.OperationTimedOut": [[1, 2, 1, "", "errors"], [1, 2, 1, "", "last_host"]], "cassandra.ProtocolVersion": [[1, 2, 1, "", "BETA_VERSIONS"], [1, 2, 1, "", "DSE_V1"], [1, 2, 1, "", "DSE_V2"], [1, 2, 1, "", "MAX_SUPPORTED"], [1, 2, 1, "", "MIN_SUPPORTED"], [1, 2, 1, "", "SUPPORTED_VERSIONS"], [1, 2, 1, "", "V1"], [1, 2, 1, "", "V2"], [1, 2, 1, "", "V3"], [1, 2, 1, "", "V4"], [1, 2, 1, "", "V5"], [1, 2, 1, "", "V6"], [1, 4, 1, "", "get_lower_supported"]], "cassandra.ReadFailure": [[1, 2, 1, "", "data_retrieved"]], "cassandra.ReadTimeout": [[1, 2, 1, "", "data_retrieved"]], "cassandra.Timeout": [[1, 2, 1, "", "consistency"], [1, 2, 1, "", "received_responses"], [1, 2, 1, "", "required_responses"]], "cassandra.Unavailable": [[1, 2, 1, "", "alive_replicas"], [1, 2, 1, "", "consistency"], [1, 2, 1, "", "required_replicas"]], "cassandra.UserAggregateDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.UserFunctionDescriptor": [[1, 2, 1, "", "argument_types"], [1, 2, 1, "", "name"], [1, 5, 1, "", "signature"]], "cassandra.WriteFailure": [[1, 2, 1, "", "write_type"]], "cassandra.WriteTimeout": [[1, 2, 1, "", "write_type"]], "cassandra.auth": [[2, 3, 1, "", "AuthProvider"], [2, 3, 1, "", "Authenticator"], [2, 3, 1, "", "PlainTextAuthProvider"], [2, 3, 1, "", "PlainTextAuthenticator"], [2, 3, 1, "", "SaslAuthProvider"], [2, 3, 1, "", "SaslAuthenticator"]], "cassandra.auth.AuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.Authenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"], [2, 4, 1, "", "on_authentication_success"], [2, 2, 1, "", "server_authenticator_class"]], "cassandra.auth.PlainTextAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.PlainTextAuthenticator": [[2, 4, 1, "", "evaluate_challenge"]], "cassandra.auth.SaslAuthProvider": [[2, 4, 1, "", "new_authenticator"]], "cassandra.auth.SaslAuthenticator": [[2, 4, 1, "", "evaluate_challenge"], [2, 4, 1, "", "initial_response"]], "cassandra.cluster": [[3, 3, 1, "", "Cluster"], [3, 6, 1, "", "EXEC_PROFILE_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_DEFAULT"], [3, 6, 1, "", "EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"], [3, 3, 1, "", "ExecutionProfile"], [3, 3, 1, "", "GraphAnalyticsExecutionProfile"], [3, 3, 1, "", "GraphExecutionProfile"], [3, 1, 1, "", "NoHostAvailable"], [3, 1, 1, "", "QueryExhausted"], [3, 3, 1, "", "ResponseFuture"], [3, 3, 1, "", "ResultSet"], [3, 3, 1, "", "Session"], [3, 1, 1, "", "UserTypeDoesNotExist"]], "cassandra.cluster.Cluster": [[3, 4, 1, "", "add_execution_profile"], [3, 2, 1, "", "address_translator"], [3, 2, 1, "", "auth_provider"], [3, 2, 1, "", "cloud"], [3, 2, 1, "", "compression"], [3, 4, 1, "", "connect"], [3, 2, 1, "", "connect_timeout"], [3, 2, 1, "", "connection_class"], [3, 2, 1, "", "contact_points"], [3, 2, 1, "", "control_connection_timeout"], [3, 2, 1, "", "conviction_policy_factory"], [3, 2, 1, "", "cql_version"], [3, 2, 1, "", "default_retry_policy"], [3, 2, 1, "", "endpoint_factory"], [3, 4, 1, "", "get_control_connection_host"], [3, 4, 1, "", "get_core_connections_per_host"], [3, 4, 1, "", "get_max_connections_per_host"], [3, 4, 1, "", "get_max_requests_per_connection"], [3, 4, 1, "", "get_min_requests_per_connection"], [3, 2, 1, "", "idle_heartbeat_interval"], [3, 2, 1, "", "idle_heartbeat_timeout"], [3, 2, 1, "", "load_balancing_policy"], [3, 2, 1, "", "max_schema_agreement_wait"], [3, 2, 1, "", "metadata"], [3, 2, 1, "", "metrics"], [3, 2, 1, "", "metrics_enabled"], [3, 2, 1, "", "port"], [3, 2, 1, "", "prepare_on_all_hosts"], [3, 2, 1, "", "protocol_version"], [3, 2, 1, "", "reconnection_policy"], [3, 4, 1, "", "refresh_keyspace_metadata"], [3, 4, 1, "", "refresh_nodes"], [3, 4, 1, "", "refresh_schema_metadata"], [3, 4, 1, "", "refresh_table_metadata"], [3, 4, 1, "", "refresh_user_aggregate_metadata"], [3, 4, 1, "", "refresh_user_function_metadata"], [3, 4, 1, "", "refresh_user_type_metadata"], [3, 4, 1, "", "register_listener"], [3, 4, 1, "", "register_user_type"], [3, 2, 1, "", "reprepare_on_up"], [3, 2, 1, "", "schema_event_refresh_window"], [3, 2, 1, "", "schema_metadata_enabled"], [3, 4, 1, "", "set_core_connections_per_host"], [3, 4, 1, "", "set_max_connections_per_host"], [3, 4, 1, "", "set_max_requests_per_connection"], [3, 4, 1, "", "set_meta_refresh_enabled"], [3, 4, 1, "", "set_min_requests_per_connection"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "sockopts"], [3, 2, 1, "", "ssl_context"], [3, 2, 1, "", "ssl_options"], [3, 2, 1, "", "status_event_refresh_window"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "token_metadata_enabled"], [3, 2, 1, "", "topology_event_refresh_window"], [3, 4, 1, "", "unregister_listener"]], "cassandra.cluster.ExecutionProfile": [[3, 2, 1, "", "consistency_level"], [3, 4, 1, "", "row_factory"]], "cassandra.cluster.ResponseFuture": [[3, 4, 1, "", "add_callback"], [3, 4, 1, "", "add_callbacks"], [3, 4, 1, "", "add_errback"], [3, 2, 1, "", "custom_payload"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 2, 1, "", "has_more_pages"], [3, 2, 1, "", "is_schema_agreed"], [3, 2, 1, "", "query"], [3, 4, 1, "", "result"], [3, 4, 1, "", "start_fetching_next_page"], [3, 2, 1, "", "warnings"]], "cassandra.cluster.ResultSet": [[3, 4, 1, "", "all"], [3, 5, 1, "", "current_rows"], [3, 4, 1, "", "fetch_next_page"], [3, 4, 1, "", "get_all_query_traces"], [3, 4, 1, "", "get_query_trace"], [3, 5, 1, "", "has_more_pages"], [3, 4, 1, "", "one"], [3, 5, 1, "", "paging_state"], [3, 5, 1, "", "was_applied"]], "cassandra.cluster.Session": [[3, 4, 1, "", "add_request_init_listener"], [3, 2, 1, "", "client_protocol_handler"], [3, 2, 1, "", "default_consistency_level"], [3, 2, 1, "", "default_fetch_size"], [3, 2, 1, "", "default_serial_consistency_level"], [3, 2, 1, "", "default_timeout"], [3, 2, 1, "", "encoder"], [3, 4, 1, "", "execute"], [3, 4, 1, "", "execute_async"], [3, 4, 1, "", "execute_graph"], [3, 4, 1, "", "execute_graph_async"], [3, 4, 1, "", "execution_profile_clone_update"], [3, 4, 1, "", "get_execution_profile"], [3, 4, 1, "", "prepare"], [3, 4, 1, "", "remove_request_init_listener"], [3, 2, 1, "", "row_factory"], [3, 4, 1, "", "set_keyspace"], [3, 4, 1, "", "shutdown"], [3, 2, 1, "", "timestamp_generator"], [3, 2, 1, "", "use_client_timestamp"]], "cassandra.concurrent": [[4, 7, 1, "", "execute_concurrent"], [4, 7, 1, "", "execute_concurrent_with_args"]], "cassandra.connection": [[5, 1, 1, "", "ConnectionBusy"], [5, 1, 1, "", "ConnectionException"], [5, 1, 1, "", "ConnectionShutdown"], [5, 3, 1, "", "EndPoint"], [5, 3, 1, "", "EndPointFactory"], [5, 1, 1, "", "ProtocolError"], [5, 3, 1, "", "SniEndPoint"], [5, 3, 1, "", "SniEndPointFactory"], [5, 3, 1, "", "UnixSocketEndPoint"]], "cassandra.connection.EndPoint": [[5, 5, 1, "", "address"], [5, 5, 1, "", "port"], [5, 4, 1, "", "resolve"], [5, 5, 1, "", "socket_family"], [5, 5, 1, "", "ssl_options"]], "cassandra.connection.EndPointFactory": [[5, 4, 1, "", "configure"], [5, 4, 1, "", "create"]], "cassandra.cqlengine": [[6, 0, 0, "-", "columns"], [7, 0, 0, "-", "connection"], [8, 0, 0, "-", "management"], [9, 0, 0, "-", "models"], [10, 0, 0, "-", "query"], [11, 0, 0, "-", "usertype"]], "cassandra.cqlengine.columns": [[6, 3, 1, "", "Ascii"], [6, 3, 1, "", "BigInt"], [6, 3, 1, "", "Blob"], [6, 3, 1, "", "Boolean"], [6, 2, 1, "", "Bytes"], [6, 3, 1, "", "Column"], [6, 3, 1, "", "Counter"], [6, 3, 1, "", "Date"], [6, 3, 1, "", "DateTime"], [6, 3, 1, "", "Decimal"], [6, 3, 1, "", "Double"], [6, 3, 1, "", "Float"], [6, 3, 1, "", "Integer"], [6, 3, 1, "", "List"], [6, 3, 1, "", "Map"], [6, 3, 1, "", "Set"], [6, 3, 1, "", "SmallInt"], [6, 3, 1, "", "Text"], [6, 3, 1, "", "Time"], [6, 3, 1, "", "TimeUUID"], [6, 3, 1, "", "TinyInt"], [6, 3, 1, "", "UUID"], [6, 3, 1, "", "UserDefinedType"], [6, 3, 1, "", "VarInt"]], "cassandra.cqlengine.columns.Column": [[6, 2, 1, "", "clustering_order"], [6, 2, 1, "", "custom_index"], [6, 2, 1, "", "db_field"], [6, 2, 1, "", "default"], [6, 2, 1, "", "discriminator_column"], [6, 2, 1, "", "index"], [6, 2, 1, "", "partition_key"], [6, 2, 1, "", "primary_key"], [6, 2, 1, "", "required"], [6, 2, 1, "", "static"]], "cassandra.cqlengine.columns.DateTime": [[6, 2, 1, "", "truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, 7, 1, "", "default"], [7, 7, 1, "", "register_connection"], [7, 7, 1, "", "set_default_connection"], [7, 7, 1, "", "set_session"], [7, 7, 1, "", "setup"], [7, 7, 1, "", "unregister_connection"]], "cassandra.cqlengine.management": [[8, 7, 1, "", "create_keyspace_network_topology"], [8, 7, 1, "", "create_keyspace_simple"], [8, 7, 1, "", "drop_keyspace"], [8, 7, 1, "", "drop_table"], [8, 7, 1, "", "sync_table"], [8, 7, 1, "", "sync_type"]], "cassandra.cqlengine.models": [[9, 3, 1, "", "Model"]], "cassandra.cqlengine.models.Model": [[9, 2, 1, "", "__abstract__"], [9, 2, 1, "", "__compute_routing_key__"], [9, 2, 1, "", "__connection__"], [9, 2, 1, "", "__default_ttl__"], [9, 2, 1, "", "__discriminator_value__"], [9, 2, 1, "", "__keyspace__"], [9, 2, 1, "", "__options__"], [9, 2, 1, "", "__table_name__"], [9, 2, 1, "", "__table_name_case_sensitive__"], [9, 4, 1, "", "all"], [9, 4, 1, "", "batch"], [9, 4, 1, "", "column_family_name"], [9, 4, 1, "", "create"], [9, 4, 1, "", "delete"], [9, 4, 1, "", "filter"], [9, 4, 1, "", "get"], [9, 4, 1, "", "if_exists"], [9, 4, 1, "", "if_not_exists"], [9, 4, 1, "", "iff"], [9, 4, 1, "", "items"], [9, 4, 1, "", "keys"], [9, 4, 1, "", "len"], [9, 4, 1, "", "m"], [9, 4, 1, "", "save"], [9, 4, 1, "", "timeout"], [9, 4, 1, "", "timestamp"], [9, 4, 1, "", "ttl"], [9, 4, 1, "", "update"], [9, 4, 1, "", "using"], [9, 4, 1, "", "values"]], "cassandra.cqlengine.query": [[10, 3, 1, "", "BatchQuery"], [10, 3, 1, "", "ContextQuery"], [10, 3, 1, "", "DoesNotExist"], [10, 3, 1, "", "LWTException"], [10, 3, 1, "", "ModelQuerySet"], [10, 3, 1, "", "MultipleObjectsReturned"]], "cassandra.cqlengine.query.BatchQuery": [[10, 4, 1, "", "add_callback"], [10, 4, 1, "", "add_query"], [10, 4, 1, "", "execute"]], "cassandra.cqlengine.query.ModelQuerySet": [[10, 4, 1, "", "all"], [10, 4, 1, "", "allow_filtering"], [10, 4, 1, "", "batch"], [10, 4, 1, "", "consistency"], [10, 4, 1, "", "count"], [10, 4, 1, "", "defer"], [10, 4, 1, "", "distinct"], [10, 4, 1, "", "fetch_size"], [10, 4, 1, "", "filter"], [10, 4, 1, "", "get"], [10, 4, 1, "", "if_exists"], [10, 4, 1, "", "if_not_exists"], [10, 4, 1, "", "len"], [10, 4, 1, "", "limit"], [10, 4, 1, "", "only"], [10, 4, 1, "", "order_by"], [10, 4, 1, "", "timestamp"], [10, 4, 1, "", "ttl"], [10, 4, 1, "", "update"], [10, 4, 1, "", "using"]], "cassandra.cqlengine.usertype": [[11, 3, 1, "", "UserType"]], "cassandra.cqlengine.usertype.UserType": [[11, 2, 1, "", "__type_name__"]], "cassandra.datastax": [[15, 0, 0, "-", "graph"]], "cassandra.datastax.graph.GraphOptions": [[15, 2, 1, "", "graph_language"], [15, 2, 1, "", "graph_name"], [15, 2, 1, "", "graph_read_consistency_level"], [15, 2, 1, "", "graph_source"], [15, 2, 1, "", "graph_write_consistency_level"], [15, 2, 1, "", "is_analytics_source"], [15, 2, 1, "", "is_default_source"], [15, 2, 1, "", "is_graph_source"], [15, 4, 1, "", "set_source_analytics"], [15, 4, 1, "", "set_source_default"], [15, 4, 1, "", "set_source_graph"]], "cassandra.datastax.graph.GraphSON1Deserializer": [[15, 4, 1, "", "deserialize_bigint"], [15, 4, 1, "", "deserialize_blob"], [15, 4, 1, "", "deserialize_date"], [15, 4, 1, "", "deserialize_decimal"], [15, 4, 1, "", "deserialize_double"], [15, 4, 1, "", "deserialize_duration"], [15, 4, 1, "", "deserialize_float"], [15, 4, 1, "", "deserialize_int"], [15, 4, 1, "", "deserialize_linestring"], [15, 4, 1, "", "deserialize_point"], [15, 4, 1, "", "deserialize_polygon"], [15, 4, 1, "", "deserialize_time"], [15, 4, 1, "", "deserialize_timestamp"], [15, 4, 1, "", "deserialize_uuid"]], "cassandra.datastax.graph": [[12, 0, 0, "-", "fluent"], [15, 7, 1, "", "graph_graphson2_row_factory"], [15, 7, 1, "", "graph_graphson3_row_factory"], [15, 7, 1, "", "graph_object_row_factory"], [15, 7, 1, "", "graph_result_row_factory"], [15, 7, 1, "", "single_object_row_factory"], [15, 7, 1, "", "to_bigint"], [15, 7, 1, "", "to_double"], [15, 7, 1, "", "to_float"], [15, 7, 1, "", "to_int"], [15, 7, 1, "", "to_smallint"]], "cassandra.datastax.graph.fluent": [[12, 3, 1, "", "BaseGraphRowFactory"], [12, 3, 1, "", "DSESessionRemoteGraphConnection"], [12, 3, 1, "", "DseGraph"], [12, 2, 1, "", "graph_traversal_dse_object_row_factory"], [12, 2, 1, "", "graph_traversal_row_factory"], [13, 0, 0, "-", "predicates"], [14, 0, 0, "-", "query"]], "cassandra.datastax.graph.fluent.DseGraph": [[12, 2, 1, "", "DSE_GRAPH_QUERY_LANGUAGE"], [12, 4, 1, "", "batch"], [12, 4, 1, "", "create_execution_profile"], [12, 4, 1, "", "query_from_traversal"], [12, 4, 1, "", "traversal_source"]], "cassandra.datastax.graph.fluent.predicates": [[13, 3, 1, "", "CqlCollection"], [13, 3, 1, "", "Geo"], [13, 3, 1, "", "Search"]], "cassandra.datastax.graph.fluent.predicates.CqlCollection": [[13, 4, 1, "", "contains"], [13, 4, 1, "", "contains_key"], [13, 4, 1, "", "contains_value"], [13, 4, 1, "", "entry_eq"]], "cassandra.datastax.graph.fluent.predicates.Geo": [[13, 4, 1, "", "inside"]], "cassandra.datastax.graph.fluent.predicates.Search": [[13, 4, 1, "", "fuzzy"], [13, 4, 1, "", "phrase"], [13, 4, 1, "", "prefix"], [13, 4, 1, "", "regex"], [13, 4, 1, "", "token"], [13, 4, 1, "", "token_fuzzy"], [13, 4, 1, "", "token_prefix"], [13, 4, 1, "", "token_regex"]], "cassandra.datastax.graph.fluent.query": [[14, 3, 1, "", "TraversalBatch"]], "cassandra.datastax.graph.fluent.query.TraversalBatch": [[14, 4, 1, "", "add"], [14, 4, 1, "", "add_all"], [14, 4, 1, "", "as_graph_statement"], [14, 4, 1, "", "clear"], [14, 4, 1, "", "execute"]], "cassandra.decoder": [[16, 7, 1, "", "dict_factory"], [16, 7, 1, "", "named_tuple_factory"], [16, 7, 1, "", "ordered_dict_factory"], [16, 7, 1, "", "tuple_factory"]], "cassandra.encoder": [[17, 3, 1, "", "Encoder"]], "cassandra.encoder.Encoder": [[17, 4, 1, "", "cql_encode_all_types"], [17, 4, 1, "", "cql_encode_bytes"], [17, 4, 1, "", "cql_encode_date"], [17, 4, 1, "", "cql_encode_datetime"], [17, 4, 1, "", "cql_encode_list_collection"], [17, 4, 1, "", "cql_encode_map_collection"], [17, 4, 1, "", "cql_encode_none"], [17, 4, 1, "", "cql_encode_object"], [17, 4, 1, "", "cql_encode_sequence"], [17, 4, 1, "", "cql_encode_set_collection"], [17, 4, 1, "", "cql_encode_str"], [17, 4, 1, "", "cql_encode_tuple"], [17, 4, 1, "", "cql_encode_unicode"], [17, 2, 1, "", "mapping"]], "cassandra.graph": [[18, 3, 1, "", "Edge"], [18, 3, 1, "", "GraphOptions"], [18, 3, 1, "", "GraphProtocol"], [18, 3, 1, "", "GraphSON1Deserializer"], [18, 3, 1, "", "GraphSON1Serializer"], [18, 3, 1, "", "GraphSON2Reader"], [18, 3, 1, "", "GraphSON3Reader"], [18, 3, 1, "", "Path"], [18, 3, 1, "", "Result"], [18, 3, 1, "", "SimpleGraphStatement"], [18, 3, 1, "", "Vertex"], [18, 3, 1, "", "VertexProperty"], [18, 7, 1, "", "graph_graphson2_row_factory"], [18, 7, 1, "", "graph_graphson3_row_factory"], [18, 7, 1, "", "graph_object_row_factory"], [18, 7, 1, "", "graph_result_row_factory"], [18, 7, 1, "", "single_object_row_factory"], [18, 7, 1, "", "to_bigint"], [18, 7, 1, "", "to_double"], [18, 7, 1, "", "to_float"], [18, 7, 1, "", "to_int"], [18, 7, 1, "", "to_smallint"]], "cassandra.graph.GraphOptions": [[18, 2, 1, "", "graph_language"], [18, 2, 1, "", "graph_name"], [18, 2, 1, "", "graph_read_consistency_level"], [18, 2, 1, "", "graph_source"], [18, 2, 1, "", "graph_write_consistency_level"], [18, 2, 1, "", "is_analytics_source"], [18, 2, 1, "", "is_default_source"], [18, 2, 1, "", "is_graph_source"], [18, 4, 1, "", "set_source_analytics"], [18, 4, 1, "", "set_source_default"], [18, 4, 1, "", "set_source_graph"]], "cassandra.graph.GraphProtocol": [[18, 2, 1, "", "GRAPHSON_1_0"], [18, 2, 1, "", "GRAPHSON_2_0"], [18, 2, 1, "", "GRAPHSON_3_0"]], "cassandra.graph.GraphSON1Deserializer": [[18, 4, 1, "", "deserialize_bigint"], [18, 4, 1, "", "deserialize_blob"], [18, 4, 1, "", "deserialize_date"], [18, 4, 1, "", "deserialize_decimal"], [18, 4, 1, "", "deserialize_double"], [18, 4, 1, "", "deserialize_duration"], [18, 4, 1, "", "deserialize_float"], [18, 4, 1, "", "deserialize_int"], [18, 4, 1, "", "deserialize_linestring"], [18, 4, 1, "", "deserialize_point"], [18, 4, 1, "", "deserialize_polygon"], [18, 4, 1, "", "deserialize_time"], [18, 4, 1, "", "deserialize_timestamp"], [18, 4, 1, "", "deserialize_uuid"]], "cassandra.graph.GraphSON2Reader": [[18, 4, 1, "", "deserialize"], [18, 4, 1, "", "read"]], "cassandra.graph.Path": [[18, 2, 1, "", "labels"], [18, 2, 1, "", "objects"]], "cassandra.graph.Result": [[18, 4, 1, "", "as_edge"], [18, 4, 1, "", "as_path"], [18, 4, 1, "", "as_vertex"], [18, 2, 1, "", "value"]], "cassandra.graph.VertexProperty": [[18, 2, 1, "", "label"], [18, 2, 1, "", "properties"], [18, 2, 1, "", "value"]], "cassandra.io": [[19, 0, 0, "-", "asyncioreactor"], [20, 0, 0, "-", "asyncorereactor"], [21, 0, 0, "-", "eventletreactor"], [22, 0, 0, "-", "geventreactor"], [23, 0, 0, "-", "libevreactor"], [24, 0, 0, "-", "twistedreactor"]], "cassandra.io.asyncioreactor": [[19, 3, 1, "", "AsyncioConnection"]], "cassandra.io.asyncioreactor.AsyncioConnection": [[19, 4, 1, "", "initialize_reactor"]], "cassandra.io.asyncorereactor": [[20, 3, 1, "", "AsyncoreConnection"]], "cassandra.io.asyncorereactor.AsyncoreConnection": [[20, 4, 1, "", "handle_fork"], [20, 4, 1, "", "initialize_reactor"]], "cassandra.io.eventletreactor": [[21, 3, 1, "", "EventletConnection"]], "cassandra.io.eventletreactor.EventletConnection": [[21, 4, 1, "", "initialize_reactor"], [21, 4, 1, "", "service_timeouts"]], "cassandra.io.geventreactor": [[22, 3, 1, "", "GeventConnection"]], "cassandra.io.geventreactor.GeventConnection": [[22, 4, 1, "", "initialize_reactor"]], "cassandra.io.libevreactor": [[23, 3, 1, "", "LibevConnection"]], "cassandra.io.twistedreactor": [[24, 3, 1, "", "TwistedConnection"]], "cassandra.metadata": [[25, 3, 1, "", "Aggregate"], [25, 3, 1, "", "BytesToken"], [25, 3, 1, "", "ColumnMetadata"], [25, 3, 1, "", "EdgeMetadata"], [25, 3, 1, "", "Function"], [25, 3, 1, "", "IndexMetadata"], [25, 3, 1, "", "KeyspaceMetadata"], [25, 3, 1, "", "LocalStrategy"], [25, 3, 1, "", "MD5Token"], [25, 3, 1, "", "MaterializedViewMetadata"], [25, 3, 1, "", "Metadata"], [25, 3, 1, "", "Murmur3Token"], [25, 3, 1, "", "NetworkTopologyStrategy"], [25, 3, 1, "", "ReplicationFactor"], [25, 2, 1, "", "ReplicationStrategy"], [25, 3, 1, "", "SimpleStrategy"], [25, 3, 1, "", "TableMetadata"], [25, 3, 1, "", "TableMetadataDSE68"], [25, 3, 1, "", "TableMetadataV3"], [25, 3, 1, "", "Token"], [25, 3, 1, "", "TokenMap"], [25, 3, 1, "", "UserType"], [25, 3, 1, "", "VertexMetadata"], [25, 6, 1, "", "cql_keywords"], [25, 6, 1, "", "cql_keywords_reserved"], [25, 6, 1, "", "cql_keywords_unreserved"], [25, 7, 1, "", "group_keys_by_replica"]], "cassandra.metadata.Aggregate": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.BytesToken": [[25, 4, 1, "", "from_string"]], "cassandra.metadata.Function": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.IndexMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.KeyspaceMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"]], "cassandra.metadata.LocalStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.MaterializedViewMetadata": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.Metadata": [[25, 4, 1, "", "add_or_return_host"], [25, 4, 1, "", "all_hosts"], [25, 4, 1, "", "export_schema_as_string"], [25, 4, 1, "", "get_host"], [25, 4, 1, "", "get_host_by_host_id"], [25, 4, 1, "", "get_replicas"]], "cassandra.metadata.NetworkTopologyStrategy": [[25, 4, 1, "", "export_for_schema"]], "cassandra.metadata.SimpleStrategy": [[25, 4, 1, "", "export_for_schema"], [25, 5, 1, "", "replication_factor"]], "cassandra.metadata.TableMetadata": [[25, 4, 1, "", "as_cql_query"], [25, 4, 1, "", "export_as_string"], [25, 5, 1, "", "is_cql_compatible"], [25, 5, 1, "", "primary_key"]], "cassandra.metadata.TableMetadataDSE68": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metadata.TableMetadataV3": [[25, 5, 1, "", "is_cql_compatible"]], "cassandra.metadata.TokenMap": [[25, 4, 1, "", "get_replicas"]], "cassandra.metadata.UserType": [[25, 4, 1, "", "as_cql_query"]], "cassandra.metrics": [[26, 3, 1, "", "Metrics"]], "cassandra.metrics.Metrics": [[26, 2, 1, "", "connected_to"], [26, 2, 1, "", "connection_errors"], [26, 4, 1, "", "get_stats"], [26, 2, 1, "", "ignores"], [26, 2, 1, "", "known_hosts"], [26, 2, 1, "", "open_connections"], [26, 2, 1, "", "other_errors"], [26, 2, 1, "", "read_timeouts"], [26, 2, 1, "", "request_timer"], [26, 2, 1, "", "retries"], [26, 4, 1, "", "set_stats_name"], [26, 2, 1, "", "unavailables"], [26, 2, 1, "", "write_timeouts"]], "cassandra.policies": [[27, 3, 1, "", "AddressTranslator"], [27, 3, 1, "", "ConstantReconnectionPolicy"], [27, 3, 1, "", "ConstantSpeculativeExecutionPolicy"], [27, 3, 1, "", "ConvictionPolicy"], [27, 3, 1, "", "DCAwareRoundRobinPolicy"], [27, 3, 1, "", "DSELoadBalancingPolicy"], [27, 3, 1, "", "DefaultLoadBalancingPolicy"], [27, 3, 1, "", "DowngradingConsistencyRetryPolicy"], [27, 3, 1, "", "EC2MultiRegionTranslator"], [27, 3, 1, "", "ExponentialReconnectionPolicy"], [27, 3, 1, "", "FallthroughRetryPolicy"], [27, 3, 1, "", "HostDistance"], [27, 3, 1, "", "HostFilterPolicy"], [27, 3, 1, "", "IdentityTranslator"], [27, 3, 1, "", "LoadBalancingPolicy"], [27, 3, 1, "", "ReconnectionPolicy"], [27, 3, 1, "", "RetryPolicy"], [27, 3, 1, "", "RoundRobinPolicy"], [27, 3, 1, "", "SimpleConvictionPolicy"], [27, 3, 1, "", "SpeculativeExecutionPolicy"], [27, 3, 1, "", "TokenAwarePolicy"], [27, 3, 1, "", "WhiteListRoundRobinPolicy"], [27, 3, 1, "", "WriteType"]], "cassandra.policies.AddressTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ConstantReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.ConstantSpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.ConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.DCAwareRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.DefaultLoadBalancingPolicy": [[27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.DowngradingConsistencyRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.EC2MultiRegionTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.ExponentialReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.FallthroughRetryPolicy": [[27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.HostDistance": [[27, 2, 1, "", "IGNORED"], [27, 2, 1, "", "LOCAL"], [27, 2, 1, "", "REMOTE"]], "cassandra.policies.HostFilterPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "predicate"]], "cassandra.policies.IdentityTranslator": [[27, 4, 1, "", "translate"]], "cassandra.policies.LoadBalancingPolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "populate"]], "cassandra.policies.ReconnectionPolicy": [[27, 4, 1, "", "new_schedule"]], "cassandra.policies.RetryPolicy": [[27, 2, 1, "", "IGNORE"], [27, 2, 1, "", "RETHROW"], [27, 2, 1, "", "RETRY"], [27, 2, 1, "", "RETRY_NEXT_HOST"], [27, 4, 1, "", "on_read_timeout"], [27, 4, 1, "", "on_request_error"], [27, 4, 1, "", "on_unavailable"], [27, 4, 1, "", "on_write_timeout"]], "cassandra.policies.RoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.SimpleConvictionPolicy": [[27, 4, 1, "", "add_failure"], [27, 4, 1, "", "reset"]], "cassandra.policies.SpeculativeExecutionPolicy": [[27, 4, 1, "", "new_plan"]], "cassandra.policies.TokenAwarePolicy": [[27, 4, 1, "", "check_supported"], [27, 4, 1, "", "distance"], [27, 4, 1, "", "make_query_plan"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_down"], [27, 4, 1, "", "on_remove"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"], [27, 2, 1, "", "shuffle_replicas"]], "cassandra.policies.WhiteListRoundRobinPolicy": [[27, 4, 1, "", "distance"], [27, 4, 1, "", "on_add"], [27, 4, 1, "", "on_up"], [27, 4, 1, "", "populate"]], "cassandra.policies.WriteType": [[27, 2, 1, "", "BATCH"], [27, 2, 1, "", "BATCH_LOG"], [27, 2, 1, "", "CAS"], [27, 2, 1, "", "CDC"], [27, 2, 1, "", "COUNTER"], [27, 2, 1, "", "SIMPLE"], [27, 2, 1, "", "UNLOGGED_BATCH"], [27, 2, 1, "", "VIEW"]], "cassandra.pool": [[28, 3, 1, "", "Host"], [28, 1, 1, "", "NoConnectionsAvailable"]], "cassandra.pool.Host": [[28, 5, 1, "", "address"], [28, 5, 1, "", "datacenter"], [28, 5, 1, "", "rack"]], "cassandra.protocol": [[29, 3, 1, "", "_ProtocolHandler"]], "cassandra.protocol._ProtocolHandler": [[29, 4, 1, "", "decode_message"], [29, 4, 1, "", "encode_message"], [29, 2, 1, "", "message_types_by_opcode"]], "cassandra.query": [[30, 3, 1, "", "BatchStatement"], [30, 3, 1, "", "BatchType"], [30, 3, 1, "", "BoundStatement"], [30, 3, 1, "", "PreparedStatement"], [30, 3, 1, "", "QueryTrace"], [30, 3, 1, "", "SimpleStatement"], [30, 3, 1, "", "Statement"], [30, 3, 1, "", "TraceEvent"], [30, 1, 1, "", "TraceUnavailable"], [30, 6, 1, "", "UNSET_VALUE"], [30, 3, 1, "", "ValueSequence"], [30, 7, 1, "", "dict_factory"], [30, 7, 1, "", "named_tuple_factory"], [30, 7, 1, "", "ordered_dict_factory"], [30, 7, 1, "", "tuple_factory"]], "cassandra.query.BatchStatement": [[30, 4, 1, "", "add"], [30, 4, 1, "", "add_all"], [30, 4, 1, "", "clear"], [30, 2, 1, "", "serial_consistency_level"]], "cassandra.query.BatchType": [[30, 2, 1, "", "COUNTER"], [30, 2, 1, "", "LOGGED"], [30, 2, 1, "", "UNLOGGED"]], "cassandra.query.BoundStatement": [[30, 4, 1, "", "bind"], [30, 5, 1, "", "routing_key"]], "cassandra.query.PreparedStatement": [[30, 4, 1, "", "bind"]], "cassandra.query.QueryTrace": [[30, 4, 1, "", "populate"]], "cassandra.query.Statement": [[30, 5, 1, "", "routing_key"], [30, 5, 1, "", "serial_consistency_level"]], "cassandra.timestamps": [[31, 3, 1, "", "MonotonicTimestampGenerator"]], "cassandra.timestamps.MonotonicTimestampGenerator": [[31, 4, 1, "", "_next_timestamp"], [31, 2, 1, "", "warn_on_drift"], [31, 2, 1, "", "warning_interval"], [31, 2, 1, "", "warning_threshold"]], "cassandra.util": [[32, 3, 1, "", "Date"], [32, 3, 1, "", "DateRange"], [32, 3, 1, "", "DateRangeBound"], [32, 3, 1, "", "DateRangePrecision"], [32, 3, 1, "", "Distance"], [32, 3, 1, "", "Duration"], [32, 3, 1, "", "LineString"], [32, 3, 1, "", "OrderedMap"], [32, 3, 1, "", "OrderedMapSerializedKey"], [32, 3, 1, "", "Point"], [32, 3, 1, "", "Polygon"], [32, 3, 1, "", "SortedSet"], [32, 3, 1, "", "Time"], [32, 3, 1, "", "Version"], [32, 7, 1, "", "datetime_from_timestamp"], [32, 7, 1, "", "datetime_from_uuid1"], [32, 7, 1, "", "max_uuid_from_time"], [32, 7, 1, "", "min_uuid_from_time"], [32, 7, 1, "", "ms_timestamp_from_datetime"], [32, 2, 1, "", "sortedset"], [32, 7, 1, "", "unix_time_from_uuid1"], [32, 7, 1, "", "utc_datetime_from_ms_timestamp"], [32, 7, 1, "", "uuid_from_time"]], "cassandra.util.Date": [[32, 4, 1, "", "date"], [32, 5, 1, "", "seconds"]], "cassandra.util.DateRange": [[32, 2, 1, "", "lower_bound"], [32, 2, 1, "", "upper_bound"], [32, 2, 1, "", "value"]], "cassandra.util.DateRangeBound": [[32, 4, 1, "", "datetime"], [32, 4, 1, "", "from_value"], [32, 2, 1, "", "milliseconds"], [32, 2, 1, "", "precision"]], "cassandra.util.Distance": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.LineString": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Point": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Polygon": [[32, 4, 1, "", "from_wkt"]], "cassandra.util.Time": [[32, 5, 1, "", "hour"], [32, 5, 1, "", "minute"], [32, 5, 1, "", "nanosecond"], [32, 5, 1, "", "second"], [32, 4, 1, "", "time"]], "cqlengine": [[37, 0, 0, "-", "models"], [38, 0, 0, "-", "queryset"]], "cqlengine.queryset": [[38, 3, 1, "", "MaxTimeUUID"], [38, 3, 1, "", "MinTimeUUID"]]}, "objtypes": {"0": "py:module", "1": "py:exception", "2": "py:attribute", "3": "py:class", "4": "py:method", "5": "py:property", "6": "py:data", "7": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "exception", "Python exception"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "class", "Python class"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "data", "Python data"], "7": ["py", "function", "Python function"]}, "titleterms": {"changelog": 0, "3": [0, 54, 55], "26": 0, "0": [0, 54, 55], "featur": [0, 29, 53, 55], "bug": 0, "fix": 0, "other": 0, "deprec": [0, 40, 55], "25": 0, "24": 0, "23": 0, "22": 0, "21": 0, "20": 0, "2": [0, 55], "1": [0, 55], "19": 0, "18": 0, "17": 0, "16": [0, 54], "15": 0, "14": 0, "13": 0, "12": 0, "11": 0, "10": 0, "9": 0, "8": 0, "7": 0, "6": 0, "5": 0, "4": 0, "0rc1": 0, "0c2": 0, "0c1": 0, "0b1": 0, "merg": 0, "from": [0, 36, 55], "x": [0, 55], "upgrad": [0, 40, 55], "final": 0, "0b7": 0, "0b6": 0, "0b5": 0, "beta4": 0, "beta3": 0, "beta2": 0, "beta": 0, "cassandra": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 41, 44, 45, 55], "except": [1, 40], "enum": 1, "auth": 2, "authent": [2, 54, 55], "cluster": [3, 42, 44, 53, 55], "session": [3, 44, 55], "concurr": 4, "util": [4, 32], "statement": [4, 15, 17, 18, 30, 44, 55], "execut": [4, 34, 42, 44, 54, 55], "connect": [5, 7, 21, 28, 35, 43, 44], "low": 5, "level": [5, 40, 44, 55], "info": 5, "cqlengin": [6, 7, 8, 9, 10, 11, 40], "column": [6, 40], "type": [6, 11, 37, 40, 44, 53, 55, 56], "object": [6, 9, 10, 33, 38, 48], "map": [6, 9, 42, 56], "model": [6, 9, 10, 11, 35, 36, 37, 40], "manag": [7, 8, 35, 40, 43], "schema": [8, 25, 40], "tabl": [9, 38], "queri": [10, 14, 30, 34, 36, 38, 43, 44, 50, 55], "filter": [10, 38], "queryset": [10, 35, 38], "usertyp": 11, "class": [11, 56], "user": [11, 37, 55, 56], "defin": [11, 37, 55, 56], "datastax": [12, 13, 14, 15, 33], "graph": [12, 13, 14, 15, 18, 33, 46, 55], "fluent": [12, 13, 14], "predic": 13, "option": [15, 18, 46], "row": [15, 18, 30, 36], "factori": [15, 18, 30], "decod": 16, "data": 16, "return": [16, 55], "format": 16, "encod": [17, 55], "non": [17, 46, 55], "prepar": [17, 30, 44, 55], "io": [19, 20, 21, 22, 23, 24, 43], "asyncioreactor": 19, "asyncio": 19, "event": [19, 20, 22, 23, 24], "loop": [19, 20, 22, 23, 24], "asyncorereactor": 20, "asyncor": 20, "eventletreactor": 21, "eventlet": [21, 54], "compat": [21, 22], "geventreactor": 22, "gevent": 22, "libevreactor": 23, "libev": [23, 46], "twistedreactor": 24, "twist": [24, 54], "metadata": [25, 55], "ring": 25, "topologi": 25, "token": [25, 38], "metric": [26, 46], "perform": [26, 49], "polici": 27, "load": 27, "balanc": 27, "failur": 27, "handl": [27, 50], "translat": 27, "server": [27, 54], "node": 27, "address": 27, "mark": 27, "host": [27, 28], "up": [27, 46], "down": 27, "reconnect": 27, "dead": 27, "retri": [27, 43], "fail": 27, "oper": [27, 38, 43], "idempot": 27, "pool": 28, "protocol": [29, 54, 55], "custom": [29, 54, 55], "payload": 29, "faster": 29, "deseri": 29, "batch": [30, 34, 36, 55], "trace": [30, 43, 55], "timestamp": [31, 41, 55], "gener": [31, 34], "api": [33, 40, 55], "document": 33, "core": 33, "driver": [33, 43, 45], "mapper": [33, 48], "us": [34, 42, 55, 56], "pattern": 34, "callback": [34, 50], "log": 34, "v": 34, "unlog": 34, "regist": [35, 56], "new": [35, 53], "chang": [35, 40, 55], "default": [35, 38, 42, 47, 55], "unregist": 35, "select": 35, "instanc": [35, 37, 42], "context": 35, "batchqueri": 35, "frequent": [36, 43], "ask": [36, 43], "question": [36, 43], "why": [36, 43], "don": 36, "t": 36, "updat": [36, 55], "work": [36, 41, 55], "correctli": 36, "instanti": 36, "field": 36, "valu": [36, 38], "field2": 36, "value2": 36, "how": [36, 43], "preserv": 36, "order": [36, 38], "can": 36, "i": [36, 43, 55], "delet": 36, "individu": 36, "exampl": [37, 54], "definit": 37, "manipul": 37, "dictionari": 37, "extend": 37, "valid": 37, "inherit": [37, 40], "make": 38, "retriev": 38, "all": 38, "access": 38, "timeuuid": [38, 40], "function": [38, 40], "ar": [38, 55], "immut": 38, "list": [38, 40], "per": 38, "timeout": [38, 43], "ttl": 38, "name": [38, 42, 55], "third": 39, "parti": 39, "integr": 39, "celeri": 39, "uwsgi": 39, "guid": 40, "prepend": 40, "revers": 40, "date": [40, 41], "remov": [40, 55], "organ": 40, "import": [40, 55], "packag": 40, "alias": 40, "unicodemixin": 40, "consolid": 40, "float": 40, "doubl": 40, "overload": 40, "from_datetim": 40, "time": 41, "datetyp": 41, "write": 41, "path": 41, "read": 41, "profil": [42, 44], "legaci": 42, "paramet": [42, 44, 55], "initi": 42, "ad": 42, "pass": [42, 44], "without": [42, 56], "do": 43, "my": 43, "wsgi": 43, "applic": 43, "request": 43, "determin": 43, "replica": 43, "doe": 43, "get": [44, 45, 48], "start": [44, 48], "keyspac": 44, "cql": 44, "convers": 44, "asynchron": 44, "set": [44, 47], "consist": [44, 55], "specul": 44, "python": [45, 46], "scylla": [45, 53], "apach": 45, "content": [45, 48], "help": 45, "report": 45, "issu": 45, "copyright": 45, "instal": [46, 55], "support": 46, "platform": 46, "through": 46, "pip": 46, "verifi": [46, 54], "your": 46, "compress": 46, "speed": 46, "osx": 46, "error": [46, 53], "window": 46, "note": [46, 49], "manual": 46, "depend": [46, 55], "c": 46, "extens": [46, 49], "cython": [46, 49], "base": [46, 55], "configur": [46, 54], "ssl": [46, 54], "lightweight": [47, 55], "transact": [47, 55], "compar": 47, "special": 47, "result": [47, 50, 55], "named_tuple_factori": 47, "tuple_factori": 47, "dict_factori": 47, "pypi": 49, "multiprocess": 49, "page": [50, 55], "larg": 50, "control": 50, "size": 50, "resum": 50, "scylladb": [51, 52], "cloud": [51, 52], "serverless": 52, "specif": 53, "shard": 53, "awar": 53, "helper": 53, "secur": 54, "v1": 54, "No": 54, "ident": 54, "verif": 54, "client": [54, 55], "version": 54, "lower": 54, "dse": [54, 55], "unifi": 54, "proxi": 54, "login": 54, "modul": 55, "execute_async": 55, "now": 55, "local_on": 55, "normal": 55, "inform": 55, "attach": 55, "bind": 55, "ignor": 55, "extra": 55, "blist": 55, "soft": 55, "sever": 55, "v3": 55, "nativ": 55, "side": 55, "v2": 55, "automat": 55, "sasl": 55, "call": 55, "shutdown": 55, "udt": 56, "dict": 56, "them": 56}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Making Queries": [[38, "module-cqlengine.queryset"]], "Retrieving objects": [[38, "retrieving-objects"]], "Retrieving all objects": [[38, "retrieving-all-objects"]], "Retrieving objects with filters": [[38, "retrieving-objects-with-filters"]], "Accessing objects in a QuerySet": [[38, "accessing-objects-in-a-queryset"]], "Filtering Operators": [[38, "filtering-operators"]], "TimeUUID Functions": [[38, "timeuuid-functions"]], "Token Function": [[38, "token-function"]], "QuerySets are immutable": [[38, "querysets-are-immutable"]], "Ordering QuerySets": [[38, "ordering-querysets"]], "Values Lists": [[38, "values-lists"]], "Per Query Timeouts": [[38, "per-query-timeouts"]], "Default TTL and Per Query TTL": [[38, "default-ttl-and-per-query-ttl"]], "Named Tables": [[38, "named-tables"]], "Models": [[37, "module-cqlengine.models"]], "Example Definitions": [[37, "example-definitions"]], "Manipulating model instances as dictionaries": [[37, "manipulating-model-instances-as-dictionaries"]], "Extending Model Validation": [[37, "extending-model-validation"]], "Model Inheritance": [[37, "model-inheritance"], [40, "model-inheritance"]], "User Defined Types": [[37, "user-defined-types"], [56, "user-defined-types"]], "Working with Dates and Times": [[41, "working-with-dates-and-times"]], "timestamps (Cassandra DateType)": [[41, "timestamps-cassandra-datetype"]], "Write Path": [[41, "write-path"], [41, "id1"]], "Read Path": [[41, "read-path"], [41, "id2"]], "date, time (Cassandra DateType)": [[41, "date-time-cassandra-datetype"]], "Third party integrations": [[39, "third-party-integrations"]], "Celery": [[39, "celery"]], "uWSGI": [[39, "uwsgi"]], "API Documentation": [[33, "api-documentation"]], "Core Driver": [[33, "core-driver"]], "Object Mapper": [[33, "object-mapper"], [48, "object-mapper"]], "DataStax Graph": [[33, "datastax-graph"]], "Frequently Asked Questions": [[36, "frequently-asked-questions"], [43, "frequently-asked-questions"]], "Why don\u2019t updates work correctly on models instantiated as Model(field=value, field2=value2)?": [[36, "why-don-t-updates-work-correctly-on-models-instantiated-as-model-field-value-field2-value2"]], "How to preserve ordering in batch query?": [[36, "how-to-preserve-ordering-in-batch-query"]], "How can I delete individual values from a row?": [[36, "how-can-i-delete-individual-values-from-a-row"]], "Why do connections or IO operations timeout in my WSGI application?": [[43, "why-do-connections-or-io-operations-timeout-in-my-wsgi-application"]], "How do I trace a request?": [[43, "how-do-i-trace-a-request"]], "How do I determine the replicas for a query?": [[43, "how-do-i-determine-the-replicas-for-a-query"]], "How does the driver manage request retries?": [[43, "how-does-the-driver-manage-request-retries"]], "Batch Queries": [[34, "batch-queries"]], "Batch Query General Use Pattern": [[34, "batch-query-general-use-pattern"]], "Batch Query Execution Callbacks": [[34, "batch-query-execution-callbacks"]], "Logged vs Unlogged Batches": [[34, "logged-vs-unlogged-batches"]], "Execution Profiles": [[42, "execution-profiles"], [44, "execution-profiles"]], "Mapping Legacy Parameters to Profiles": [[42, "mapping-legacy-parameters-to-profiles"]], "Using Execution Profiles": [[42, "using-execution-profiles"]], "Default": [[42, "default"]], "Initializing cluster with profiles": [[42, "initializing-cluster-with-profiles"]], "Adding named profiles": [[42, "adding-named-profiles"]], "Passing a profile instance without mapping": [[42, "passing-a-profile-instance-without-mapping"]], "Upgrade Guide": [[40, "upgrade-guide"]], "Functional Changes": [[40, "functional-changes"]], "List Prepend Reversing": [[40, "list-prepend-reversing"]], "Date Column Type": [[40, "date-column-type"]], "Remove cqlengine": [[40, "remove-cqlengine"]], "Organization": [[40, "organization"]], "Imports": [[40, "imports"]], "Package-Level Aliases": [[40, "package-level-aliases"]], "Exceptions": [[40, "exceptions"]], "UnicodeMixin Consolidation": [[40, "unicodemixin-consolidation"]], "API Deprecations": [[40, "api-deprecations"]], "Float/Double Overload": [[40, "float-double-overload"]], "Schema Management": [[40, "schema-management"]], "TimeUUID.from_datetime": [[40, "timeuuid-from-datetime"]], "Connections": [[35, "connections"]], "Register a new connection": [[35, "register-a-new-connection"]], "Change the default connection": [[35, "change-the-default-connection"]], "Unregister a connection": [[35, "unregister-a-connection"]], "Management": [[35, "management"]], "Connection Selection": [[35, "connection-selection"]], "Default Model Connection": [[35, "default-model-connection"]], "QuerySet and model instance": [[35, "queryset-and-model-instance"]], "Context Manager": [[35, "context-manager"]], "BatchQuery": [[35, "batchquery"]], "Upgrading": [[55, "upgrading"]], "Installation": [[55, "installation"], [46, "installation"]], "Import from the cassandra module": [[55, "import-from-the-cassandra-module"]], "dse-graph": [[55, "dse-graph"]], "Session.execute and Session.execute_async API": [[55, "session-execute-and-session-execute-async-api"]], "Deprecations": [[55, "deprecations"], [55, "id2"], [0, "deprecations"], [0, "id20"], [0, "id43"], [0, "id168"]], "Upgrading to 3.0": [[55, "upgrading-to-3-0"]], "Default consistency is now LOCAL_ONE": [[55, "default-consistency-is-now-local-one"]], "Execution API Updates": [[55, "execution-api-updates"]], "Result return normalization": [[55, "result-return-normalization"]], "Trace information is not attached to executed Statements": [[55, "trace-information-is-not-attached-to-executed-statements"]], "Binding named parameters now ignores extra names": [[55, "binding-named-parameters-now-ignores-extra-names"]], "blist removed as soft dependency": [[55, "blist-removed-as-soft-dependency"]], "Metadata API Updates": [[55, "metadata-api-updates"]], "Several deprecated features are removed": [[55, "several-deprecated-features-are-removed"]], "Upgrading to 2.1 from 2.0": [[55, "upgrading-to-2-1-from-2-0"]], "Using the v3 Native Protocol": [[55, "using-the-v3-native-protocol"]], "Working with User-Defined Types": [[55, "working-with-user-defined-types"]], "Customizing Encoders for Non-prepared Statements": [[55, "customizing-encoders-for-non-prepared-statements"]], "Using Client-Side Protocol-Level Timestamps": [[55, "using-client-side-protocol-level-timestamps"]], "Upgrading to 2.0 from 1.x": [[55, "upgrading-to-2-0-from-1-x"]], "Using the v2 Native Protocol": [[55, "using-the-v2-native-protocol"]], "Automatic Query Paging": [[55, "automatic-query-paging"]], "Protocol-Level Batch Statements": [[55, "protocol-level-batch-statements"]], "SASL-based Authentication": [[55, "sasl-based-authentication"]], "Lightweight Transactions": [[55, "lightweight-transactions"]], "Calling Cluster.shutdown()": [[55, "calling-cluster-shutdown"]], "Dependency Changes": [[55, "dependency-changes"]], "Registering a UDT": [[56, "registering-a-udt"]], "Map a Class to a UDT": [[56, "map-a-class-to-a-udt"]], "Map a dict to a UDT": [[56, "map-a-dict-to-a-udt"]], "Using UDTs Without Registering Them": [[56, "using-udts-without-registering-them"]], "Scylla Specific Features": [[53, "scylla-specific-features"]], "Shard Awareness": [[53, "shard-awareness"]], "New Cluster Helpers": [[53, "new-cluster-helpers"]], "New Error Types": [[53, "new-error-types"]], "Paging Large Queries": [[50, "paging-large-queries"]], "Controlling the Page Size": [[50, "controlling-the-page-size"]], "Handling Paged Results": [[50, "handling-paged-results"]], "Handling Paged Results with Callbacks": [[50, "handling-paged-results-with-callbacks"]], "Resume Paged Results": [[50, "resume-paged-results"]], "Supported Platforms": [[46, "supported-platforms"]], "Installation through pip": [[46, "installation-through-pip"]], "Verifying your Installation": [[46, "verifying-your-installation"]], "(Optional) Graph": [[46, "optional-graph"]], "(Optional) Compression Support": [[46, "optional-compression-support"]], "(Optional) Metrics Support": [[46, "optional-metrics-support"]], "Speeding Up Installation": [[46, "speeding-up-installation"]], "OSX Installation Error": [[46, "osx-installation-error"]], "Windows Installation Notes": [[46, "windows-installation-notes"]], "Manual Installation": [[46, "manual-installation"]], "(Optional) Non-python Dependencies": [[46, "optional-non-python-dependencies"]], "C Extensions": [[46, "c-extensions"]], "Cython-based Extensions": [[46, "cython-based-extensions"]], "libev support": [[46, "libev-support"]], "(Optional) Configuring SSL": [[46, "optional-configuring-ssl"]], "Python Driver for Scylla and Apache Cassandra\u00ae": [[45, "python-driver-for-scylla-and-apache-cassandra"]], "Contents": [[45, "contents"], [48, "contents"]], "Getting Help": [[45, "getting-help"]], "Reporting Issues": [[45, "reporting-issues"]], "Copyright": [[45, "copyright"]], "Security": [[54, "security"]], "Authentication": [[54, "authentication"]], "Custom Authenticators": [[54, "custom-authenticators"]], "Protocol v1 Authentication": [[54, "protocol-v1-authentication"]], "SSL": [[54, "ssl"]], "SSL with Twisted or Eventlet": [[54, "ssl-with-twisted-or-eventlet"]], "SSL Configuration Examples": [[54, "ssl-configuration-examples"]], "No identity verification": [[54, "no-identity-verification"]], "Client verifies server": [[54, "client-verifies-server"]], "Server verifies client": [[54, "server-verifies-client"]], "Server verifies client and client verifies server": [[54, "server-verifies-client-and-client-verifies-server"]], "Versions 3.16.0 and lower": [[54, "versions-3-16-0-and-lower"]], "SSL with Twisted": [[54, "ssl-with-twisted"]], "DSE Authentication": [[54, "dse-authentication"]], "DSE Unified Authentication": [[54, "dse-unified-authentication"]], "Proxy Login": [[54, "proxy-login"]], "Proxy Execute": [[54, "proxy-execute"]], "Getting Started": [[48, "getting-started"], [44, "getting-started"]], "Connecting to a Cluster": [[44, "connecting-to-a-cluster"]], "Connecting to Cassandra": [[44, "connecting-to-cassandra"]], "Session Keyspace": [[44, "session-keyspace"]], "Executing Queries": [[44, "executing-queries"]], "Prepared Statements": [[44, "prepared-statement"]], "Passing Parameters to CQL Queries": [[44, "passing-parameters-to-cql-queries"]], "Type Conversions": [[44, "type-conversions"]], "Asynchronous Queries": [[44, "asynchronous-queries"]], "Setting a Consistency Level": [[44, "setting-a-consistency-level"]], "Setting a Consistency Level with Prepared Statements": [[44, "setting-a-consistency-level-with-prepared-statements"]], "Speculative Execution": [[44, "speculative-execution"]], "ScyllaDB Cloud": [[51, "scylladb-cloud"]], "Lightweight Transactions (Compare-and-set)": [[47, "lightweight-transactions-compare-and-set"]], "Specialized Results": [[47, "specialized-results"]], "named_tuple_factory (default)": [[47, "named-tuple-factory-default"]], "tuple_factory": [[47, "tuple-factory"]], "dict_factory": [[47, "dict-factory"]], "Performance Notes": [[49, "performance-notes"]], "PyPy": [[49, "pypy"]], "Cython Extensions": [[49, "cython-extensions"]], "multiprocessing": [[49, "multiprocessing"]], "ScyllaDB Cloud Serverless": [[52, "scylladb-cloud-serverless"]], "cassandra.cqlengine.usertype - Model classes for User Defined Types": [[11, "module-cassandra.cqlengine.usertype"]], "UserType": [[11, "usertype"]], "cassandra.io.asyncorereactor - asyncore Event Loop": [[20, "module-cassandra.io.asyncorereactor"]], "cassandra.datastax.graph - Graph Statements, Options, and Row Factories": [[15, "cassandra-datastax-graph-graph-statements-options-and-row-factories"]], "cassandra.encoder - Encoders for non-prepared Statements": [[17, "module-cassandra.encoder"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "cassandra.decoder - Data Return Formats": [[16, "module-cassandra.decoder"]], "cassandra.graph - Graph Statements, Options, and Row Factories": [[18, "cassandra-graph-graph-statements-options-and-row-factories"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "cassandra.io.eventletreactor - eventlet-compatible Connection": [[21, "module-cassandra.io.eventletreactor"]], "cassandra.io.asyncioreactor - asyncio Event Loop": [[19, "module-cassandra.io.asyncioreactor"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "cassandra.protocol - Protocol Features": [[29, "module-cassandra.protocol"]], "Custom Payloads": [[29, "custom-payloads"]], "Faster Deserialization": [[29, "faster-deserialization"]], "cassandra.util - Utilities": [[32, "module-cassandra.util"]], "cassandra.policies - Load balancing and Failure Handling Policies": [[27, "module-cassandra.policies"]], "Load Balancing": [[27, "load-balancing"]], "Translating Server Node Addresses": [[27, "translating-server-node-addresses"]], "Marking Hosts Up or Down": [[27, "marking-hosts-up-or-down"]], "Reconnecting to Dead Hosts": [[27, "reconnecting-to-dead-hosts"]], "Retrying Failed Operations": [[27, "retrying-failed-operations"]], "Retrying Idempotent Operations": [[27, "retrying-idempotent-operations"]], "cassandra.metadata - Schema and Ring Topology": [[25, "module-cassandra.metadata"]], "Schemas": [[25, "schemas"]], "Tokens and Ring Topology": [[25, "tokens-and-ring-topology"]], "cassandra.io.geventreactor - gevent-compatible Event Loop": [[22, "module-cassandra.io.geventreactor"]], "cassandra.timestamps - Timestamp Generation": [[31, "module-cassandra.timestamps"]], "cassandra.pool - Hosts and Connection Pools": [[28, "module-cassandra.pool"]], "cassandra.io.twistedreactor - Twisted Event Loop": [[24, "module-cassandra.io.twistedreactor"]], "cassandra.io.libevreactor - libev Event Loop": [[23, "module-cassandra.io.libevreactor"]], "cassandra.metrics - Performance Metrics": [[26, "module-cassandra.metrics"]], "cassandra.query - Prepared Statements, Batch Statements, Tracing, and Row Factories": [[30, "module-cassandra.query"]], "cassandra - Exceptions and Enums": [[1, "module-cassandra"]], "cassandra.cluster - Clusters and Sessions": [[3, "module-cassandra.cluster"]], "cassandra.connection - Low Level Connection Info": [[5, "module-cassandra.connection"]], "cassandra.cqlengine.connection - Connection management for cqlengine": [[7, "module-cassandra.cqlengine.connection"]], "cassandra.cqlengine.columns - Column types for object mapping models": [[6, "module-cassandra.cqlengine.columns"]], "Columns": [[6, "columns"]], "Column Types": [[6, "column-types"]], "cassandra.auth - Authentication": [[2, "module-cassandra.auth"]], "cassandra.cqlengine.models - Table models for object mapping": [[9, "module-cassandra.cqlengine.models"]], "Model": [[9, "model"]], "cassandra.cqlengine.query - Query and filter model objects": [[10, "module-cassandra.cqlengine.query"]], "QuerySet": [[10, "queryset"]], "cassandra.cqlengine.management - Schema management for cqlengine": [[8, "module-cassandra.cqlengine.management"]], "cassandra.concurrent - Utilities for Concurrent Statement Execution": [[4, "module-cassandra.concurrent"]], "CHANGELOG": [[0, "changelog"]], "3.26.0": [[0, "id1"]], "Features": [[0, "features"], [0, "id3"], [0, "id7"], [0, "id11"], [0, "id14"], [0, "id17"], [0, "id21"], [0, "id28"], [0, "id31"], [0, "id35"], [0, "id40"], [0, "id50"], [0, "id54"], [0, "id57"], [0, "id61"], [0, "id65"], [0, "id69"], [0, "id73"], [0, "id79"], [0, "id85"], [0, "id88"], [0, "id91"], [0, "id96"], [0, "id99"], [0, "id104"], [0, "id109"], [0, "id113"], [0, "id115"], [0, "id122"], [0, "id126"], [0, "id128"], [0, "id133"], [0, "id136"], [0, "id139"], [0, "id142"], [0, "id145"], [0, "id153"], [0, "id160"], [0, "id162"], [0, "id166"], [0, "id170"], [0, "id176"], [0, "id186"], [0, "id188"], [0, "id193"], [0, "id196"], [0, "id198"]], "Bug Fixes": [[0, "bug-fixes"], [0, "id4"], [0, "id8"], [0, "id12"], [0, "id15"], [0, "id18"], [0, "id22"], [0, "id24"], [0, "id26"], [0, "id29"], [0, "id32"], [0, "id36"], [0, "id38"], [0, "id41"], [0, "id45"], [0, "id48"], [0, "id51"], [0, "id58"], [0, "id62"], [0, "id66"], [0, "id70"], [0, "id74"], [0, "id77"], [0, "id80"], [0, "id83"], [0, "id86"], [0, "id89"], [0, "id92"], [0, "id94"], [0, "id97"], [0, "id100"], [0, "id105"], [0, "id107"], [0, "id110"], [0, "id114"], [0, "id116"], [0, "id118"], [0, "id120"], [0, "id123"], [0, "id125"], [0, "id127"], [0, "id129"], [0, "id131"], [0, "id134"], [0, "id137"], [0, "id140"], [0, "id143"], [0, "id146"], [0, "id149"], [0, "id151"], [0, "id154"], [0, "id156"], [0, "id158"], [0, "id161"], [0, "id163"], [0, "id167"], [0, "id171"], [0, "id174"], [0, "id177"], [0, "id180"], [0, "id183"], [0, "id185"], [0, "id189"], [0, "id191"], [0, "id194"], [0, "id197"], [0, "id199"], [0, "id201"]], "Others": [[0, "others"], [0, "id5"], [0, "id9"], [0, "id19"]], "3.25.0": [[0, "id2"]], "3.24.0": [[0, "id6"]], "3.23.0": [[0, "id10"]], "3.22.0": [[0, "id13"]], "3.21.0": [[0, "id16"]], "Other": [[0, "other"], [0, "id33"], [0, "id42"], [0, "id46"], [0, "id52"], [0, "id55"], [0, "id59"], [0, "id63"], [0, "id67"], [0, "id71"], [0, "id75"], [0, "id81"], [0, "id111"], [0, "id147"], [0, "id152"], [0, "id164"], [0, "id172"], [0, "id178"], [0, "id181"], [0, "id184"], [0, "id187"], [0, "id190"], [0, "id192"], [0, "id195"], [0, "id200"]], "3.20.2": [[0, "id23"]], "3.20.1": [[0, "id25"]], "3.20.0": [[0, "id27"]], "3.19.0": [[0, "id30"]], "3.18.0": [[0, "id34"]], "3.17.1": [[0, "id37"]], "3.17.0": [[0, "id39"]], "3.16.0": [[0, "id44"]], "3.15.1": [[0, "id47"]], "3.15.0": [[0, "id49"]], "3.14.0": [[0, "id53"]], "3.13.0": [[0, "id56"]], "3.12.0": [[0, "id60"]], "3.11.0": [[0, "id64"]], "3.10.0": [[0, "id68"]], "3.9.0": [[0, "id72"]], "3.8.1": [[0, "id76"]], "3.8.0": [[0, "id78"]], "3.7.1": [[0, "id82"]], "3.7.0": [[0, "id84"]], "3.6.0": [[0, "id87"]], "3.5.0": [[0, "id90"]], "3.4.1": [[0, "id93"]], "3.4.0": [[0, "id95"]], "3.3.0": [[0, "id98"]], "3.2.2": [[0, "id101"]], "3.2.1": [[0, "id102"]], "3.2.0": [[0, "id103"]], "3.1.1": [[0, "id106"]], "3.1.0": [[0, "id108"]], "3.0.0": [[0, "id112"]], "3.0.0rc1": [[0, "rc1"]], "2.7.2": [[0, "id117"]], "2.7.1": [[0, "id119"]], "2.7.0": [[0, "id121"]], "2.6.0": [[0, "id124"]], "2.6.0c2": [[0, "c2"]], "2.6.0c1": [[0, "c1"]], "2.5.1": [[0, "id130"]], "2.5.0": [[0, "id132"]], "2.1.4": [[0, "id135"]], "2.1.3": [[0, "id138"]], "2.1.2": [[0, "id141"]], "2.1.1": [[0, "id144"]], "2.1.0": [[0, "id148"]], "2.1.0c1": [[0, "id150"]], "2.1.0b1": [[0, "b1"]], "2.0.2": [[0, "id155"]], "2.0.1": [[0, "id157"]], "2.0.0": [[0, "id159"]], "Merged From 1.x": [[0, "merged-from-1-x"]], "2.0.0b1": [[0, "id165"]], "Upgrading from 1.x": [[0, "upgrading-from-1-x"]], "1.1.2": [[0, "id169"]], "1.1.1": [[0, "id173"]], "1.1.0": [[0, "id175"]], "1.0.2": [[0, "id179"]], "1.0.1": [[0, "id182"]], "1.0.0 Final": [[0, "final"]], "1.0.0b7": [[0, "b7"]], "1.0.0b6": [[0, "b6"]], "1.0.0b5": [[0, "b5"]], "1.0.0-beta4": [[0, "beta4"]], "1.0.0-beta3": [[0, "beta3"]], "1.0.0-beta2": [[0, "beta2"]], "1.0.0-beta": [[0, "beta"]]}, "indexentries": {"all (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ALL"]], "any (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ANY"]], "alreadyexists": [[1, "cassandra.AlreadyExists"]], "authenticationfailed": [[1, "cassandra.AuthenticationFailed"]], "beta_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.BETA_VERSIONS"]], "configurationexception": [[1, "cassandra.ConfigurationException"]], "consistencylevel (class in cassandra)": [[1, "cassandra.ConsistencyLevel"]], "coordinationfailure": [[1, "cassandra.CoordinationFailure"]], "dse_v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V1"]], "dse_v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.DSE_V2"]], "driverexception": [[1, "cassandra.DriverException"]], "each_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.EACH_QUORUM"]], "functionfailure": [[1, "cassandra.FunctionFailure"]], "invalidrequest": [[1, "cassandra.InvalidRequest"]], "local_one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_ONE"]], "local_quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_QUORUM"]], "local_serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.LOCAL_SERIAL"]], "max_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MAX_SUPPORTED"]], "min_supported (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.MIN_SUPPORTED"]], "one (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.ONE"]], "operationtimedout": [[1, "cassandra.OperationTimedOut"]], "protocolversion (class in cassandra)": [[1, "cassandra.ProtocolVersion"]], "quorum (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.QUORUM"]], "readfailure": [[1, "cassandra.ReadFailure"]], "readtimeout": [[1, "cassandra.ReadTimeout"]], "requestexecutionexception": [[1, "cassandra.RequestExecutionException"]], "requestvalidationexception": [[1, "cassandra.RequestValidationException"]], "serial (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.SERIAL"]], "supported_versions (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.SUPPORTED_VERSIONS"]], "three (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.THREE"]], "two (cassandra.consistencylevel attribute)": [[1, "cassandra.ConsistencyLevel.TWO"]], "timeout": [[1, "cassandra.Timeout"]], "unauthorized": [[1, "cassandra.Unauthorized"]], "unavailable": [[1, "cassandra.Unavailable"]], "useraggregatedescriptor (class in cassandra)": [[1, "cassandra.UserAggregateDescriptor"]], "userfunctiondescriptor (class in cassandra)": [[1, "cassandra.UserFunctionDescriptor"]], "v1 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V1"]], "v2 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V2"]], "v3 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V3"]], "v4 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V4"]], "v5 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V5"]], "v6 (cassandra.protocolversion attribute)": [[1, "cassandra.ProtocolVersion.V6"]], "writefailure": [[1, "cassandra.WriteFailure"]], "writetimeout": [[1, "cassandra.WriteTimeout"]], "__version__ (in module cassandra)": [[1, "cassandra.__version__"]], "__version_info__ (in module cassandra)": [[1, "cassandra.__version_info__"]], "alive_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.alive_replicas"]], "arg_types (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.arg_types"]], "argument_types (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.argument_types"]], "argument_types (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.argument_types"]], "cassandra": [[1, "module-cassandra"]], "consistency (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.consistency"]], "consistency (cassandra.timeout attribute)": [[1, "cassandra.Timeout.consistency"]], "consistency (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.consistency"]], "data_retrieved (cassandra.readfailure attribute)": [[1, "cassandra.ReadFailure.data_retrieved"]], "data_retrieved (cassandra.readtimeout attribute)": [[1, "cassandra.ReadTimeout.data_retrieved"]], "error_code_map (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.error_code_map"]], "errors (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.errors"]], "failures (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.failures"]], "function (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.function"]], "get_lower_supported() (cassandra.protocolversion class method)": [[1, "cassandra.ProtocolVersion.get_lower_supported"]], "keyspace (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.keyspace"]], "keyspace (cassandra.functionfailure attribute)": [[1, "cassandra.FunctionFailure.keyspace"]], "last_host (cassandra.operationtimedout attribute)": [[1, "cassandra.OperationTimedOut.last_host"]], "module": [[1, "module-cassandra"], [2, "module-cassandra.auth"], [3, "module-cassandra.cluster"], [4, "module-cassandra.concurrent"], [5, "module-cassandra.connection"], [6, "module-cassandra.cqlengine.columns"], [7, "module-cassandra.cqlengine.connection"], [8, "module-cassandra.cqlengine.management"], [9, "module-cassandra.cqlengine.models"], [10, "module-cassandra.cqlengine.query"], [11, "module-cassandra.cqlengine.usertype"], [12, "module-cassandra.datastax.graph.fluent"], [13, "module-cassandra.datastax.graph.fluent.predicates"], [14, "module-cassandra.datastax.graph.fluent.query"], [15, "module-cassandra.datastax.graph"], [16, "module-cassandra.decoder"], [17, "module-cassandra.encoder"], [18, "module-cassandra.graph"], [19, "module-cassandra.io.asyncioreactor"], [20, "module-cassandra.io.asyncorereactor"], [21, "module-cassandra.io.eventletreactor"], [22, "module-cassandra.io.geventreactor"], [23, "module-cassandra.io.libevreactor"], [24, "module-cassandra.io.twistedreactor"], [25, "module-cassandra.metadata"], [26, "module-cassandra.metrics"], [27, "module-cassandra.policies"], [28, "module-cassandra.pool"], [29, "module-cassandra.protocol"], [30, "module-cassandra.query"], [31, "module-cassandra.timestamps"], [32, "module-cassandra.util"], [37, "module-cqlengine.models"], [38, "module-cqlengine.queryset"]], "name (cassandra.useraggregatedescriptor attribute)": [[1, "cassandra.UserAggregateDescriptor.name"]], "name (cassandra.userfunctiondescriptor attribute)": [[1, "cassandra.UserFunctionDescriptor.name"]], "received_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.received_responses"]], "received_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.received_responses"]], "required_replicas (cassandra.unavailable attribute)": [[1, "cassandra.Unavailable.required_replicas"]], "required_responses (cassandra.coordinationfailure attribute)": [[1, "cassandra.CoordinationFailure.required_responses"]], "required_responses (cassandra.timeout attribute)": [[1, "cassandra.Timeout.required_responses"]], "signature (cassandra.useraggregatedescriptor property)": [[1, "cassandra.UserAggregateDescriptor.signature"]], "signature (cassandra.userfunctiondescriptor property)": [[1, "cassandra.UserFunctionDescriptor.signature"]], "table (cassandra.alreadyexists attribute)": [[1, "cassandra.AlreadyExists.table"]], "write_type (cassandra.writefailure attribute)": [[1, "cassandra.WriteFailure.write_type"]], "write_type (cassandra.writetimeout attribute)": [[1, "cassandra.WriteTimeout.write_type"]], "authprovider (class in cassandra.auth)": [[2, "cassandra.auth.AuthProvider"]], "authenticator (class in cassandra.auth)": [[2, "cassandra.auth.Authenticator"]], "plaintextauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthProvider"]], "plaintextauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.PlainTextAuthenticator"]], "saslauthprovider (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthProvider"]], "saslauthenticator (class in cassandra.auth)": [[2, "cassandra.auth.SaslAuthenticator"]], "cassandra.auth": [[2, "module-cassandra.auth"]], "evaluate_challenge() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.plaintextauthenticator method)": [[2, "cassandra.auth.PlainTextAuthenticator.evaluate_challenge"]], "evaluate_challenge() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.evaluate_challenge"]], "initial_response() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.initial_response"]], "initial_response() (cassandra.auth.saslauthenticator method)": [[2, "cassandra.auth.SaslAuthenticator.initial_response"]], "new_authenticator() (cassandra.auth.authprovider method)": [[2, "cassandra.auth.AuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.plaintextauthprovider method)": [[2, "cassandra.auth.PlainTextAuthProvider.new_authenticator"]], "new_authenticator() (cassandra.auth.saslauthprovider method)": [[2, "cassandra.auth.SaslAuthProvider.new_authenticator"]], "on_authentication_success() (cassandra.auth.authenticator method)": [[2, "cassandra.auth.Authenticator.on_authentication_success"]], "server_authenticator_class (cassandra.auth.authenticator attribute)": [[2, "cassandra.auth.Authenticator.server_authenticator_class"]], "cluster (class in cassandra.cluster)": [[3, "cassandra.cluster.Cluster"]], "exec_profile_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_DEFAULT"]], "exec_profile_graph_analytics_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_ANALYTICS_DEFAULT"]], "exec_profile_graph_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_DEFAULT"]], "exec_profile_graph_system_default (in module cassandra.cluster)": [[3, "cassandra.cluster.EXEC_PROFILE_GRAPH_SYSTEM_DEFAULT"]], "executionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.ExecutionProfile"]], "graphanalyticsexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphAnalyticsExecutionProfile"]], "graphexecutionprofile (class in cassandra.cluster)": [[3, "cassandra.cluster.GraphExecutionProfile"]], "nohostavailable": [[3, "cassandra.cluster.NoHostAvailable"]], "queryexhausted": [[3, "cassandra.cluster.QueryExhausted"]], "responsefuture (class in cassandra.cluster)": [[3, "cassandra.cluster.ResponseFuture"]], "resultset (class in cassandra.cluster)": [[3, "cassandra.cluster.ResultSet"]], "session (class in cassandra.cluster)": [[3, "cassandra.cluster.Session"]], "usertypedoesnotexist": [[3, "cassandra.cluster.UserTypeDoesNotExist"]], "add_callback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callback"]], "add_callbacks() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_callbacks"]], "add_errback() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.add_errback"]], "add_execution_profile() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.add_execution_profile"]], "add_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.add_request_init_listener"]], "address_translator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.address_translator"]], "all() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.all"]], "auth_provider (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.auth_provider"]], "cassandra.cluster": [[3, "module-cassandra.cluster"]], "client_protocol_handler (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.client_protocol_handler"]], "cloud (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cloud"]], "compression (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.compression"]], "connect() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.connect"]], "connect_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connect_timeout"]], "connection_class (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.connection_class"]], "consistency_level (cassandra.cluster.executionprofile attribute)": [[3, "cassandra.cluster.ExecutionProfile.consistency_level"]], "contact_points (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.contact_points"]], "control_connection_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.control_connection_timeout"]], "conviction_policy_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.conviction_policy_factory"]], "cql_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.cql_version"]], "current_rows (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.current_rows"]], "custom_payload (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.custom_payload"]], "default_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_consistency_level"]], "default_fetch_size (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_fetch_size"]], "default_retry_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.default_retry_policy"]], "default_serial_consistency_level (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_serial_consistency_level"]], "default_timeout (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.default_timeout"]], "encoder (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.encoder"]], "endpoint_factory (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.endpoint_factory"]], "execute() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute"]], "execute_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_async"]], "execute_graph() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph"]], "execute_graph_async() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execute_graph_async"]], "execution_profile_clone_update() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.execution_profile_clone_update"]], "fetch_next_page() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.fetch_next_page"]], "get_all_query_traces() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_all_query_traces"]], "get_all_query_traces() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_all_query_traces"]], "get_control_connection_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_control_connection_host"]], "get_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_core_connections_per_host"]], "get_execution_profile() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.get_execution_profile"]], "get_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_connections_per_host"]], "get_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_max_requests_per_connection"]], "get_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.get_min_requests_per_connection"]], "get_query_trace() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.get_query_trace"]], "get_query_trace() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.get_query_trace"]], "has_more_pages (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.has_more_pages"]], "has_more_pages (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.has_more_pages"]], "idle_heartbeat_interval (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_interval"]], "idle_heartbeat_timeout (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.idle_heartbeat_timeout"]], "is_schema_agreed (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.is_schema_agreed"]], "load_balancing_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.load_balancing_policy"]], "max_schema_agreement_wait (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.max_schema_agreement_wait"]], "metadata (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metadata"]], "metrics (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics"]], "metrics_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.metrics_enabled"]], "one() (cassandra.cluster.resultset method)": [[3, "cassandra.cluster.ResultSet.one"]], "paging_state (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.paging_state"]], "port (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.port"]], "prepare() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.prepare"]], "prepare_on_all_hosts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.prepare_on_all_hosts"]], "protocol_version (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.protocol_version"]], "query (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.query"]], "reconnection_policy (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reconnection_policy"]], "refresh_keyspace_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_keyspace_metadata"]], "refresh_nodes() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_nodes"]], "refresh_schema_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_schema_metadata"]], "refresh_table_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_table_metadata"]], "refresh_user_aggregate_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_aggregate_metadata"]], "refresh_user_function_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_function_metadata"]], "refresh_user_type_metadata() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.refresh_user_type_metadata"]], "register_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_listener"]], "register_user_type() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.register_user_type"]], "remove_request_init_listener() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.remove_request_init_listener"]], "reprepare_on_up (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.reprepare_on_up"]], "result() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.result"]], "row_factory (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.row_factory"]], "row_factory() (cassandra.cluster.executionprofile static method)": [[3, "cassandra.cluster.ExecutionProfile.row_factory"]], "schema_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_event_refresh_window"]], "schema_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.schema_metadata_enabled"]], "set_core_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_core_connections_per_host"]], "set_keyspace() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.set_keyspace"]], "set_max_connections_per_host() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_connections_per_host"]], "set_max_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_max_requests_per_connection"]], "set_meta_refresh_enabled() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_meta_refresh_enabled"]], "set_min_requests_per_connection() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.set_min_requests_per_connection"]], "shutdown() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.shutdown"]], "shutdown() (cassandra.cluster.session method)": [[3, "cassandra.cluster.Session.shutdown"]], "sockopts (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.sockopts"]], "ssl_context (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_context"]], "ssl_options (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.ssl_options"]], "start_fetching_next_page() (cassandra.cluster.responsefuture method)": [[3, "cassandra.cluster.ResponseFuture.start_fetching_next_page"]], "status_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.status_event_refresh_window"]], "timestamp_generator (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.timestamp_generator"]], "timestamp_generator (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.timestamp_generator"]], "token_metadata_enabled (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.token_metadata_enabled"]], "topology_event_refresh_window (cassandra.cluster.cluster attribute)": [[3, "cassandra.cluster.Cluster.topology_event_refresh_window"]], "unregister_listener() (cassandra.cluster.cluster method)": [[3, "cassandra.cluster.Cluster.unregister_listener"]], "use_client_timestamp (cassandra.cluster.session attribute)": [[3, "cassandra.cluster.Session.use_client_timestamp"]], "warnings (cassandra.cluster.responsefuture attribute)": [[3, "cassandra.cluster.ResponseFuture.warnings"]], "was_applied (cassandra.cluster.resultset property)": [[3, "cassandra.cluster.ResultSet.was_applied"]], "cassandra.concurrent": [[4, "module-cassandra.concurrent"]], "execute_concurrent() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent"]], "execute_concurrent_with_args() (in module cassandra.concurrent)": [[4, "cassandra.concurrent.execute_concurrent_with_args"]], "connectionbusy": [[5, "cassandra.connection.ConnectionBusy"]], "connectionexception": [[5, "cassandra.connection.ConnectionException"]], "connectionshutdown": [[5, "cassandra.connection.ConnectionShutdown"]], "endpoint (class in cassandra.connection)": [[5, "cassandra.connection.EndPoint"]], "endpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.EndPointFactory"]], "protocolerror": [[5, "cassandra.connection.ProtocolError"]], "sniendpoint (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPoint"]], "sniendpointfactory (class in cassandra.connection)": [[5, "cassandra.connection.SniEndPointFactory"]], "unixsocketendpoint (class in cassandra.connection)": [[5, "cassandra.connection.UnixSocketEndPoint"]], "address (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.address"]], "cassandra.connection": [[5, "module-cassandra.connection"]], "configure() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.configure"]], "create() (cassandra.connection.endpointfactory method)": [[5, "cassandra.connection.EndPointFactory.create"]], "port (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.port"]], "resolve() (cassandra.connection.endpoint method)": [[5, "cassandra.connection.EndPoint.resolve"]], "socket_family (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.socket_family"]], "ssl_options (cassandra.connection.endpoint property)": [[5, "cassandra.connection.EndPoint.ssl_options"]], "ascii (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Ascii"]], "bigint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.BigInt"]], "blob (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Blob"]], "boolean (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Boolean"]], "bytes (in module cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Bytes"]], "column (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Column"]], "counter (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Counter"]], "date (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Date"]], "datetime (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.DateTime"]], "decimal (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Decimal"]], "double (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Double"]], "float (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Float"]], "integer (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Integer"]], "list (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.List"]], "map (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Map"]], "set (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Set"]], "smallint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.SmallInt"]], "text (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Text"]], "time (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.Time"]], "timeuuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TimeUUID"]], "tinyint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.TinyInt"]], "uuid (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UUID"]], "userdefinedtype (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.UserDefinedType"]], "varint (class in cassandra.cqlengine.columns)": [[6, "cassandra.cqlengine.columns.VarInt"]], "cassandra.cqlengine.columns": [[6, "module-cassandra.cqlengine.columns"]], "clustering_order (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.clustering_order"]], "custom_index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.custom_index"]], "db_field (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.db_field"]], "default (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.default"]], "discriminator_column (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.discriminator_column"]], "index (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.index"]], "partition_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.partition_key"]], "primary_key (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.primary_key"]], "required (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.required"]], "static (cassandra.cqlengine.columns.column attribute)": [[6, "cassandra.cqlengine.columns.Column.static"]], "truncate_microseconds (cassandra.cqlengine.columns.datetime attribute)": [[6, "cassandra.cqlengine.columns.DateTime.truncate_microseconds"]], "cassandra.cqlengine.connection": [[7, "module-cassandra.cqlengine.connection"]], "default() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.default"]], "register_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.register_connection"]], "set_default_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_default_connection"]], "set_session() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.set_session"]], "setup() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.setup"]], "unregister_connection() (in module cassandra.cqlengine.connection)": [[7, "cassandra.cqlengine.connection.unregister_connection"]], "cassandra.cqlengine.management": [[8, "module-cassandra.cqlengine.management"]], "create_keyspace_network_topology() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_network_topology"]], "create_keyspace_simple() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.create_keyspace_simple"]], "drop_keyspace() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_keyspace"]], "drop_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.drop_table"]], "sync_table() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_table"]], "sync_type() (in module cassandra.cqlengine.management)": [[8, "cassandra.cqlengine.management.sync_type"]], "model (class in cassandra.cqlengine.models)": [[9, "cassandra.cqlengine.models.Model"]], "__abstract__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__abstract__"]], "__compute_routing_key__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__compute_routing_key__"]], "__connection__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__connection__"]], "__default_ttl__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__default_ttl__"]], "__discriminator_value__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__discriminator_value__"]], "__keyspace__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__keyspace__"]], "__options__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__options__"]], "__table_name__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name__"]], "__table_name_case_sensitive__ (cassandra.cqlengine.models.model attribute)": [[9, "cassandra.cqlengine.models.Model.__table_name_case_sensitive__"]], "all() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.all"]], "batch() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.batch"]], "cassandra.cqlengine.models": [[9, "module-cassandra.cqlengine.models"]], "column_family_name() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.column_family_name"]], "create() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.create"]], "delete() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.delete"]], "filter() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.filter"]], "get() (cassandra.cqlengine.models.model class method)": [[9, "cassandra.cqlengine.models.Model.get"]], "if_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_exists"]], "if_not_exists() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.if_not_exists"]], "iff() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.iff"]], "items() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.items"]], "keys() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.keys"]], "len() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.len"]], "m() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.m"]], "save() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.save"]], "timeout() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timeout"]], "timestamp() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.timestamp"]], "ttl() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.ttl"]], "update() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.update"]], "using() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.using"]], "values() (cassandra.cqlengine.models.model method)": [[9, "cassandra.cqlengine.models.Model.values"]], "batchquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.BatchQuery"]], "contextquery (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ContextQuery"]], "doesnotexist (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.DoesNotExist"]], "lwtexception (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.LWTException"]], "modelqueryset (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.ModelQuerySet"]], "multipleobjectsreturned (class in cassandra.cqlengine.query)": [[10, "cassandra.cqlengine.query.MultipleObjectsReturned"]], "add_callback() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_callback"]], "add_query() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.add_query"]], "all() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.all"]], "allow_filtering() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.allow_filtering"]], "batch() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.batch"]], "cassandra.cqlengine.query": [[10, "module-cassandra.cqlengine.query"]], "consistency() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.consistency"]], "count() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.count"]], "defer() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.defer"]], "distinct() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.distinct"]], "execute() (cassandra.cqlengine.query.batchquery method)": [[10, "cassandra.cqlengine.query.BatchQuery.execute"]], "fetch_size() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.fetch_size"]], "filter() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.filter"]], "get() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.get"]], "if_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_exists"]], "if_not_exists() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.if_not_exists"]], "len() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.len"]], "limit() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.limit"]], "only() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.only"]], "order_by() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.order_by"]], "timestamp() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.timestamp"]], "ttl() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.ttl"]], "update() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.update"]], "using() (cassandra.cqlengine.query.modelqueryset method)": [[10, "cassandra.cqlengine.query.ModelQuerySet.using"]], "usertype (class in cassandra.cqlengine.usertype)": [[11, "cassandra.cqlengine.usertype.UserType"]], "__type_name__ (cassandra.cqlengine.usertype.usertype attribute)": [[11, "cassandra.cqlengine.usertype.UserType.__type_name__"]], "cassandra.cqlengine.usertype": [[11, "module-cassandra.cqlengine.usertype"]], "basegraphrowfactory (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.BaseGraphRowFactory"]], "dsesessionremotegraphconnection (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DSESessionRemoteGraphConnection"]], "dse_graph_query_language (cassandra.datastax.graph.fluent.dsegraph attribute)": [[12, "cassandra.datastax.graph.fluent.DseGraph.DSE_GRAPH_QUERY_LANGUAGE"]], "dsegraph (class in cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.DseGraph"]], "batch() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.batch"]], "cassandra.datastax.graph.fluent": [[12, "module-cassandra.datastax.graph.fluent"]], "create_execution_profile() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.create_execution_profile"]], "graph_traversal_dse_object_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_dse_object_row_factory"]], "graph_traversal_row_factory (in module cassandra.datastax.graph.fluent)": [[12, "cassandra.datastax.graph.fluent.graph_traversal_row_factory"]], "query_from_traversal() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.query_from_traversal"]], "traversal_source() (cassandra.datastax.graph.fluent.dsegraph static method)": [[12, "cassandra.datastax.graph.fluent.DseGraph.traversal_source"]], "cqlcollection (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection"]], "geo (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo"]], "search (class in cassandra.datastax.graph.fluent.predicates)": [[13, "cassandra.datastax.graph.fluent.predicates.Search"]], "cassandra.datastax.graph.fluent.predicates": [[13, "module-cassandra.datastax.graph.fluent.predicates"]], "contains() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains"]], "contains_key() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_key"]], "contains_value() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.contains_value"]], "entry_eq() (cassandra.datastax.graph.fluent.predicates.cqlcollection static method)": [[13, "cassandra.datastax.graph.fluent.predicates.CqlCollection.entry_eq"]], "fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.fuzzy"]], "inside() (cassandra.datastax.graph.fluent.predicates.geo static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Geo.inside"]], "phrase() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.phrase"]], "prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.prefix"]], "regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.regex"]], "token() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token"]], "token_fuzzy() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_fuzzy"]], "token_prefix() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_prefix"]], "token_regex() (cassandra.datastax.graph.fluent.predicates.search static method)": [[13, "cassandra.datastax.graph.fluent.predicates.Search.token_regex"]], "traversalbatch (class in cassandra.datastax.graph.fluent.query)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch"]], "add() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add"]], "add_all() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.add_all"]], "as_graph_statement() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.as_graph_statement"]], "cassandra.datastax.graph.fluent.query": [[14, "module-cassandra.datastax.graph.fluent.query"]], "clear() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.clear"]], "execute() (cassandra.datastax.graph.fluent.query.traversalbatch method)": [[14, "cassandra.datastax.graph.fluent.query.TraversalBatch.execute"]], "cassandra.datastax.graph": [[15, "module-cassandra.datastax.graph"]], "deserialize_bigint() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.datastax.graph.graphson1deserializer class method)": [[15, "cassandra.datastax.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_language"]], "graph_name (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.graph_result_row_factory"]], "graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.datastax.graph.graphoptions attribute)": [[15, "cassandra.datastax.graph.GraphOptions.is_graph_source"]], "set_source_analytics() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.datastax.graph.graphoptions method)": [[15, "cassandra.datastax.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_bigint"]], "to_double() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_double"]], "to_float() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_float"]], "to_int() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_int"]], "to_smallint() (in module cassandra.datastax.graph)": [[15, "cassandra.datastax.graph.to_smallint"]], "cassandra.decoder": [[16, "module-cassandra.decoder"]], "dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.dict_factory"]], "named_tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.ordered_dict_factory"]], "tuple_factory() (in module cassandra.decoder)": [[16, "cassandra.decoder.tuple_factory"]], "encoder (class in cassandra.encoder)": [[17, "cassandra.encoder.Encoder"]], "cassandra.encoder": [[17, "module-cassandra.encoder"]], "cql_encode_all_types() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_all_types"]], "cql_encode_bytes() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_bytes"]], "cql_encode_date() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_date"]], "cql_encode_datetime() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_datetime"]], "cql_encode_list_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_list_collection"]], "cql_encode_map_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_map_collection"]], "cql_encode_none() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_none"]], "cql_encode_object() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_object"]], "cql_encode_sequence() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_sequence"]], "cql_encode_set_collection() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_set_collection"]], "cql_encode_str() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_str"]], "cql_encode_tuple() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_tuple"]], "cql_encode_unicode() (cassandra.encoder.encoder method)": [[17, "cassandra.encoder.Encoder.cql_encode_unicode"]], "mapping (cassandra.encoder.encoder attribute)": [[17, "cassandra.encoder.Encoder.mapping"]], "edge (class in cassandra.graph)": [[18, "cassandra.graph.Edge"]], "graphson_1_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_1_0"]], "graphson_2_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_2_0"]], "graphson_3_0 (cassandra.graph.graphprotocol attribute)": [[18, "cassandra.graph.GraphProtocol.GRAPHSON_3_0"]], "graphoptions (class in cassandra.graph)": [[18, "cassandra.graph.GraphOptions"]], "graphprotocol (class in cassandra.graph)": [[18, "cassandra.graph.GraphProtocol"]], "graphson1deserializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Deserializer"]], "graphson1serializer (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON1Serializer"]], "graphson2reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON2Reader"]], "graphson3reader (class in cassandra.graph)": [[18, "cassandra.graph.GraphSON3Reader"]], "path (class in cassandra.graph)": [[18, "cassandra.graph.Path"]], "result (class in cassandra.graph)": [[18, "cassandra.graph.Result"]], "simplegraphstatement (class in cassandra.graph)": [[18, "cassandra.graph.SimpleGraphStatement"]], "vertex (class in cassandra.graph)": [[18, "cassandra.graph.Vertex"]], "vertexproperty (class in cassandra.graph)": [[18, "cassandra.graph.VertexProperty"]], "as_edge() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_edge"]], "as_path() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_path"]], "as_vertex() (cassandra.graph.result method)": [[18, "cassandra.graph.Result.as_vertex"]], "cassandra.graph": [[18, "module-cassandra.graph"]], "deserialize() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.deserialize"]], "deserialize_bigint() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_bigint"]], "deserialize_blob() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_blob"]], "deserialize_date() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_date"]], "deserialize_decimal() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_decimal"]], "deserialize_double() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_double"]], "deserialize_duration() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_duration"]], "deserialize_float() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_float"]], "deserialize_int() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_int"]], "deserialize_linestring() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_linestring"]], "deserialize_point() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_point"]], "deserialize_polygon() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_polygon"]], "deserialize_time() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_time"]], "deserialize_timestamp() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_timestamp"]], "deserialize_uuid() (cassandra.graph.graphson1deserializer class method)": [[18, "cassandra.graph.GraphSON1Deserializer.deserialize_uuid"]], "graph_graphson2_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson2_row_factory"]], "graph_graphson3_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_graphson3_row_factory"]], "graph_language (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_language"]], "graph_name (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_name"]], "graph_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_object_row_factory"]], "graph_read_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_read_consistency_level"]], "graph_result_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.graph_result_row_factory"]], "graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_source"]], "graph_write_consistency_level (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.graph_write_consistency_level"]], "is_analytics_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_analytics_source"]], "is_default_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_default_source"]], "is_graph_source (cassandra.graph.graphoptions attribute)": [[18, "cassandra.graph.GraphOptions.is_graph_source"]], "label (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.label"]], "labels (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.labels"]], "objects (cassandra.graph.path attribute)": [[18, "cassandra.graph.Path.objects"]], "properties (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.properties"]], "read() (cassandra.graph.graphson2reader method)": [[18, "cassandra.graph.GraphSON2Reader.read"]], "set_source_analytics() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_analytics"]], "set_source_default() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_default"]], "set_source_graph() (cassandra.graph.graphoptions method)": [[18, "cassandra.graph.GraphOptions.set_source_graph"]], "single_object_row_factory() (in module cassandra.graph)": [[18, "cassandra.graph.single_object_row_factory"]], "to_bigint() (in module cassandra.graph)": [[18, "cassandra.graph.to_bigint"]], "to_double() (in module cassandra.graph)": [[18, "cassandra.graph.to_double"]], "to_float() (in module cassandra.graph)": [[18, "cassandra.graph.to_float"]], "to_int() (in module cassandra.graph)": [[18, "cassandra.graph.to_int"]], "to_smallint() (in module cassandra.graph)": [[18, "cassandra.graph.to_smallint"]], "value (cassandra.graph.result attribute)": [[18, "cassandra.graph.Result.value"]], "value (cassandra.graph.vertexproperty attribute)": [[18, "cassandra.graph.VertexProperty.value"]], "asyncioconnection (class in cassandra.io.asyncioreactor)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection"]], "cassandra.io.asyncioreactor": [[19, "module-cassandra.io.asyncioreactor"]], "initialize_reactor() (cassandra.io.asyncioreactor.asyncioconnection class method)": [[19, "cassandra.io.asyncioreactor.AsyncioConnection.initialize_reactor"]], "asyncoreconnection (class in cassandra.io.asyncorereactor)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection"]], "cassandra.io.asyncorereactor": [[20, "module-cassandra.io.asyncorereactor"]], "handle_fork() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.handle_fork"]], "initialize_reactor() (cassandra.io.asyncorereactor.asyncoreconnection class method)": [[20, "cassandra.io.asyncorereactor.AsyncoreConnection.initialize_reactor"]], "eventletconnection (class in cassandra.io.eventletreactor)": [[21, "cassandra.io.eventletreactor.EventletConnection"]], "cassandra.io.eventletreactor": [[21, "module-cassandra.io.eventletreactor"]], "initialize_reactor() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.initialize_reactor"]], "service_timeouts() (cassandra.io.eventletreactor.eventletconnection class method)": [[21, "cassandra.io.eventletreactor.EventletConnection.service_timeouts"]], "geventconnection (class in cassandra.io.geventreactor)": [[22, "cassandra.io.geventreactor.GeventConnection"]], "cassandra.io.geventreactor": [[22, "module-cassandra.io.geventreactor"]], "initialize_reactor() (cassandra.io.geventreactor.geventconnection class method)": [[22, "cassandra.io.geventreactor.GeventConnection.initialize_reactor"]], "libevconnection (class in cassandra.io.libevreactor)": [[23, "cassandra.io.libevreactor.LibevConnection"]], "cassandra.io.libevreactor": [[23, "module-cassandra.io.libevreactor"]], "twistedconnection (class in cassandra.io.twistedreactor)": [[24, "cassandra.io.twistedreactor.TwistedConnection"]], "cassandra.io.twistedreactor": [[24, "module-cassandra.io.twistedreactor"]], "aggregate (class in cassandra.metadata)": [[25, "cassandra.metadata.Aggregate"]], "bytestoken (class in cassandra.metadata)": [[25, "cassandra.metadata.BytesToken"]], "columnmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.ColumnMetadata"]], "edgemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.EdgeMetadata"]], "function (class in cassandra.metadata)": [[25, "cassandra.metadata.Function"]], "indexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.IndexMetadata"]], "keyspacemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.KeyspaceMetadata"]], "localstrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.LocalStrategy"]], "md5token (class in cassandra.metadata)": [[25, "cassandra.metadata.MD5Token"]], "materializedviewmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.MaterializedViewMetadata"]], "metadata (class in cassandra.metadata)": [[25, "cassandra.metadata.Metadata"]], "murmur3token (class in cassandra.metadata)": [[25, "cassandra.metadata.Murmur3Token"]], "networktopologystrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.NetworkTopologyStrategy"]], "replicationfactor (class in cassandra.metadata)": [[25, "cassandra.metadata.ReplicationFactor"]], "replicationstrategy (in module cassandra.metadata)": [[25, "cassandra.metadata.ReplicationStrategy"]], "simplestrategy (class in cassandra.metadata)": [[25, "cassandra.metadata.SimpleStrategy"]], "tablemetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadata"]], "tablemetadatadse68 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataDSE68"]], "tablemetadatav3 (class in cassandra.metadata)": [[25, "cassandra.metadata.TableMetadataV3"]], "token (class in cassandra.metadata)": [[25, "cassandra.metadata.Token"]], "tokenmap (class in cassandra.metadata)": [[25, "cassandra.metadata.TokenMap"]], "usertype (class in cassandra.metadata)": [[25, "cassandra.metadata.UserType"]], "vertexmetadata (class in cassandra.metadata)": [[25, "cassandra.metadata.VertexMetadata"]], "add_or_return_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.add_or_return_host"]], "all_hosts() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.all_hosts"]], "as_cql_query() (cassandra.metadata.aggregate method)": [[25, "cassandra.metadata.Aggregate.as_cql_query"]], "as_cql_query() (cassandra.metadata.function method)": [[25, "cassandra.metadata.Function.as_cql_query"]], "as_cql_query() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.materializedviewmetadata method)": [[25, "cassandra.metadata.MaterializedViewMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.as_cql_query"]], "as_cql_query() (cassandra.metadata.tablemetadatadse68 method)": [[25, "cassandra.metadata.TableMetadataDSE68.as_cql_query"]], "as_cql_query() (cassandra.metadata.usertype method)": [[25, "cassandra.metadata.UserType.as_cql_query"]], "cassandra.metadata": [[25, "module-cassandra.metadata"]], "cql_keywords (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords"]], "cql_keywords_reserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_reserved"]], "cql_keywords_unreserved (in module cassandra.metadata)": [[25, "cassandra.metadata.cql_keywords_unreserved"]], "export_as_string() (cassandra.metadata.indexmetadata method)": [[25, "cassandra.metadata.IndexMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.keyspacemetadata method)": [[25, "cassandra.metadata.KeyspaceMetadata.export_as_string"]], "export_as_string() (cassandra.metadata.tablemetadata method)": [[25, "cassandra.metadata.TableMetadata.export_as_string"]], "export_for_schema() (cassandra.metadata.localstrategy method)": [[25, "cassandra.metadata.LocalStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.networktopologystrategy method)": [[25, "cassandra.metadata.NetworkTopologyStrategy.export_for_schema"]], "export_for_schema() (cassandra.metadata.simplestrategy method)": [[25, "cassandra.metadata.SimpleStrategy.export_for_schema"]], "export_schema_as_string() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.export_schema_as_string"]], "from_string() (cassandra.metadata.bytestoken class method)": [[25, "cassandra.metadata.BytesToken.from_string"]], "get_host() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host"]], "get_host_by_host_id() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_host_by_host_id"]], "get_replicas() (cassandra.metadata.metadata method)": [[25, "cassandra.metadata.Metadata.get_replicas"]], "get_replicas() (cassandra.metadata.tokenmap method)": [[25, "cassandra.metadata.TokenMap.get_replicas"]], "group_keys_by_replica() (in module cassandra.metadata)": [[25, "cassandra.metadata.group_keys_by_replica"]], "is_cql_compatible (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.is_cql_compatible"]], "is_cql_compatible (cassandra.metadata.tablemetadatav3 property)": [[25, "cassandra.metadata.TableMetadataV3.is_cql_compatible"]], "primary_key (cassandra.metadata.tablemetadata property)": [[25, "cassandra.metadata.TableMetadata.primary_key"]], "replication_factor (cassandra.metadata.simplestrategy property)": [[25, "cassandra.metadata.SimpleStrategy.replication_factor"]], "metrics (class in cassandra.metrics)": [[26, "cassandra.metrics.Metrics"]], "cassandra.metrics": [[26, "module-cassandra.metrics"]], "connected_to (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connected_to"]], "connection_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.connection_errors"]], "get_stats() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.get_stats"]], "ignores (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.ignores"]], "known_hosts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.known_hosts"]], "open_connections (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.open_connections"]], "other_errors (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.other_errors"]], "read_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.read_timeouts"]], "request_timer (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.request_timer"]], "retries (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.retries"]], "set_stats_name() (cassandra.metrics.metrics method)": [[26, "cassandra.metrics.Metrics.set_stats_name"]], "unavailables (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.unavailables"]], "write_timeouts (cassandra.metrics.metrics attribute)": [[26, "cassandra.metrics.Metrics.write_timeouts"]], "addresstranslator (class in cassandra.policies)": [[27, "cassandra.policies.AddressTranslator"]], "batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH"]], "batch_log (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.BATCH_LOG"]], "cas (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CAS"]], "cdc (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.CDC"]], "counter (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.COUNTER"]], "constantreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantReconnectionPolicy"]], "constantspeculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy"]], "convictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ConvictionPolicy"]], "dcawareroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy"]], "dseloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DSELoadBalancingPolicy"]], "defaultloadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy"]], "downgradingconsistencyretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy"]], "ec2multiregiontranslator (class in cassandra.policies)": [[27, "cassandra.policies.EC2MultiRegionTranslator"]], "exponentialreconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ExponentialReconnectionPolicy"]], "fallthroughretrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.FallthroughRetryPolicy"]], "hostdistance (class in cassandra.policies)": [[27, "cassandra.policies.HostDistance"]], "hostfilterpolicy (class in cassandra.policies)": [[27, "cassandra.policies.HostFilterPolicy"]], "ignore (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.IGNORE"]], "ignored (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.IGNORED"]], "identitytranslator (class in cassandra.policies)": [[27, "cassandra.policies.IdentityTranslator"]], "local (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.LOCAL"]], "loadbalancingpolicy (class in cassandra.policies)": [[27, "cassandra.policies.LoadBalancingPolicy"]], "remote (cassandra.policies.hostdistance attribute)": [[27, "cassandra.policies.HostDistance.REMOTE"]], "rethrow (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETHROW"]], "retry (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY"]], "retry_next_host (cassandra.policies.retrypolicy attribute)": [[27, "cassandra.policies.RetryPolicy.RETRY_NEXT_HOST"]], "reconnectionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.ReconnectionPolicy"]], "retrypolicy (class in cassandra.policies)": [[27, "cassandra.policies.RetryPolicy"]], "roundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.RoundRobinPolicy"]], "simple (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.SIMPLE"]], "simpleconvictionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SimpleConvictionPolicy"]], "speculativeexecutionpolicy (class in cassandra.policies)": [[27, "cassandra.policies.SpeculativeExecutionPolicy"]], "tokenawarepolicy (class in cassandra.policies)": [[27, "cassandra.policies.TokenAwarePolicy"]], "unlogged_batch (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.UNLOGGED_BATCH"]], "view (cassandra.policies.writetype attribute)": [[27, "cassandra.policies.WriteType.VIEW"]], "whitelistroundrobinpolicy (class in cassandra.policies)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy"]], "writetype (class in cassandra.policies)": [[27, "cassandra.policies.WriteType"]], "add_failure() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.add_failure"]], "add_failure() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.add_failure"]], "cassandra.policies": [[27, "module-cassandra.policies"]], "check_supported() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.check_supported"]], "check_supported() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.check_supported"]], "distance() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.distance"]], "distance() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.distance"]], "distance() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.distance"]], "distance() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.distance"]], "distance() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.distance"]], "distance() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.distance"]], "make_query_plan() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.make_query_plan"]], "make_query_plan() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.make_query_plan"]], "new_plan() (cassandra.policies.constantspeculativeexecutionpolicy method)": [[27, "cassandra.policies.ConstantSpeculativeExecutionPolicy.new_plan"]], "new_plan() (cassandra.policies.speculativeexecutionpolicy method)": [[27, "cassandra.policies.SpeculativeExecutionPolicy.new_plan"]], "new_schedule() (cassandra.policies.constantreconnectionpolicy method)": [[27, "cassandra.policies.ConstantReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.exponentialreconnectionpolicy method)": [[27, "cassandra.policies.ExponentialReconnectionPolicy.new_schedule"]], "new_schedule() (cassandra.policies.reconnectionpolicy method)": [[27, "cassandra.policies.ReconnectionPolicy.new_schedule"]], "on_add() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_add"]], "on_add() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_add"]], "on_add() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_add"]], "on_down() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_down"]], "on_down() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_down"]], "on_read_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_read_timeout"]], "on_read_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_read_timeout"]], "on_remove() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_remove"]], "on_remove() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_remove"]], "on_request_error() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_request_error"]], "on_request_error() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_request_error"]], "on_unavailable() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_unavailable"]], "on_unavailable() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_unavailable"]], "on_up() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.on_up"]], "on_up() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.on_up"]], "on_up() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.on_up"]], "on_write_timeout() (cassandra.policies.downgradingconsistencyretrypolicy method)": [[27, "cassandra.policies.DowngradingConsistencyRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.fallthroughretrypolicy method)": [[27, "cassandra.policies.FallthroughRetryPolicy.on_write_timeout"]], "on_write_timeout() (cassandra.policies.retrypolicy method)": [[27, "cassandra.policies.RetryPolicy.on_write_timeout"]], "populate() (cassandra.policies.dcawareroundrobinpolicy method)": [[27, "cassandra.policies.DCAwareRoundRobinPolicy.populate"]], "populate() (cassandra.policies.defaultloadbalancingpolicy method)": [[27, "cassandra.policies.DefaultLoadBalancingPolicy.populate"]], "populate() (cassandra.policies.loadbalancingpolicy method)": [[27, "cassandra.policies.LoadBalancingPolicy.populate"]], "populate() (cassandra.policies.roundrobinpolicy method)": [[27, "cassandra.policies.RoundRobinPolicy.populate"]], "populate() (cassandra.policies.tokenawarepolicy method)": [[27, "cassandra.policies.TokenAwarePolicy.populate"]], "populate() (cassandra.policies.whitelistroundrobinpolicy method)": [[27, "cassandra.policies.WhiteListRoundRobinPolicy.populate"]], "predicate() (cassandra.policies.hostfilterpolicy method)": [[27, "cassandra.policies.HostFilterPolicy.predicate"]], "reset() (cassandra.policies.convictionpolicy method)": [[27, "cassandra.policies.ConvictionPolicy.reset"]], "reset() (cassandra.policies.simpleconvictionpolicy method)": [[27, "cassandra.policies.SimpleConvictionPolicy.reset"]], "shuffle_replicas (cassandra.policies.tokenawarepolicy attribute)": [[27, "cassandra.policies.TokenAwarePolicy.shuffle_replicas"]], "translate() (cassandra.policies.addresstranslator method)": [[27, "cassandra.policies.AddressTranslator.translate"]], "translate() (cassandra.policies.ec2multiregiontranslator method)": [[27, "cassandra.policies.EC2MultiRegionTranslator.translate"]], "translate() (cassandra.policies.identitytranslator method)": [[27, "cassandra.policies.IdentityTranslator.translate"]], "host (class in cassandra.pool)": [[28, "cassandra.pool.Host"]], "noconnectionsavailable": [[28, "cassandra.pool.NoConnectionsAvailable"]], "address (cassandra.pool.host property)": [[28, "cassandra.pool.Host.address"]], "cassandra.pool": [[28, "module-cassandra.pool"]], "datacenter (cassandra.pool.host property)": [[28, "cassandra.pool.Host.datacenter"]], "rack (cassandra.pool.host property)": [[28, "cassandra.pool.Host.rack"]], "_protocolhandler (class in cassandra.protocol)": [[29, "cassandra.protocol._ProtocolHandler"]], "cassandra.protocol": [[29, "module-cassandra.protocol"]], "decode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.decode_message"]], "encode_message() (cassandra.protocol._protocolhandler class method)": [[29, "cassandra.protocol._ProtocolHandler.encode_message"]], "message_types_by_opcode (cassandra.protocol._protocolhandler attribute)": [[29, "cassandra.protocol._ProtocolHandler.message_types_by_opcode"]], "batchstatement (class in cassandra.query)": [[30, "cassandra.query.BatchStatement"]], "batchtype (class in cassandra.query)": [[30, "cassandra.query.BatchType"]], "boundstatement (class in cassandra.query)": [[30, "cassandra.query.BoundStatement"]], "counter (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.COUNTER"]], "logged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.LOGGED"]], "preparedstatement (class in cassandra.query)": [[30, "cassandra.query.PreparedStatement"]], "querytrace (class in cassandra.query)": [[30, "cassandra.query.QueryTrace"]], "simplestatement (class in cassandra.query)": [[30, "cassandra.query.SimpleStatement"]], "statement (class in cassandra.query)": [[30, "cassandra.query.Statement"]], "traceevent (class in cassandra.query)": [[30, "cassandra.query.TraceEvent"]], "traceunavailable": [[30, "cassandra.query.TraceUnavailable"]], "unlogged (cassandra.query.batchtype attribute)": [[30, "cassandra.query.BatchType.UNLOGGED"]], "unset_value (in module cassandra.query)": [[30, "cassandra.query.UNSET_VALUE"]], "valuesequence (class in cassandra.query)": [[30, "cassandra.query.ValueSequence"]], "add() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add"]], "add_all() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.add_all"]], "bind() (cassandra.query.boundstatement method)": [[30, "cassandra.query.BoundStatement.bind"]], "bind() (cassandra.query.preparedstatement method)": [[30, "cassandra.query.PreparedStatement.bind"]], "cassandra.query": [[30, "module-cassandra.query"]], "clear() (cassandra.query.batchstatement method)": [[30, "cassandra.query.BatchStatement.clear"]], "dict_factory() (in module cassandra.query)": [[30, "cassandra.query.dict_factory"]], "named_tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.named_tuple_factory"]], "ordered_dict_factory() (in module cassandra.query)": [[30, "cassandra.query.ordered_dict_factory"]], "populate() (cassandra.query.querytrace method)": [[30, "cassandra.query.QueryTrace.populate"]], "routing_key (cassandra.query.boundstatement property)": [[30, "cassandra.query.BoundStatement.routing_key"]], "routing_key (cassandra.query.statement property)": [[30, "cassandra.query.Statement.routing_key"]], "serial_consistency_level (cassandra.query.batchstatement attribute)": [[30, "cassandra.query.BatchStatement.serial_consistency_level"]], "serial_consistency_level (cassandra.query.statement property)": [[30, "cassandra.query.Statement.serial_consistency_level"]], "tuple_factory() (in module cassandra.query)": [[30, "cassandra.query.tuple_factory"]], "monotonictimestampgenerator (class in cassandra.timestamps)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator"]], "_next_timestamp() (cassandra.timestamps.monotonictimestampgenerator method)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator._next_timestamp"]], "cassandra.timestamps": [[31, "module-cassandra.timestamps"]], "warn_on_drift (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warn_on_drift"]], "warning_interval (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_interval"]], "warning_threshold (cassandra.timestamps.monotonictimestampgenerator attribute)": [[31, "cassandra.timestamps.MonotonicTimestampGenerator.warning_threshold"]], "date (class in cassandra.util)": [[32, "cassandra.util.Date"]], "daterange (class in cassandra.util)": [[32, "cassandra.util.DateRange"]], "daterangebound (class in cassandra.util)": [[32, "cassandra.util.DateRangeBound"]], "daterangeprecision (class in cassandra.util)": [[32, "cassandra.util.DateRangePrecision"]], "distance (class in cassandra.util)": [[32, "cassandra.util.Distance"]], "duration (class in cassandra.util)": [[32, "cassandra.util.Duration"]], "linestring (class in cassandra.util)": [[32, "cassandra.util.LineString"]], "orderedmap (class in cassandra.util)": [[32, "cassandra.util.OrderedMap"]], "orderedmapserializedkey (class in cassandra.util)": [[32, "cassandra.util.OrderedMapSerializedKey"]], "point (class in cassandra.util)": [[32, "cassandra.util.Point"]], "polygon (class in cassandra.util)": [[32, "cassandra.util.Polygon"]], "sortedset (class in cassandra.util)": [[32, "cassandra.util.SortedSet"]], "time (class in cassandra.util)": [[32, "cassandra.util.Time"]], "version (class in cassandra.util)": [[32, "cassandra.util.Version"]], "cassandra.util": [[32, "module-cassandra.util"]], "date() (cassandra.util.date method)": [[32, "cassandra.util.Date.date"]], "datetime() (cassandra.util.daterangebound method)": [[32, "cassandra.util.DateRangeBound.datetime"]], "datetime_from_timestamp() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_timestamp"]], "datetime_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.datetime_from_uuid1"]], "from_value() (cassandra.util.daterangebound class method)": [[32, "cassandra.util.DateRangeBound.from_value"]], "from_wkt() (cassandra.util.distance static method)": [[32, "cassandra.util.Distance.from_wkt"]], "from_wkt() (cassandra.util.linestring static method)": [[32, "cassandra.util.LineString.from_wkt"]], "from_wkt() (cassandra.util.point static method)": [[32, "cassandra.util.Point.from_wkt"]], "from_wkt() (cassandra.util.polygon static method)": [[32, "cassandra.util.Polygon.from_wkt"]], "hour (cassandra.util.time property)": [[32, "cassandra.util.Time.hour"]], "lower_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.lower_bound"]], "max_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.max_uuid_from_time"]], "milliseconds (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.milliseconds"]], "min_uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.min_uuid_from_time"]], "minute (cassandra.util.time property)": [[32, "cassandra.util.Time.minute"]], "ms_timestamp_from_datetime() (in module cassandra.util)": [[32, "cassandra.util.ms_timestamp_from_datetime"]], "nanosecond (cassandra.util.time property)": [[32, "cassandra.util.Time.nanosecond"]], "precision (cassandra.util.daterangebound attribute)": [[32, "cassandra.util.DateRangeBound.precision"]], "second (cassandra.util.time property)": [[32, "cassandra.util.Time.second"]], "seconds (cassandra.util.date property)": [[32, "cassandra.util.Date.seconds"]], "sortedset (in module cassandra.util)": [[32, "cassandra.util.sortedset"]], "time() (cassandra.util.time method)": [[32, "cassandra.util.Time.time"]], "unix_time_from_uuid1() (in module cassandra.util)": [[32, "cassandra.util.unix_time_from_uuid1"]], "upper_bound (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.upper_bound"]], "utc_datetime_from_ms_timestamp() (in module cassandra.util)": [[32, "cassandra.util.utc_datetime_from_ms_timestamp"]], "uuid_from_time() (in module cassandra.util)": [[32, "cassandra.util.uuid_from_time"]], "value (cassandra.util.daterange attribute)": [[32, "cassandra.util.DateRange.value"]], "cqlengine.models": [[37, "module-cqlengine.models"]], "maxtimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MaxTimeUUID"]], "mintimeuuid (class in cqlengine.queryset)": [[38, "cqlengine.queryset.MinTimeUUID"]], "cqlengine.queryset": [[38, "module-cqlengine.queryset"]]}}) \ No newline at end of file diff --git a/stable/security.html b/stable/security.html new file mode 100644 index 0000000000..0bb18aaab9 --- /dev/null +++ b/stable/security.html @@ -0,0 +1,1005 @@ + + + + + + + + + + + + + Security | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Security

                      +

                      The two main security components you will use with the +Python driver are Authentication and SSL.

                      +
                      +

                      Authentication

                      +

                      Versions 2.0 and higher of the driver support a SASL-based +authentication mechanism when protocol_version +is set to 2 or higher. To use this authentication, set +auth_provider to an instance of a subclass +of AuthProvider. When working +with Cassandra’s PasswordAuthenticator, you can use +the PlainTextAuthProvider class.

                      +

                      For example, suppose Cassandra is setup with its default +‘cassandra’ user with a password of ‘cassandra’:

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.auth import PlainTextAuthProvider
                      +
                      +auth_provider = PlainTextAuthProvider(username='cassandra', password='cassandra')
                      +cluster = Cluster(auth_provider=auth_provider, protocol_version=2)
                      +
                      +
                      +
                      +

                      Custom Authenticators

                      +

                      If you’re using something other than Cassandra’s PasswordAuthenticator, +SaslAuthProvider is provided for generic SASL authentication mechanisms, +utilizing the pure-sasl package. +If these do not suit your needs, you may need to create your own subclasses of +AuthProvider and Authenticator. You can use the Sasl classes +as example implementations.

                      +
                      +
                      +

                      Protocol v1 Authentication

                      +

                      When working with Cassandra 1.2 (or a higher version with +protocol_version set to 1), you will not pass in +an AuthProvider instance. Instead, you should pass in a +function that takes one argument, the IP address of a host, and returns +a dict of credentials with a username and password key:

                      +
                      from cassandra.cluster import Cluster
                      +
                      +def get_credentials(host_address):
                      +    return {'username': 'joe', 'password': '1234'}
                      +
                      +cluster = Cluster(auth_provider=get_credentials, protocol_version=1)
                      +
                      +
                      +
                      +
                      +
                      +

                      SSL

                      +

                      SSL should be used when client encryption is enabled in Cassandra.

                      +

                      To give you as much control as possible over your SSL configuration, our SSL +API takes a user-created SSLContext instance from the Python standard library. +These docs will include some examples for how to achieve common configurations, +but the ssl.SSLContext documentation +gives a more complete description of what is possible.

                      +

                      To enable SSL with version 3.17.0 and higher, you will need to set Cluster.ssl_context to a +ssl.SSLContext instance to enable SSL. Optionally, you can also set Cluster.ssl_options +to a dict of options. These will be passed as kwargs to ssl.SSLContext.wrap_socket() +when new sockets are created.

                      +

                      If you create your SSLContext using ssl.create_default_context, +be aware that SSLContext.check_hostname is set to True by default, so the hostname validation will be done +by Python and not the driver. For this reason, we need to set the server_hostname at best effort, which is the +resolved ip address. If this validation needs to be done against the FQDN, consider enabling it using the ssl_options +as described in the following examples or implement your own EndPoint and +EndPointFactory.

                      +

                      The following examples assume you have generated your Cassandra certificate and +keystore files with these intructions:

                      + +

                      It might be also useful to learn about the different levels of identity verification to understand the examples:

                      + +
                      +

                      SSL with Twisted or Eventlet

                      +

                      Twisted and Eventlet both use an alternative SSL implementation called pyOpenSSL, so if your Cluster’s connection class is +TwistedConnection or EventletConnection, you must pass a +pyOpenSSL context instead. +An example is provided in these docs, and more details can be found in the +documentation. +pyOpenSSL is not installed by the driver and must be installed separately.

                      +
                      +
                      +

                      SSL Configuration Examples

                      +

                      Here, we’ll describe the server and driver configuration necessary to set up SSL to meet various goals, such as the client verifying the server and the server verifying the client. We’ll also include Python code demonstrating how to use servers and drivers configured in these ways.

                      +
                      +

                      No identity verification

                      +

                      No identity verification at all. Note that this is not recommended for for production deployments.

                      +

                      The Cassandra configuration:

                      +
                      client_encryption_options:
                      +  enabled: true
                      +  keystore: /path/to/127.0.0.1.keystore
                      +  keystore_password: myStorePass
                      +  require_client_auth: false
                      +
                      +
                      +

                      The driver configuration:

                      +
                      from cassandra.cluster import Cluster, Session
                      +from ssl import SSLContext, PROTOCOL_TLS
                      +
                      +ssl_context = SSLContext(PROTOCOL_TLS)
                      +
                      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                      +session = cluster.connect()
                      +
                      +
                      +
                      +
                      +

                      Client verifies server

                      +

                      Ensure the python driver verifies the identity of the server.

                      +

                      The Cassandra configuration:

                      +
                      client_encryption_options:
                      +  enabled: true
                      +  keystore: /path/to/127.0.0.1.keystore
                      +  keystore_password: myStorePass
                      +  require_client_auth: false
                      +
                      +
                      +

                      For the driver configuration, it’s very important to set ssl_context.verify_mode +to CERT_REQUIRED. Otherwise, the loaded verify certificate will have no effect:

                      +
                      from cassandra.cluster import Cluster, Session
                      +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                      +
                      +ssl_context = SSLContext(PROTOCOL_TLS)
                      +ssl_context.load_verify_locations('/path/to/rootca.crt')
                      +ssl_context.verify_mode = CERT_REQUIRED
                      +
                      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                      +session = cluster.connect()
                      +
                      +
                      +

                      Additionally, you can also force the driver to verify the hostname of the server by passing additional options to ssl_context.wrap_socket via the ssl_options kwarg:

                      +
                      from cassandra.cluster import Cluster, Session
                      +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                      +
                      +ssl_context = SSLContext(PROTOCOL_TLS)
                      +ssl_context.load_verify_locations('/path/to/rootca.crt')
                      +ssl_context.verify_mode = CERT_REQUIRED
                      +ssl_context.check_hostname = True
                      +ssl_options = {'server_hostname': '127.0.0.1'}
                      +
                      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context, ssl_options=ssl_options)
                      +session = cluster.connect()
                      +
                      +
                      +
                      +
                      +

                      Server verifies client

                      +

                      If Cassandra is configured to verify clients (require_client_auth), you need to generate +SSL key and certificate files.

                      +

                      The cassandra configuration:

                      +
                      client_encryption_options:
                      +  enabled: true
                      +  keystore: /path/to/127.0.0.1.keystore
                      +  keystore_password: myStorePass
                      +  require_client_auth: true
                      +  truststore: /path/to/dse-truststore.jks
                      +  truststore_password: myStorePass
                      +
                      +
                      +

                      The Python ssl APIs require the certificate in PEM format. First, create a certificate +conf file:

                      +
                      cat > gen_client_cert.conf <<EOF
                      +[ req ]
                      +distinguished_name = req_distinguished_name
                      +prompt = no
                      +output_password = ${ROOT_CERT_PASS}
                      +default_bits = 2048
                      +
                      +[ req_distinguished_name ]
                      +C = ${CERT_COUNTRY}
                      +O = ${CERT_ORG_NAME}
                      +OU = ${CERT_OU}
                      +CN = client
                      +EOF
                      +
                      +
                      +

                      Make sure you replaced the variables with the same values you used for the initial +root CA certificate. Then, generate the key:

                      +
                      openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -config gen_client_cert.conf
                      +
                      +
                      +

                      And generate the client signed certificate:

                      +
                      openssl x509 -req -CA ${ROOT_CA_BASE_NAME}.crt -CAkey ${ROOT_CA_BASE_NAME}.key -passin pass:${ROOT_CERT_PASS} \
                      +    -in client.csr -out client.crt_signed -days ${CERT_VALIDITY} -CAcreateserial
                      +
                      +
                      +

                      Finally, you can use that configuration with the following driver code:

                      +
                      from cassandra.cluster import Cluster, Session
                      +from ssl import SSLContext, PROTOCOL_TLS
                      +
                      +ssl_context = SSLContext(PROTOCOL_TLS)
                      +ssl_context.load_cert_chain(
                      +    certfile='/path/to/client.crt_signed',
                      +    keyfile='/path/to/client.key')
                      +
                      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                      +session = cluster.connect()
                      +
                      +
                      +
                      +
                      +

                      Server verifies client and client verifies server

                      +

                      See the previous section for examples of Cassandra configuration and preparing +the client certificates.

                      +

                      The following driver code specifies that the connection should use two-way verification:

                      +
                      from cassandra.cluster import Cluster, Session
                      +from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
                      +
                      +ssl_context = SSLContext(PROTOCOL_TLS)
                      +ssl_context.load_verify_locations('/path/to/rootca.crt')
                      +ssl_context.verify_mode = CERT_REQUIRED
                      +ssl_context.load_cert_chain(
                      +    certfile='/path/to/client.crt_signed',
                      +    keyfile='/path/to/client.key')
                      +
                      +cluster = Cluster(['127.0.0.1'], ssl_context=ssl_context)
                      +session = cluster.connect()
                      +
                      +
                      +

                      The driver uses SSLContext directly to give you many other options in configuring SSL. Consider reading the Python SSL documentation +for more details about SSLContext configuration.

                      +

                      Server verifies client and client verifies server using Twisted and pyOpenSSL

                      +
                      from OpenSSL import SSL, crypto
                      +from cassandra.cluster import Cluster
                      +from cassandra.io.twistedreactor import TwistedConnection
                      +
                      +ssl_context = SSL.Context(SSL.TLSv1_2_METHOD)
                      +ssl_context.set_verify(SSL.VERIFY_PEER, callback=lambda _1, _2, _3, _4, ok: ok)
                      +ssl_context.use_certificate_file('/path/to/client.crt_signed')
                      +ssl_context.use_privatekey_file('/path/to/client.key')
                      +ssl_context.load_verify_locations('/path/to/rootca.crt')
                      +
                      +cluster = Cluster(
                      +    contact_points=['127.0.0.1'],
                      +    connection_class=TwistedConnection,
                      +    ssl_context=ssl_context,
                      +    ssl_options={'check_hostname': True}
                      +)
                      +session = cluster.connect()
                      +
                      +
                      +

                      Connecting using Eventlet would look similar except instead of importing and using TwistedConnection, you would +import and use EventletConnection, including the appropriate monkey-patching.

                      +
                      +
                      +
                      +

                      Versions 3.16.0 and lower

                      +

                      To enable SSL you will need to set Cluster.ssl_options to a +dict of options. These will be passed as kwargs to ssl.wrap_socket() +when new sockets are created. Note that this use of ssl_options will be +deprecated in the next major release.

                      +

                      By default, a ca_certs value should be supplied (the value should be +a string pointing to the location of the CA certs file), and you probably +want to specify ssl_version as ssl.PROTOCOL_TLS to match +Cassandra’s default protocol.

                      +

                      For example:

                      +
                      from cassandra.cluster import Cluster
                      +from ssl import PROTOCOL_TLS, CERT_REQUIRED
                      +
                      +ssl_opts = {
                      +    'ca_certs': '/path/to/my/ca.certs',
                      +    'ssl_version': PROTOCOL_TLS,
                      +    'cert_reqs': CERT_REQUIRED  # Certificates are required and validated
                      +}
                      +cluster = Cluster(ssl_options=ssl_opts)
                      +
                      +
                      +

                      This is only an example to show how to pass the ssl parameters. Consider reading +the python ssl documentation for +your configuration. For further reading, Andrew Mussey has published a thorough guide on +Using SSL with the DataStax Python driver.

                      +
                      +

                      SSL with Twisted

                      +

                      In case the twisted event loop is used pyOpenSSL must be installed or an exception will be risen. Also +to set the ssl_version and cert_reqs in ssl_opts the appropriate constants from pyOpenSSL are expected.

                      +
                      +
                      +
                      +
                      +

                      DSE Authentication

                      +

                      When authenticating against DSE, the Cassandra driver provides two auth providers that work both with legacy kerberos and Cassandra authenticators, +as well as the new DSE Unified Authentication. This allows client to configure this auth provider independently, +and in advance of any server upgrade. These auth providers are configured in the same way as any previous implementation:

                      +
                      from cassandra.auth import DSEGSSAPIAuthProvider
                      +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"])
                      +cluster = Cluster(auth_provider=auth_provider)
                      +session = cluster.connect()
                      +
                      +
                      +

                      Implementations are DSEPlainTextAuthProvider, DSEGSSAPIAuthProvider and SaslAuthProvider.

                      +
                      +

                      DSE Unified Authentication

                      +

                      With DSE (>=5.1), unified Authentication allows you to:

                      +
                        +
                      • Proxy Login: Authenticate using a fixed set of authentication credentials but allow authorization of resources based another user id.

                      • +
                      • Proxy Execute: Authenticate using a fixed set of authentication credentials but execute requests based on another user id.

                      • +
                      +
                      +

                      Proxy Login

                      +

                      Proxy login allows you to authenticate with a user but act as another one. You need to ensure the authenticated user has the permission to use the authorization of resources of the other user. ie. this example will allow the server user to authenticate as usual but use the authorization of user1:

                      +
                      GRANT PROXY.LOGIN on role user1 to server
                      +
                      +
                      +

                      then you can do the proxy authentication….

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.auth import SaslAuthProvider
                      +
                      +sasl_kwargs = {
                      +  "service": 'dse',
                      +  "mechanism":"PLAIN",
                      +  "username": 'server',
                      +  'password': 'server',
                      +  'authorization_id': 'user1'
                      +}
                      +
                      +auth_provider = SaslAuthProvider(**sasl_kwargs)
                      +c = Cluster(auth_provider=auth_provider)
                      +s = c.connect()
                      +s.execute(...)  # all requests will be executed as 'user1'
                      +
                      +
                      +

                      If you are using kerberos, you can use directly DSEGSSAPIAuthProvider and pass the authorization_id, like this:

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.auth import DSEGSSAPIAuthProvider
                      +
                      +# Ensure the kerberos ticket of the server user is set with the kinit utility.
                      +auth_provider = DSEGSSAPIAuthProvider(service='dse', qops=["auth"], principal="server@DATASTAX.COM",
                      +                                      authorization_id='user1@DATASTAX.COM')
                      +c = Cluster(auth_provider=auth_provider)
                      +s = c.connect()
                      +s.execute(...)  # all requests will be executed as 'user1'
                      +
                      +
                      +
                      +
                      +

                      Proxy Execute

                      +

                      Proxy execute allows you to execute requests as another user than the authenticated one. You need to ensure the authenticated user has the permission to use the authorization of resources of the specified user. ie. this example will allow the server user to execute requests as user1:

                      +
                      GRANT PROXY.EXECUTE on role user1 to server
                      +
                      +
                      +

                      then you can do a proxy execute…

                      +
                      from cassandra.cluster import Cluster
                      +from cassandra.auth import DSEPlainTextAuthProvider,
                      +
                      +auth_provider = DSEPlainTextAuthProvider('server', 'server')
                      +
                      +c = Cluster(auth_provider=auth_provider)
                      +s = c.connect()
                      +s.execute('select * from k.t;', execute_as='user1')  # the request will be executed as 'user1'
                      +
                      +
                      +

                      Please see the official documentation for more details on the feature and configuration process.

                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/sitemap.xml b/stable/sitemap.xml new file mode 100644 index 0000000000..5ad2b2c298 --- /dev/null +++ b/stable/sitemap.xml @@ -0,0 +1,2 @@ + +https://python-driver.docs.scylladb.com/stable/CHANGELOG.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/auth.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cluster.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/concurrent.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/decoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/encoder.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/columns.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/connection.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/graph.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/management.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncioreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/asyncorereactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/policies.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/cqlengine/usertype.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/eventletreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/index.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/geventreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/datastax/graph/fluent/predicates.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/libevreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/pool.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/protocol.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/io/twistedreactor.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/query.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/timestamps.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/util.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metadata.htmlhttps://python-driver.docs.scylladb.com/stable/api/cassandra/metrics.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-specific.htmlhttps://python-driver.docs.scylladb.com/stable/security.htmlhttps://python-driver.docs.scylladb.com/stable/api/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/upgrade-guide.htmlhttps://python-driver.docs.scylladb.com/stable/upgrading.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/batches.htmlhttps://python-driver.docs.scylladb.com/stable/dates-and-times.htmlhttps://python-driver.docs.scylladb.com/stable/execution-profiles.htmlhttps://python-driver.docs.scylladb.com/stable/user-defined-types.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/connections.htmlhttps://python-driver.docs.scylladb.com/stable/faq.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/faq.htmlhttps://python-driver.docs.scylladb.com/stable/getting-started.htmlhttps://python-driver.docs.scylladb.com/stable/index.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/models.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/queryset.htmlhttps://python-driver.docs.scylladb.com/stable/installation.htmlhttps://python-driver.docs.scylladb.com/stable/cqlengine/third-party.htmlhttps://python-driver.docs.scylladb.com/stable/lwt.htmlhttps://python-driver.docs.scylladb.com/stable/object-mapper.htmlhttps://python-driver.docs.scylladb.com/stable/performance.htmlhttps://python-driver.docs.scylladb.com/stable/query-paging.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-cloud.htmlhttps://python-driver.docs.scylladb.com/stable/scylla-cloud-serverless.htmlhttps://python-driver.docs.scylladb.com/stable/py-modindex.htmlhttps://python-driver.docs.scylladb.com/stable/404.htmlhttps://python-driver.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/stable/upgrading.html b/stable/upgrading.html new file mode 100644 index 0000000000..98f61c8e61 --- /dev/null +++ b/stable/upgrading.html @@ -0,0 +1,994 @@ + + + + + + + + + + + + + Upgrading | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      Upgrading

                      +
                      +
                      +
                      +

                      Installation

                      +

                      Only the scylla-driver package should be installed. dse-driver and dse-graph +are not required anymore:

                      +
                      pip install scylla-driver
                      +
                      +
                      +

                      If you need the Graph Fluent API (features provided by dse-graph):

                      +
                      pip install scylla-driver[graph]
                      +
                      +
                      +

                      See Installation for more details.

                      +
                      +
                      +

                      Import from the cassandra module

                      +

                      There is no dse module, so you should import from the cassandra module. You +need to change only the first module of your import statements, not the submodules.

                      +
                      from dse.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
                      +from dse.auth import PlainTextAuthProvider
                      +from dse.policies import WhiteListRoundRobinPolicy
                      +
                      +# becomes
                      +
                      +from cassandra.cluster import Cluster, EXEC_PROFILE_GRAPH_DEFAULT
                      +from cassandra.auth import PlainTextAuthProvider
                      +from cassandra.policies import WhiteListRoundRobinPolicy
                      +
                      +
                      +

                      Also note that the cassandra.hosts module doesn’t exist in scylla-driver. This +module is named cassandra.pool.

                      +
                      +
                      +

                      dse-graph

                      +

                      dse-graph features are now built into scylla-driver. The only change you need +to do is your import statements:

                      +
                      from dse_graph import ..
                      +from dse_graph.query import ..
                      +
                      +# becomes
                      +
                      +from cassandra.datastax.graph.fluent import ..
                      +from cassandra.datastax.graph.fluent.query import ..
                      +
                      +
                      +

                      See fluent.

                      +
                      +
                      +

                      Session.execute and Session.execute_async API

                      +

                      Although it is not common to use this API with positional arguments, it is +important to be aware that the host and execute_as parameters have had +their positional order swapped. This is only because execute_as was added +in dse-driver before host.

                      +

                      See Session.execute().

                      +
                      +
                      +

                      Deprecations

                      +

                      These changes are optional, but recommended:

                      +
                        +
                      • Importing from cassandra.graph is deprecated. Consider importing from cassandra.datastax.graph.

                      • +
                      • Use DefaultLoadBalancingPolicy instead of DSELoadBalancingPolicy.

                      • +
                      +
                      +

                      Upgrading to 3.0

                      +

                      Version 3.0 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 3.0 while maintaining support for +previously supported versions. In addition to substantial internal rework, +there are several updates to the API that integrators will need +to consider:

                      +
                      +
                      +
                      +

                      Default consistency is now LOCAL_ONE

                      +

                      Previous value was ONE. The new value is introduced to mesh with the default +DC-aware load balancing policy and to match other drivers.

                      +
                      +
                      +

                      Execution API Updates

                      +
                      +

                      Result return normalization

                      +

                      PYTHON-368

                      +

                      Previously results would be returned as a list of rows for result rows +up to fetch_size, and PagedResult afterward. This could break +application code that assumed one type and got another.

                      +

                      Now, all results are returned as an iterable ResultSet.

                      +

                      The preferred way to consume results of unknown size is to iterate through +them, letting automatic paging occur as they are consumed.

                      +
                      results = session.execute("SELECT * FROM system.local")
                      +for row in results:
                      +    process(row)
                      +
                      +
                      +

                      If the expected size of the results is known, it is still possible to +materialize a list using the iterator:

                      +
                      results = session.execute("SELECT * FROM system.local")
                      +row_list = list(results)
                      +
                      +
                      +

                      For backward compatibility, ResultSet supports indexing. When +accessed at an index, a ~.ResultSet object will materialize all its pages:

                      +
                      results = session.execute("SELECT * FROM system.local")
                      +first_result = results[0]  # materializes results, fetching all pages
                      +
                      +
                      +

                      This can send requests and load (possibly large) results into memory, so +~.ResultSet will log a warning on implicit materialization.

                      +
                      +
                      +

                      Trace information is not attached to executed Statements

                      +

                      PYTHON-318

                      +

                      Previously trace data was attached to Statements if tracing was enabled. This +could lead to confusion if the same statement was used for multiple executions.

                      +

                      Now, trace data is associated with the ResponseFuture and ResultSet +returned for each query:

                      +

                      ResponseFuture.get_query_trace()

                      +

                      ResponseFuture.get_all_query_traces()

                      +

                      ResultSet.get_query_trace()

                      +

                      ResultSet.get_all_query_traces()

                      +
                      +
                      +

                      Binding named parameters now ignores extra names

                      +

                      PYTHON-178

                      +

                      Previously, BoundStatement.bind() would raise if a mapping +was passed with extra names not found in the prepared statement.

                      +

                      Behavior in 3.0+ is to ignore extra names.

                      +
                      +
                      +
                      +

                      blist removed as soft dependency

                      +

                      PYTHON-385

                      +

                      Previously the driver had a soft dependency on blist sortedset, using +that where available and using an internal fallback where possible.

                      +

                      Now, the driver never chooses the blist variant, instead returning the +internal util.SortedSet for all set results. The class implements +all standard set operations, so no integration code should need to change unless +it explicitly checks for sortedset type.

                      +
                      +
                      +

                      Metadata API Updates

                      +

                      PYTHON-276, PYTHON-408, PYTHON-400, PYTHON-422

                      +

                      Cassandra 3.0 brought a substantial overhaul to the internal schema metadata representation. +This version of the driver supports that metadata in addition to the legacy version. Doing so +also brought some changes to the metadata model.

                      +

                      The present API is documented: cassandra.metadata. Changes highlighted below:

                      +
                        +
                      • All types are now exposed as CQL types instead of types derived from the internal server implementation

                      • +
                      • Some metadata attributes have changed names to match current nomenclature (for example, Index.kind in place of Index.type).

                      • +
                      • Some metadata attributes removed

                        +
                          +
                        • TableMetadata.keyspace reference replaced with TableMetadata.keyspace_name

                        • +
                        • ColumnMetadata.index is removed table- and keyspace-level mappings are still maintained

                        • +
                        +
                      • +
                      +
                      +
                      +

                      Several deprecated features are removed

                      +

                      PYTHON-292

                      +
                        +
                      • ResponseFuture.result timeout parameter is removed, use Session.execute timeout instead (031ebb0)

                      • +
                      • Cluster.refresh_schema removed, use Cluster.refresh_*_metadata instead (419fcdf)

                      • +
                      • Cluster.submit_schema_refresh removed (574266d)

                      • +
                      • cqltypes time/date functions removed, use util entry points instead (bb984ee)

                      • +
                      • decoder module removed (e16a073)

                      • +
                      • TableMetadata.keyspace attribute replaced with keyspace_name (cc94073)

                      • +
                      • cqlengine.columns.TimeUUID.from_datetime removed, use util variant instead (96489cc)

                      • +
                      • cqlengine.columns.Float(double_precision) parameter removed, use columns.Double instead (a2d3a98)

                      • +
                      • cqlengine keyspace management functions are removed in favor of the strategy-specific entry points (4bd5909)

                      • +
                      • cqlengine.Model.__polymorphic_*__ attributes removed, use __discriminator* attributes instead (9d98c8e)

                      • +
                      • cqlengine.statements will no longer warn about list list prepend behavior (79efe97)

                      • +
                      +
                      +

                      Upgrading to 2.1 from 2.0

                      +

                      Version 2.1 of the DataStax Python driver for Apache Cassandra +adds support for Cassandra 2.1 and version 3 of the native protocol.

                      +

                      Cassandra 1.2, 2.0, and 2.1 are all supported. However, 1.2 only +supports protocol version 1, and 2.0 only supports versions 1 and +2, so some features may not be available.

                      +
                      +
                      +
                      +

                      Using the v3 Native Protocol

                      +

                      By default, the driver will attempt to use version 2 of the +native protocol. To use version 3, you must explicitly +set the protocol_version:

                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster(protocol_version=3)
                      +
                      +
                      +

                      Note that protocol version 3 is only supported by Cassandra 2.1+.

                      +

                      In future releases, the driver may default to using protocol version +3.

                      +
                      +
                      +

                      Working with User-Defined Types

                      +

                      Cassandra 2.1 introduced the ability to define new types:

                      +
                      USE KEYSPACE mykeyspace;
                      +
                      +CREATE TYPE address (street text, city text, zip int);
                      +
                      +
                      +

                      The driver generally expects you to use instances of a specific +class to represent column values of this type. You can let the +driver know what class to use with Cluster.register_user_type():

                      +
                      cluster = Cluster()
                      +
                      +class Address(object):
                      +
                      +    def __init__(self, street, city, zipcode):
                      +        self.street = street
                      +        self.city = text
                      +        self.zipcode = zipcode
                      +
                      +cluster.register_user_type('mykeyspace', 'address', Address)
                      +
                      +
                      +

                      When inserting data for address columns, you should pass in +instances of Address. When querying data, address column +values will be instances of Address.

                      +

                      If no class is registered for a user-defined type, query results +will use a namedtuple class and data may only be inserted +though prepared statements.

                      +

                      See User Defined Types for more details.

                      +
                      +
                      +

                      Customizing Encoders for Non-prepared Statements

                      +

                      Starting with version 2.1 of the driver, it is possible to customize +how Python types are converted to CQL literals when working with +non-prepared statements. This is done on a per-Session +basis through Session.encoder:

                      +
                      cluster = Cluster()
                      +session = cluster.connect()
                      +session.encoder.mapping[tuple] = session.encoder.cql_encode_tuple
                      +
                      +
                      +

                      See Type Conversions for the table of default CQL literal conversions.

                      +
                      +
                      +

                      Using Client-Side Protocol-Level Timestamps

                      +

                      With version 3 of the native protocol, timestamps may be supplied by the +client at the protocol level. (Normally, if they are not specified within +the CQL query itself, a timestamp is generated server-side.)

                      +

                      When protocol_version is set to 3 or higher, the driver +will automatically use client-side timestamps with microsecond precision +unless Session.use_client_timestamp is changed to False. +If a timestamp is specified within the CQL query, it will override the +timestamp generated by the driver.

                      +
                      +

                      Upgrading to 2.0 from 1.x

                      +

                      Version 2.0 of the DataStax Python driver for Apache Cassandra +includes some notable improvements over version 1.x. This version +of the driver supports Cassandra 1.2, 2.0, and 2.1. However, not +all features may be used with Cassandra 1.2, and some new features +in 2.1 are not yet supported.

                      +
                      +
                      +
                      +

                      Using the v2 Native Protocol

                      +

                      By default, the driver will attempt to use version 2 of Cassandra’s +native protocol. You can explicitly set the protocol version to +2, though:

                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster(protocol_version=2)
                      +
                      +
                      +

                      When working with Cassandra 1.2, you will need to +explicitly set the protocol_version to 1:

                      +
                      from cassandra.cluster import Cluster
                      +
                      +cluster = Cluster(protocol_version=1)
                      +
                      +
                      +
                      +
                      +

                      Automatic Query Paging

                      +

                      Version 2 of the native protocol adds support for automatic query +paging, which can make dealing with large result sets much simpler.

                      +

                      See Paging Large Queries for full details.

                      +
                      +
                      +

                      Protocol-Level Batch Statements

                      +

                      With version 1 of the native protocol, batching of statements required +using a BATCH cql query. +With version 2 of the native protocol, you can now batch statements at +the protocol level. This allows you to use many different prepared +statements within a single batch.

                      +

                      See BatchStatement for details and usage examples.

                      +
                      +
                      +

                      SASL-based Authentication

                      +

                      Also new in version 2 of the native protocol is SASL-based authentication. +See the section on Security for details and examples.

                      +
                      +
                      +

                      Lightweight Transactions

                      +

                      Lightweight transactions are another new feature. To use lightweight transactions, add IF clauses +to your CQL queries and set the serial_consistency_level +on your statements.

                      +
                      +
                      +

                      Calling Cluster.shutdown()

                      +

                      In order to fix some issues around garbage collection and unclean interpreter +shutdowns, version 2.0 of the driver requires you to call Cluster.shutdown() +on your Cluster objects when you are through with them. +This helps to guarantee a clean shutdown.

                      +
                      +
                      +

                      Deprecations

                      +

                      The following functions have moved from cassandra.decoder to cassandra.query. +The original functions have been left in place with a DeprecationWarning for +now:

                      + +
                      +
                      +

                      Dependency Changes

                      +

                      The following dependencies have officially been made optional:

                      +
                        +
                      • scales

                      • +
                      • blist

                      • +
                      +

                      And one new dependency has been added (to enable Python 3 support):

                      +
                        +
                      • six

                      • +
                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/stable/user-defined-types.html b/stable/user-defined-types.html new file mode 100644 index 0000000000..f2803292ef --- /dev/null +++ b/stable/user-defined-types.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + User Defined Types | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + + + +
                      + +
                      + +
                      +

                      User Defined Types

                      +

                      Cassandra 2.1 introduced user-defined types (UDTs). You can create a +new type through CREATE TYPE statements in CQL:

                      +
                      CREATE TYPE address (street text, zip int);
                      +
                      +
                      +

                      Version 2.1 of the Python driver adds support for user-defined types.

                      +
                      +

                      Registering a UDT

                      +

                      You can tell the Python driver to return columns of a specific UDT as +instances of a class or a dict by registering them with your Cluster +instance through Cluster.register_user_type():

                      +
                      +

                      Map a Class to a UDT

                      +
                      cluster = Cluster(protocol_version=3)
                      +session = cluster.connect()
                      +session.set_keyspace('mykeyspace')
                      +session.execute("CREATE TYPE address (street text, zipcode int)")
                      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                      +
                      +# create a class to map to the "address" UDT
                      +class Address(object):
                      +
                      +    def __init__(self, street, zipcode):
                      +        self.street = street
                      +        self.zipcode = zipcode
                      +
                      +cluster.register_user_type('mykeyspace', 'address', Address)
                      +
                      +# insert a row using an instance of Address
                      +session.execute("INSERT INTO users (id, location) VALUES (%s, %s)",
                      +                (0, Address("123 Main St.", 78723)))
                      +
                      +# results will include Address instances
                      +results = session.execute("SELECT * FROM users")
                      +row = results[0]
                      +print(row.id, row.location.street, row.location.zipcode)
                      +
                      +
                      +
                      +
                      +

                      Map a dict to a UDT

                      +
                      cluster = Cluster(protocol_version=3)
                      +session = cluster.connect()
                      +session.set_keyspace('mykeyspace')
                      +session.execute("CREATE TYPE address (street text, zipcode int)")
                      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                      +
                      +cluster.register_user_type('mykeyspace', 'address', dict)
                      +
                      +# insert a row using a prepared statement and a tuple
                      +insert_statement = session.prepare("INSERT INTO mykeyspace.users (id, location) VALUES (?, ?)")
                      +session.execute(insert_statement, [0, ("123 Main St.", 78723)])
                      +
                      +# results will include dict instances
                      +results = session.execute("SELECT * FROM users")
                      +row = results[0]
                      +print(row.id, row.location['street'], row.location['zipcode'])
                      +
                      +
                      +
                      +
                      +
                      +

                      Using UDTs Without Registering Them

                      +

                      Although it is recommended to register your types with +Cluster.register_user_type(), the driver gives you some options +for working with unregistered UDTS.

                      +

                      When you use prepared statements, the driver knows what data types to +expect for each placeholder. This allows you to pass any object you +want for a UDT, as long as it has attributes that match the field names +for the UDT:

                      +
                      cluster = Cluster(protocol_version=3)
                      +session = cluster.connect()
                      +session.set_keyspace('mykeyspace')
                      +session.execute("CREATE TYPE address (street text, zipcode int)")
                      +session.execute("CREATE TABLE users (id int PRIMARY KEY, location frozen<address>)")
                      +
                      +class Foo(object):
                      +
                      +    def __init__(self, street, zipcode, otherstuff):
                      +        self.street = street
                      +        self.zipcode = zipcode
                      +        self.otherstuff = otherstuff
                      +
                      +insert_statement = session.prepare("INSERT INTO users (id, location) VALUES (?, ?)")
                      +
                      +# since we're using a prepared statement, we don't *have* to register
                      +# a class to map to the UDT to insert data.  The object just needs to have
                      +# "street" and "zipcode" attributes (which Foo does):
                      +session.execute(insert_statement, [0, Foo("123 Main St.", 78723, "some other stuff")])
                      +
                      +# when we query data, UDT columns that don't have a class registered
                      +# will be returned as namedtuples:
                      +results = session.execute("SELECT * FROM users")
                      +first_row = results[0]
                      +address = first_row.location
                      +print(address)  # prints "Address(street='123 Main St.', zipcode=78723)"
                      +street = address.street
                      +zipcode = address.street
                      +
                      +
                      +

                      As shown in the code example, inserting data for UDT columns without registering +a class works fine for prepared statements. However, you must register a +class to insert UDT columns with unprepared statements.* You can still query +UDT columns without registered classes using unprepared statements, they will +simply return namedtuple instances (just like prepared statements do).

                      +

                      * this applies to parameterized unprepared statements, in which the driver will be formatting parameters – not statements with interpolated UDT literals.

                      +
                      +
                      + + +
                      + + + + + + +
                      +

                      +ScyllaDB Python Driver is available under the Apache v2 License. +ScyllaDB Python Driver is a fork of DataStax Python Driver. +See Copyright here.

                      +
                      +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file